正在显示
4 个修改的文件
包含
143 行增加
和
41 行删除
| @@ -59,7 +59,7 @@ int SrsHttpHandler::initialize() | @@ -59,7 +59,7 @@ int SrsHttpHandler::initialize() | ||
| 59 | return ret; | 59 | return ret; |
| 60 | } | 60 | } |
| 61 | 61 | ||
| 62 | -bool SrsHttpHandler::can_handle(const char* /*path*/, int /*length*/) | 62 | +bool SrsHttpHandler::can_handle(const char* /*path*/, int /*length*/, const char** /*pnext_path*/) |
| 63 | { | 63 | { |
| 64 | return false; | 64 | return false; |
| 65 | } | 65 | } |
| @@ -86,20 +86,23 @@ int SrsHttpHandler::best_match(const char* path, int length, SrsHttpHandler** ph | @@ -86,20 +86,23 @@ int SrsHttpHandler::best_match(const char* path, int length, SrsHttpHandler** ph | ||
| 86 | } | 86 | } |
| 87 | 87 | ||
| 88 | // whether the handler can handler the node. | 88 | // whether the handler can handler the node. |
| 89 | - int node_size = p - path; | ||
| 90 | - if (!can_handle(path, node_size)) { | 89 | + const char* pnext = p; |
| 90 | + if (!can_handle(path, p - path, &pnext)) { | ||
| 91 | break; | 91 | break; |
| 92 | } | 92 | } |
| 93 | 93 | ||
| 94 | + // save current handler, it's ok for current handler atleast. | ||
| 94 | *phandler = this; | 95 | *phandler = this; |
| 95 | *pstart = path; | 96 | *pstart = path; |
| 96 | - *plength = node_size; | 97 | + *plength = p - path; |
| 97 | 98 | ||
| 99 | + // find the best matched child handler. | ||
| 98 | std::vector<SrsHttpHandler*>::iterator it; | 100 | std::vector<SrsHttpHandler*>::iterator it; |
| 99 | for (it = handlers.begin(); it != handlers.end(); ++it) { | 101 | for (it = handlers.begin(); it != handlers.end(); ++it) { |
| 100 | SrsHttpHandler* handler = *it; | 102 | SrsHttpHandler* handler = *it; |
| 101 | - // matched, donot search. | ||
| 102 | - if (handler->best_match(p, length - node_size, phandler, pstart, plength) == ERROR_SUCCESS) { | 103 | + |
| 104 | + // matched, donot search more. | ||
| 105 | + if (handler->best_match(pnext, length - (pnext - path), phandler, pstart, plength) == ERROR_SUCCESS) { | ||
| 103 | break; | 106 | break; |
| 104 | } | 107 | } |
| 105 | } | 108 | } |
| @@ -116,6 +119,76 @@ int SrsHttpHandler::best_match(const char* path, int length, SrsHttpHandler** ph | @@ -116,6 +119,76 @@ int SrsHttpHandler::best_match(const char* path, int length, SrsHttpHandler** ph | ||
| 116 | return ret; | 119 | return ret; |
| 117 | } | 120 | } |
| 118 | 121 | ||
| 122 | +SrsHttpHandler* SrsHttpHandler::res_status_line(std::stringstream& ss) | ||
| 123 | +{ | ||
| 124 | + ss << "HTTP/1.1 200 OK " << __CRLF | ||
| 125 | + << "Server: SRS/"RTMP_SIG_SRS_VERSION"" << __CRLF; | ||
| 126 | + return this; | ||
| 127 | +} | ||
| 128 | + | ||
| 129 | +SrsHttpHandler* SrsHttpHandler::res_content_type(std::stringstream& ss) | ||
| 130 | +{ | ||
| 131 | + ss << "Content-Type: text/html;charset=utf-8" << __CRLF | ||
| 132 | + << "Allow: DELETE, GET, HEAD, OPTIONS, POST, PUT" << __CRLF; | ||
| 133 | + return this; | ||
| 134 | +} | ||
| 135 | + | ||
| 136 | +SrsHttpHandler* SrsHttpHandler::res_content_length(std::stringstream& ss, int64_t length) | ||
| 137 | +{ | ||
| 138 | + ss << "Content-Length: "<< length << __CRLF; | ||
| 139 | + return this; | ||
| 140 | +} | ||
| 141 | + | ||
| 142 | +SrsHttpHandler* SrsHttpHandler::res_enable_crossdomain(std::stringstream& ss) | ||
| 143 | +{ | ||
| 144 | + ss << "Access-Control-Allow-Origin: *" << __CRLF | ||
| 145 | + << "Access-Control-Allow-Methods: " | ||
| 146 | + << "GET, POST, HEAD, PUT, DELETE" << __CRLF | ||
| 147 | + << "Access-Control-Allow-Headers: " | ||
| 148 | + << "Cache-Control,X-Proxy-Authorization,X-Requested-With,Content-Type" << __CRLF; | ||
| 149 | + return this; | ||
| 150 | +} | ||
| 151 | + | ||
| 152 | +SrsHttpHandler* SrsHttpHandler::res_header_eof(std::stringstream& ss) | ||
| 153 | +{ | ||
| 154 | + ss << __CRLF; | ||
| 155 | + return this; | ||
| 156 | +} | ||
| 157 | + | ||
| 158 | +SrsHttpHandler* SrsHttpHandler::res_body(std::stringstream& ss, std::string body) | ||
| 159 | +{ | ||
| 160 | + ss << body; | ||
| 161 | + return this; | ||
| 162 | +} | ||
| 163 | + | ||
| 164 | +int SrsHttpHandler::res_flush(SrsSocket* skt, std::stringstream& ss) | ||
| 165 | +{ | ||
| 166 | + return skt->write(ss.str().c_str(), ss.str().length(), NULL); | ||
| 167 | +} | ||
| 168 | + | ||
| 169 | +int SrsHttpHandler::res_options(SrsSocket* skt) | ||
| 170 | +{ | ||
| 171 | + std::stringstream ss; | ||
| 172 | + | ||
| 173 | + res_status_line(ss)->res_content_type(ss) | ||
| 174 | + ->res_content_length(ss, 0)->res_enable_crossdomain(ss) | ||
| 175 | + ->res_header_eof(ss); | ||
| 176 | + | ||
| 177 | + return res_flush(skt, ss); | ||
| 178 | +} | ||
| 179 | + | ||
| 180 | +int SrsHttpHandler::res_text(SrsSocket* skt, std::string body) | ||
| 181 | +{ | ||
| 182 | + std::stringstream ss; | ||
| 183 | + | ||
| 184 | + res_status_line(ss)->res_content_type(ss) | ||
| 185 | + ->res_content_length(ss, (int)body.length())->res_enable_crossdomain(ss) | ||
| 186 | + ->res_header_eof(ss) | ||
| 187 | + ->res_body(ss, body); | ||
| 188 | + | ||
| 189 | + return res_flush(skt, ss); | ||
| 190 | +} | ||
| 191 | + | ||
| 119 | SrsHttpHandler* SrsHttpHandler::create_http_api() | 192 | SrsHttpHandler* SrsHttpHandler::create_http_api() |
| 120 | { | 193 | { |
| 121 | return new SrsApiRoot(); | 194 | return new SrsApiRoot(); |
| @@ -33,6 +33,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | @@ -33,6 +33,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||
| 33 | 33 | ||
| 34 | #include <string> | 34 | #include <string> |
| 35 | #include <vector> | 35 | #include <vector> |
| 36 | +#include <sstream> | ||
| 36 | 37 | ||
| 37 | #include <http_parser.h> | 38 | #include <http_parser.h> |
| 38 | 39 | ||
| @@ -89,8 +90,9 @@ public: | @@ -89,8 +90,9 @@ public: | ||
| 89 | virtual int initialize(); | 90 | virtual int initialize(); |
| 90 | /** | 91 | /** |
| 91 | * whether current handler can handle the specified path. | 92 | * whether current handler can handle the specified path. |
| 93 | + * @pnext_path set the next path, if needed. | ||
| 92 | */ | 94 | */ |
| 93 | - virtual bool can_handle(const char* path, int length); | 95 | + virtual bool can_handle(const char* path, int length, const char** pnext_path); |
| 94 | /** | 96 | /** |
| 95 | * use the handler to process the request. | 97 | * use the handler to process the request. |
| 96 | */ | 98 | */ |
| @@ -101,6 +103,17 @@ public: | @@ -101,6 +103,17 @@ public: | ||
| 101 | */ | 103 | */ |
| 102 | virtual int best_match(const char* path, int length, SrsHttpHandler** phandler, const char** pstart, int* plength); | 104 | virtual int best_match(const char* path, int length, SrsHttpHandler** phandler, const char** pstart, int* plength); |
| 103 | public: | 105 | public: |
| 106 | + virtual SrsHttpHandler* res_status_line(std::stringstream& ss); | ||
| 107 | + virtual SrsHttpHandler* res_content_type(std::stringstream& ss); | ||
| 108 | + virtual SrsHttpHandler* res_content_length(std::stringstream& ss, int64_t length); | ||
| 109 | + virtual SrsHttpHandler* res_enable_crossdomain(std::stringstream& ss); | ||
| 110 | + virtual SrsHttpHandler* res_header_eof(std::stringstream& ss); | ||
| 111 | + virtual SrsHttpHandler* res_body(std::stringstream& ss, std::string body); | ||
| 112 | + virtual int res_flush(SrsSocket* skt, std::stringstream& ss); | ||
| 113 | +public: | ||
| 114 | + virtual int res_options(SrsSocket* skt); | ||
| 115 | + virtual int res_text(SrsSocket* skt, std::string body); | ||
| 116 | +public: | ||
| 104 | /** | 117 | /** |
| 105 | * create http api resource handler. | 118 | * create http api resource handler. |
| 106 | */ | 119 | */ |
| @@ -36,21 +36,56 @@ using namespace std; | @@ -36,21 +36,56 @@ using namespace std; | ||
| 36 | 36 | ||
| 37 | SrsApiRoot::SrsApiRoot() | 37 | SrsApiRoot::SrsApiRoot() |
| 38 | { | 38 | { |
| 39 | + handlers.push_back(new SrsApiApi()); | ||
| 39 | } | 40 | } |
| 40 | 41 | ||
| 41 | SrsApiRoot::~SrsApiRoot() | 42 | SrsApiRoot::~SrsApiRoot() |
| 42 | { | 43 | { |
| 43 | } | 44 | } |
| 44 | 45 | ||
| 45 | -bool SrsApiRoot::can_handle(const char* /*path*/, int /*length*/) | 46 | +bool SrsApiRoot::can_handle(const char* path, int length, const char** pnext_path) |
| 46 | { | 47 | { |
| 48 | + // reset the next path for child to parse. | ||
| 49 | + *pnext_path = path; | ||
| 50 | + | ||
| 47 | return true; | 51 | return true; |
| 48 | } | 52 | } |
| 49 | 53 | ||
| 50 | -int SrsApiRoot::process_request(SrsSocket* /*skt*/, SrsHttpMessage* /*req*/, const char* /*path*/, int /*length*/) | 54 | +int SrsApiRoot::process_request(SrsSocket* skt, SrsHttpMessage* req, const char* /*path*/, int /*length*/) |
| 51 | { | 55 | { |
| 52 | - int ret = ERROR_SUCCESS; | ||
| 53 | - return ret; | 56 | + if (req->method() == HTTP_OPTIONS) { |
| 57 | + return res_options(skt); | ||
| 58 | + } else { | ||
| 59 | + std::string body = "hello, root"; | ||
| 60 | + return res_text(skt, body); | ||
| 61 | + } | ||
| 62 | + | ||
| 63 | + return ERROR_SUCCESS; | ||
| 64 | +} | ||
| 65 | + | ||
| 66 | +SrsApiApi::SrsApiApi() | ||
| 67 | +{ | ||
| 68 | +} | ||
| 69 | + | ||
| 70 | +SrsApiApi::~SrsApiApi() | ||
| 71 | +{ | ||
| 72 | +} | ||
| 73 | + | ||
| 74 | +bool SrsApiApi::can_handle(const char* path, int length, const char** /*pnext_path*/) | ||
| 75 | +{ | ||
| 76 | + return !memcmp("/api", path, length); | ||
| 77 | +} | ||
| 78 | + | ||
| 79 | +int SrsApiApi::process_request(SrsSocket* skt, SrsHttpMessage* req, const char* /*path*/, int /*length*/) | ||
| 80 | +{ | ||
| 81 | + if (req->method() == HTTP_OPTIONS) { | ||
| 82 | + return res_options(skt); | ||
| 83 | + } else { | ||
| 84 | + std::string body = "hello, api"; | ||
| 85 | + return res_text(skt, body); | ||
| 86 | + } | ||
| 87 | + | ||
| 88 | + return ERROR_SUCCESS; | ||
| 54 | } | 89 | } |
| 55 | 90 | ||
| 56 | SrsHttpApi::SrsHttpApi(SrsServer* srs_server, st_netfd_t client_stfd, SrsHttpHandler* _handler) | 91 | SrsHttpApi::SrsHttpApi(SrsServer* srs_server, st_netfd_t client_stfd, SrsHttpHandler* _handler) |
| @@ -135,35 +170,6 @@ int SrsHttpApi::process_request(SrsSocket* skt, SrsHttpMessage* req) | @@ -135,35 +170,6 @@ int SrsHttpApi::process_request(SrsSocket* skt, SrsHttpMessage* req) | ||
| 135 | return ret; | 170 | return ret; |
| 136 | } | 171 | } |
| 137 | 172 | ||
| 138 | - if (req->method() == HTTP_OPTIONS) { | ||
| 139 | - char data[] = "HTTP/1.1 200 OK" __CRLF | ||
| 140 | - "Content-Length: 0"__CRLF | ||
| 141 | - "Server: SRS/"RTMP_SIG_SRS_VERSION""__CRLF | ||
| 142 | - "Allow: DELETE, GET, HEAD, OPTIONS, POST, PUT"__CRLF | ||
| 143 | - "Access-Control-Allow-Origin: *"__CRLF | ||
| 144 | - "Access-Control-Allow-Methods: GET, POST, HEAD, PUT, DELETE"__CRLF | ||
| 145 | - "Access-Control-Allow-Headers: Cache-Control,X-Proxy-Authorization,X-Requested-With,Content-Type"__CRLF | ||
| 146 | - "Content-Type: text/html;charset=utf-8"__CRLFCRLF | ||
| 147 | - ""; | ||
| 148 | - return skt->write(data, sizeof(data), NULL); | ||
| 149 | - } else { | ||
| 150 | - std::string tilte = "SRS/"RTMP_SIG_SRS_VERSION; | ||
| 151 | - tilte += " hello http/1.1 api~\n"; | ||
| 152 | - | ||
| 153 | - std::stringstream ss; | ||
| 154 | - ss << "HTTP/1.1 200 OK " << __CRLF | ||
| 155 | - << "Content-Length: "<< tilte.length() + req->body_size() << __CRLF | ||
| 156 | - << "Server: SRS/"RTMP_SIG_SRS_VERSION"" << __CRLF | ||
| 157 | - << "Allow: DELETE, GET, HEAD, OPTIONS, POST, PUT" << __CRLF | ||
| 158 | - << "Access-Control-Allow-Origin: *" << __CRLF | ||
| 159 | - << "Access-Control-Allow-Methods: GET, POST, HEAD, PUT, DELETE" << __CRLF | ||
| 160 | - << "Access-Control-Allow-Headers: Cache-Control,X-Proxy-Authorization,X-Requested-With,Content-Type" << __CRLF | ||
| 161 | - << "Content-Type: text/html;charset=utf-8" << __CRLFCRLF | ||
| 162 | - << tilte << req->body().c_str() | ||
| 163 | - << ""; | ||
| 164 | - return skt->write(ss.str().c_str(), ss.str().length(), NULL); | ||
| 165 | - } | ||
| 166 | - | ||
| 167 | return ret; | 173 | return ret; |
| 168 | } | 174 | } |
| 169 | 175 |
| @@ -48,7 +48,17 @@ public: | @@ -48,7 +48,17 @@ public: | ||
| 48 | SrsApiRoot(); | 48 | SrsApiRoot(); |
| 49 | virtual ~SrsApiRoot(); | 49 | virtual ~SrsApiRoot(); |
| 50 | public: | 50 | public: |
| 51 | - virtual bool can_handle(const char* path, int length); | 51 | + virtual bool can_handle(const char* path, int length, const char** pnext_path); |
| 52 | + virtual int process_request(SrsSocket* skt, SrsHttpMessage* req, const char* path, int length); | ||
| 53 | +}; | ||
| 54 | + | ||
| 55 | +class SrsApiApi : public SrsHttpHandler | ||
| 56 | +{ | ||
| 57 | +public: | ||
| 58 | + SrsApiApi(); | ||
| 59 | + virtual ~SrsApiApi(); | ||
| 60 | +public: | ||
| 61 | + virtual bool can_handle(const char* path, int length, const char** pnext_path); | ||
| 52 | virtual int process_request(SrsSocket* skt, SrsHttpMessage* req, const char* path, int length); | 62 | virtual int process_request(SrsSocket* skt, SrsHttpMessage* req, const char* path, int length); |
| 53 | }; | 63 | }; |
| 54 | 64 |
-
请 注册 或 登录 后发表评论