-
Notifications
You must be signed in to change notification settings - Fork 3.2k
/
Copy pathswoole_static_handler.h
143 lines (118 loc) Β· 3.9 KB
/
swoole_static_handler.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/*
+----------------------------------------------------------------------+
| Swoole |
+----------------------------------------------------------------------+
| This source file is subject to version 2.0 of the Apache license, |
| that is bundled with this package in the file LICENSE, and is |
| available through the world-wide-web at the following url: |
| http://www.apache.org/licenses/LICENSE-2.0.html |
| If you did not receive a copy of the Apache2.0 license and are unable|
| to obtain it through the world-wide-web, please send a note to |
| [email protected] so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Author: Tianfeng Han <[email protected]> |
+----------------------------------------------------------------------+
*/
#pragma once
#include "swoole_server.h"
#include "swoole_http.h"
#include "swoole_mime_type.h"
#include <string>
#include <set>
namespace swoole {
namespace http_server {
class StaticHandler {
private:
Server *serv;
std::string request_url;
std::string dir_path;
std::set<std::string> dir_files;
std::string index_file;
typedef struct {
off_t offset;
size_t length;
char part_header[SW_HTTP_SERVER_PART_HEADER];
} task_t;
std::vector<task_t> tasks;
size_t l_filename = 0;
char filename[PATH_MAX];
struct stat file_stat;
bool last = false;
std::string content_type;
std::string boundary;
std::string end_part;
size_t content_length = 0;
public:
int status_code = SW_HTTP_OK;
StaticHandler(Server *_server, const char *url, size_t url_length) : request_url(url, url_length) {
serv = _server;
}
/**
* @return true: continue to execute backwards
* @return false: break static handler
*/
bool hit();
bool hit_index_file();
bool is_modified(const std::string &date_if_modified_since);
bool is_modified_range(const std::string &date_range);
size_t make_index_page(String *buffer);
bool get_dir_files();
bool set_filename(const std::string &filename);
bool has_index_file() {
return !index_file.empty();
}
bool is_enabled_auto_index() {
return serv->http_autoindex;
}
std::string get_date();
time_t get_file_mtime() {
#ifdef __MACH__
return file_stat.st_mtimespec.tv_sec;
#else
return file_stat.st_mtim.tv_sec;
#endif
}
std::string get_date_last_modified();
const char *get_filename() {
return filename;
}
const char *get_boundary() {
if (boundary.empty()) {
boundary = std::string(SW_HTTP_SERVER_BOUNDARY_PREKEY);
swoole_random_string(boundary, SW_HTTP_SERVER_BOUNDARY_TOTAL_SIZE - sizeof(SW_HTTP_SERVER_BOUNDARY_PREKEY));
}
return boundary.c_str();
}
const char *get_content_type() {
if (tasks.size() > 1) {
content_type = std::string("multipart/byteranges; boundary=") + get_boundary();
return content_type.c_str();
} else {
return get_mimetype();
}
}
const char *get_mimetype() {
return swoole::mime_type::get(get_filename()).c_str();
}
std::string get_filename_std_string() {
return std::string(filename, l_filename);
}
size_t get_filesize() {
return file_stat.st_size;
}
const std::vector<task_t> &get_tasks() {
return tasks;
}
bool is_dir() {
return S_ISDIR(file_stat.st_mode);
}
size_t get_content_length() {
return content_length;
}
const char *get_end_part() {
return end_part.c_str();
}
void parse_range(const char *range, const char *if_range);
};
}; // namespace http_server
}; // namespace swoole