正在显示
4 个修改的文件
包含
58 行增加
和
18 行删除
| @@ -84,6 +84,7 @@ bool SrsHttpHandler::can_handle(const char* /*path*/, int /*length*/, const char | @@ -84,6 +84,7 @@ bool SrsHttpHandler::can_handle(const char* /*path*/, int /*length*/, const char | ||
| 84 | int SrsHttpHandler::process_request(SrsSocket* skt, SrsHttpMessage* req) | 84 | int SrsHttpHandler::process_request(SrsSocket* skt, SrsHttpMessage* req) |
| 85 | { | 85 | { |
| 86 | if (req->method() == HTTP_OPTIONS) { | 86 | if (req->method() == HTTP_OPTIONS) { |
| 87 | + req->set_requires_crossdomain(true); | ||
| 87 | return res_options(skt); | 88 | return res_options(skt); |
| 88 | } | 89 | } |
| 89 | 90 | ||
| @@ -101,7 +102,7 @@ int SrsHttpHandler::process_request(SrsSocket* skt, SrsHttpMessage* req) | @@ -101,7 +102,7 @@ int SrsHttpHandler::process_request(SrsSocket* skt, SrsHttpMessage* req) | ||
| 101 | << JOBJECT_END | 102 | << JOBJECT_END |
| 102 | << JOBJECT_END; | 103 | << JOBJECT_END; |
| 103 | 104 | ||
| 104 | - return res_error(skt, status_code, reason_phrase, ss.str()); | 105 | + return res_error(skt, req, status_code, reason_phrase, ss.str()); |
| 105 | } | 106 | } |
| 106 | 107 | ||
| 107 | return do_process_request(skt, req); | 108 | return do_process_request(skt, req); |
| @@ -266,37 +267,52 @@ int SrsHttpHandler::res_options(SrsSocket* skt) | @@ -266,37 +267,52 @@ int SrsHttpHandler::res_options(SrsSocket* skt) | ||
| 266 | return res_flush(skt, ss); | 267 | return res_flush(skt, ss); |
| 267 | } | 268 | } |
| 268 | 269 | ||
| 269 | -int SrsHttpHandler::res_text(SrsSocket* skt, std::string body) | 270 | +int SrsHttpHandler::res_text(SrsSocket* skt, SrsHttpMessage* req, std::string body) |
| 270 | { | 271 | { |
| 271 | std::stringstream ss; | 272 | std::stringstream ss; |
| 272 | 273 | ||
| 273 | res_status_line(ss)->res_content_type(ss) | 274 | res_status_line(ss)->res_content_type(ss) |
| 274 | - ->res_content_length(ss, (int)body.length())->res_enable_crossdomain(ss) | ||
| 275 | - ->res_header_eof(ss) | 275 | + ->res_content_length(ss, (int)body.length()); |
| 276 | + | ||
| 277 | + if (req->requires_crossdomain()) { | ||
| 278 | + res_enable_crossdomain(ss); | ||
| 279 | + } | ||
| 280 | + | ||
| 281 | + res_header_eof(ss) | ||
| 276 | ->res_body(ss, body); | 282 | ->res_body(ss, body); |
| 277 | 283 | ||
| 278 | return res_flush(skt, ss); | 284 | return res_flush(skt, ss); |
| 279 | } | 285 | } |
| 280 | 286 | ||
| 281 | -int SrsHttpHandler::res_json(SrsSocket* skt, std::string json) | 287 | +int SrsHttpHandler::res_json(SrsSocket* skt, SrsHttpMessage* req, std::string json) |
| 282 | { | 288 | { |
| 283 | std::stringstream ss; | 289 | std::stringstream ss; |
| 284 | 290 | ||
| 285 | res_status_line(ss)->res_content_type_json(ss) | 291 | res_status_line(ss)->res_content_type_json(ss) |
| 286 | - ->res_content_length(ss, (int)json.length())->res_enable_crossdomain(ss) | ||
| 287 | - ->res_header_eof(ss) | 292 | + ->res_content_length(ss, (int)json.length()); |
| 293 | + | ||
| 294 | + if (req->requires_crossdomain()) { | ||
| 295 | + res_enable_crossdomain(ss); | ||
| 296 | + } | ||
| 297 | + | ||
| 298 | + res_header_eof(ss) | ||
| 288 | ->res_body(ss, json); | 299 | ->res_body(ss, json); |
| 289 | 300 | ||
| 290 | return res_flush(skt, ss); | 301 | return res_flush(skt, ss); |
| 291 | } | 302 | } |
| 292 | 303 | ||
| 293 | -int SrsHttpHandler::res_error(SrsSocket* skt, int code, std::string reason_phrase, std::string body) | 304 | +int SrsHttpHandler::res_error(SrsSocket* skt, SrsHttpMessage* req, int code, std::string reason_phrase, std::string body) |
| 294 | { | 305 | { |
| 295 | std::stringstream ss; | 306 | std::stringstream ss; |
| 296 | 307 | ||
| 297 | res_status_line_error(ss, code, reason_phrase)->res_content_type_json(ss) | 308 | res_status_line_error(ss, code, reason_phrase)->res_content_type_json(ss) |
| 298 | - ->res_content_length(ss, (int)body.length())->res_enable_crossdomain(ss) | ||
| 299 | - ->res_header_eof(ss) | 309 | + ->res_content_length(ss, (int)body.length()); |
| 310 | + | ||
| 311 | + if (req->requires_crossdomain()) { | ||
| 312 | + res_enable_crossdomain(ss); | ||
| 313 | + } | ||
| 314 | + | ||
| 315 | + res_header_eof(ss) | ||
| 300 | ->res_body(ss, body); | 316 | ->res_body(ss, body); |
| 301 | 317 | ||
| 302 | return res_flush(skt, ss); | 318 | return res_flush(skt, ss); |
| @@ -319,6 +335,7 @@ SrsHttpMessage::SrsHttpMessage() | @@ -319,6 +335,7 @@ SrsHttpMessage::SrsHttpMessage() | ||
| 319 | _state = SrsHttpParseStateInit; | 335 | _state = SrsHttpParseStateInit; |
| 320 | _uri = new SrsHttpUri(); | 336 | _uri = new SrsHttpUri(); |
| 321 | _match = NULL; | 337 | _match = NULL; |
| 338 | + _requires_crossdomain = false; | ||
| 322 | } | 339 | } |
| 323 | 340 | ||
| 324 | SrsHttpMessage::~SrsHttpMessage() | 341 | SrsHttpMessage::~SrsHttpMessage() |
| @@ -404,6 +421,11 @@ SrsHttpHandlerMatch* SrsHttpMessage::match() | @@ -404,6 +421,11 @@ SrsHttpHandlerMatch* SrsHttpMessage::match() | ||
| 404 | return _match; | 421 | return _match; |
| 405 | } | 422 | } |
| 406 | 423 | ||
| 424 | +bool SrsHttpMessage::requires_crossdomain() | ||
| 425 | +{ | ||
| 426 | + return _requires_crossdomain; | ||
| 427 | +} | ||
| 428 | + | ||
| 407 | void SrsHttpMessage::set_url(std::string url) | 429 | void SrsHttpMessage::set_url(std::string url) |
| 408 | { | 430 | { |
| 409 | _url = url; | 431 | _url = url; |
| @@ -425,6 +447,11 @@ void SrsHttpMessage::set_match(SrsHttpHandlerMatch* match) | @@ -425,6 +447,11 @@ void SrsHttpMessage::set_match(SrsHttpHandlerMatch* match) | ||
| 425 | _match = match; | 447 | _match = match; |
| 426 | } | 448 | } |
| 427 | 449 | ||
| 450 | +void SrsHttpMessage::set_requires_crossdomain(bool requires_crossdomain) | ||
| 451 | +{ | ||
| 452 | + _requires_crossdomain = requires_crossdomain; | ||
| 453 | +} | ||
| 454 | + | ||
| 428 | void SrsHttpMessage::append_body(const char* body, int length) | 455 | void SrsHttpMessage::append_body(const char* body, int length) |
| 429 | { | 456 | { |
| 430 | _body->append(body, length); | 457 | _body->append(body, length); |
| @@ -236,9 +236,9 @@ public: | @@ -236,9 +236,9 @@ public: | ||
| 236 | virtual int res_flush(SrsSocket* skt, std::stringstream& ss); | 236 | virtual int res_flush(SrsSocket* skt, std::stringstream& ss); |
| 237 | public: | 237 | public: |
| 238 | virtual int res_options(SrsSocket* skt); | 238 | virtual int res_options(SrsSocket* skt); |
| 239 | - virtual int res_text(SrsSocket* skt, std::string body); | ||
| 240 | - virtual int res_json(SrsSocket* skt, std::string json); | ||
| 241 | - virtual int res_error(SrsSocket* skt, int code, std::string reason_phrase, std::string body); | 239 | + virtual int res_text(SrsSocket* skt, SrsHttpMessage* req, std::string body); |
| 240 | + virtual int res_json(SrsSocket* skt, SrsHttpMessage* req, std::string json); | ||
| 241 | + virtual int res_error(SrsSocket* skt, SrsHttpMessage* req, int code, std::string reason_phrase, std::string body); | ||
| 242 | // object creator | 242 | // object creator |
| 243 | public: | 243 | public: |
| 244 | /** | 244 | /** |
| @@ -283,6 +283,10 @@ private: | @@ -283,6 +283,10 @@ private: | ||
| 283 | * best matched handler. | 283 | * best matched handler. |
| 284 | */ | 284 | */ |
| 285 | SrsHttpHandlerMatch* _match; | 285 | SrsHttpHandlerMatch* _match; |
| 286 | + /** | ||
| 287 | + * whether the message requires crossdomain. | ||
| 288 | + */ | ||
| 289 | + bool _requires_crossdomain; | ||
| 286 | public: | 290 | public: |
| 287 | SrsHttpMessage(); | 291 | SrsHttpMessage(); |
| 288 | virtual ~SrsHttpMessage(); | 292 | virtual ~SrsHttpMessage(); |
| @@ -299,10 +303,12 @@ public: | @@ -299,10 +303,12 @@ public: | ||
| 299 | virtual int64_t body_size(); | 303 | virtual int64_t body_size(); |
| 300 | virtual int64_t content_length(); | 304 | virtual int64_t content_length(); |
| 301 | virtual SrsHttpHandlerMatch* match(); | 305 | virtual SrsHttpHandlerMatch* match(); |
| 306 | + virtual bool requires_crossdomain(); | ||
| 302 | virtual void set_url(std::string url); | 307 | virtual void set_url(std::string url); |
| 303 | virtual void set_state(SrsHttpParseState state); | 308 | virtual void set_state(SrsHttpParseState state); |
| 304 | virtual void set_header(http_parser* header); | 309 | virtual void set_header(http_parser* header); |
| 305 | virtual void set_match(SrsHttpHandlerMatch* match); | 310 | virtual void set_match(SrsHttpHandlerMatch* match); |
| 311 | + virtual void set_requires_crossdomain(bool requires_crossdomain); | ||
| 306 | virtual void append_body(const char* body, int length); | 312 | virtual void append_body(const char* body, int length); |
| 307 | }; | 313 | }; |
| 308 | 314 |
| @@ -80,7 +80,7 @@ int SrsApiRoot::do_process_request(SrsSocket* skt, SrsHttpMessage* req) | @@ -80,7 +80,7 @@ int SrsApiRoot::do_process_request(SrsSocket* skt, SrsHttpMessage* req) | ||
| 80 | << JOBJECT_END | 80 | << JOBJECT_END |
| 81 | << JOBJECT_END; | 81 | << JOBJECT_END; |
| 82 | 82 | ||
| 83 | - return res_json(skt, ss.str()); | 83 | + return res_json(skt, req, ss.str()); |
| 84 | } | 84 | } |
| 85 | 85 | ||
| 86 | SrsApiApi::SrsApiApi() | 86 | SrsApiApi::SrsApiApi() |
| @@ -108,7 +108,7 @@ int SrsApiApi::do_process_request(SrsSocket* skt, SrsHttpMessage* req) | @@ -108,7 +108,7 @@ int SrsApiApi::do_process_request(SrsSocket* skt, SrsHttpMessage* req) | ||
| 108 | << JOBJECT_END | 108 | << JOBJECT_END |
| 109 | << JOBJECT_END; | 109 | << JOBJECT_END; |
| 110 | 110 | ||
| 111 | - return res_json(skt, ss.str()); | 111 | + return res_json(skt, req, ss.str()); |
| 112 | } | 112 | } |
| 113 | 113 | ||
| 114 | SrsApiV1::SrsApiV1() | 114 | SrsApiV1::SrsApiV1() |
| @@ -138,7 +138,7 @@ int SrsApiV1::do_process_request(SrsSocket* skt, SrsHttpMessage* req) | @@ -138,7 +138,7 @@ int SrsApiV1::do_process_request(SrsSocket* skt, SrsHttpMessage* req) | ||
| 138 | << JOBJECT_END | 138 | << JOBJECT_END |
| 139 | << JOBJECT_END; | 139 | << JOBJECT_END; |
| 140 | 140 | ||
| 141 | - return res_json(skt, ss.str()); | 141 | + return res_json(skt, req, ss.str()); |
| 142 | } | 142 | } |
| 143 | 143 | ||
| 144 | SrsApiVersion::SrsApiVersion() | 144 | SrsApiVersion::SrsApiVersion() |
| @@ -168,7 +168,7 @@ int SrsApiVersion::do_process_request(SrsSocket* skt, SrsHttpMessage* req) | @@ -168,7 +168,7 @@ int SrsApiVersion::do_process_request(SrsSocket* skt, SrsHttpMessage* req) | ||
| 168 | << JOBJECT_END | 168 | << JOBJECT_END |
| 169 | << JOBJECT_END; | 169 | << JOBJECT_END; |
| 170 | 170 | ||
| 171 | - return res_json(skt, ss.str()); | 171 | + return res_json(skt, req, ss.str()); |
| 172 | } | 172 | } |
| 173 | 173 | ||
| 174 | SrsApiAuthors::SrsApiAuthors() | 174 | SrsApiAuthors::SrsApiAuthors() |
| @@ -197,7 +197,7 @@ int SrsApiAuthors::do_process_request(SrsSocket* skt, SrsHttpMessage* req) | @@ -197,7 +197,7 @@ int SrsApiAuthors::do_process_request(SrsSocket* skt, SrsHttpMessage* req) | ||
| 197 | << JOBJECT_END | 197 | << JOBJECT_END |
| 198 | << JOBJECT_END; | 198 | << JOBJECT_END; |
| 199 | 199 | ||
| 200 | - return res_json(skt, ss.str()); | 200 | + return res_json(skt, req, ss.str()); |
| 201 | } | 201 | } |
| 202 | 202 | ||
| 203 | SrsHttpApi::SrsHttpApi(SrsServer* srs_server, st_netfd_t client_stfd, SrsHttpHandler* _handler) | 203 | SrsHttpApi::SrsHttpApi(SrsServer* srs_server, st_netfd_t client_stfd, SrsHttpHandler* _handler) |
| @@ -205,6 +205,7 @@ SrsHttpApi::SrsHttpApi(SrsServer* srs_server, st_netfd_t client_stfd, SrsHttpHan | @@ -205,6 +205,7 @@ SrsHttpApi::SrsHttpApi(SrsServer* srs_server, st_netfd_t client_stfd, SrsHttpHan | ||
| 205 | { | 205 | { |
| 206 | parser = new SrsHttpParser(); | 206 | parser = new SrsHttpParser(); |
| 207 | handler = _handler; | 207 | handler = _handler; |
| 208 | + requires_crossdomain = false; | ||
| 208 | } | 209 | } |
| 209 | 210 | ||
| 210 | SrsHttpApi::~SrsHttpApi() | 211 | SrsHttpApi::~SrsHttpApi() |
| @@ -284,6 +285,7 @@ int SrsHttpApi::process_request(SrsSocket* skt, SrsHttpMessage* req) | @@ -284,6 +285,7 @@ int SrsHttpApi::process_request(SrsSocket* skt, SrsHttpMessage* req) | ||
| 284 | srs_info("best match handler, matched_url=%s", p->matched_url.c_str()); | 285 | srs_info("best match handler, matched_url=%s", p->matched_url.c_str()); |
| 285 | 286 | ||
| 286 | req->set_match(p); | 287 | req->set_match(p); |
| 288 | + req->set_requires_crossdomain(requires_crossdomain); | ||
| 287 | 289 | ||
| 288 | // use handler to process request. | 290 | // use handler to process request. |
| 289 | if ((ret = p->handler->process_request(skt, req)) != ERROR_SUCCESS) { | 291 | if ((ret = p->handler->process_request(skt, req)) != ERROR_SUCCESS) { |
| @@ -291,6 +293,10 @@ int SrsHttpApi::process_request(SrsSocket* skt, SrsHttpMessage* req) | @@ -291,6 +293,10 @@ int SrsHttpApi::process_request(SrsSocket* skt, SrsHttpMessage* req) | ||
| 291 | return ret; | 293 | return ret; |
| 292 | } | 294 | } |
| 293 | 295 | ||
| 296 | + if (req->requires_crossdomain()) { | ||
| 297 | + requires_crossdomain = true; | ||
| 298 | + } | ||
| 299 | + | ||
| 294 | return ret; | 300 | return ret; |
| 295 | } | 301 | } |
| 296 | 302 |
| @@ -98,6 +98,7 @@ class SrsHttpApi : public SrsConnection | @@ -98,6 +98,7 @@ class SrsHttpApi : public SrsConnection | ||
| 98 | private: | 98 | private: |
| 99 | SrsHttpParser* parser; | 99 | SrsHttpParser* parser; |
| 100 | SrsHttpHandler* handler; | 100 | SrsHttpHandler* handler; |
| 101 | + bool requires_crossdomain; | ||
| 101 | public: | 102 | public: |
| 102 | SrsHttpApi(SrsServer* srs_server, st_netfd_t client_stfd, SrsHttpHandler* _handler); | 103 | SrsHttpApi(SrsServer* srs_server, st_netfd_t client_stfd, SrsHttpHandler* _handler); |
| 103 | virtual ~SrsHttpApi(); | 104 | virtual ~SrsHttpApi(); |
-
请 注册 或 登录 后发表评论