diff --git a/trunk/src/app/srs_app_http_api.cpp b/trunk/src/app/srs_app_http_api.cpp index a58770b77..ef66725bf 100644 --- a/trunk/src/app/srs_app_http_api.cpp +++ b/trunk/src/app/srs_app_http_api.cpp @@ -25,16 +25,24 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #ifdef SRS_HTTP_API +#include +using namespace std; + #include #include +#include +#include +#include SrsHttpApi::SrsHttpApi(SrsServer* srs_server, st_netfd_t client_stfd) : SrsConnection(srs_server, client_stfd) { + parser = new SrsHttpParser(); } SrsHttpApi::~SrsHttpApi() { + srs_freep(parser); } int SrsHttpApi::do_cycle() @@ -47,6 +55,73 @@ int SrsHttpApi::do_cycle() } srs_trace("api get peer ip success. ip=%s", ip); + // initialize parser + if ((ret = parser->initialize(HTTP_REQUEST)) != ERROR_SUCCESS) { + srs_error("api initialize http parser failed. ret=%d", ret); + return ret; + } + + // underlayer socket + SrsSocket skt(stfd); + + // process http messages. + for (;;) { + SrsHttpMessage* req = NULL; + + // get a http message + if ((ret = parser->parse_message(&skt, &req)) != ERROR_SUCCESS) { + return ret; + } + + // if SUCCESS, always NOT-NULL and completed message. + srs_assert(req); + srs_assert(req->is_complete()); + + // always free it in this scope. + SrsAutoFree(SrsHttpMessage, req, false); + + // ok, handle http request. + if ((ret = process_request(&skt, req)) != ERROR_SUCCESS) { + return ret; + } + } + + return ret; +} + +int SrsHttpApi::process_request(SrsSocket* skt, SrsHttpMessage* req) +{ + int ret = ERROR_SUCCESS; + + if (req->method() == HTTP_OPTIONS) { + char data[] = "HTTP/1.1 200 OK" __CRLF + "Content-Length: 0"__CRLF + "Server: SRS/"RTMP_SIG_SRS_VERSION""__CRLF + "Allow: DELETE, GET, HEAD, OPTIONS, POST, PUT"__CRLF + "Access-Control-Allow-Origin: *"__CRLF + "Access-Control-Allow-Methods: GET, POST, HEAD, PUT, DELETE"__CRLF + "Access-Control-Allow-Headers: Cache-Control,X-Proxy-Authorization,X-Requested-With,Content-Type"__CRLF + "Content-Type: text/html;charset=utf-8"__CRLFCRLF + ""; + return skt->write(data, sizeof(data), NULL); + } else { + std::string tilte = "SRS/"RTMP_SIG_SRS_VERSION; + tilte += " hello http/1.1 api~\n"; + + std::stringstream ss; + ss << "HTTP/1.1 200 OK " << __CRLF + << "Content-Length: "<< tilte.length() + req->body_size() << __CRLF + << "Server: SRS/"RTMP_SIG_SRS_VERSION"" << __CRLF + << "Allow: DELETE, GET, HEAD, OPTIONS, POST, PUT" << __CRLF + << "Access-Control-Allow-Origin: *" << __CRLF + << "Access-Control-Allow-Methods: GET, POST, HEAD, PUT, DELETE" << __CRLF + << "Access-Control-Allow-Headers: Cache-Control,X-Proxy-Authorization,X-Requested-With,Content-Type" << __CRLF + << "Content-Type: text/html;charset=utf-8" << __CRLFCRLF + << tilte << req->body().c_str() + << ""; + return skt->write(ss.str().c_str(), ss.str().length(), NULL); + } + return ret; } diff --git a/trunk/src/app/srs_app_http_api.hpp b/trunk/src/app/srs_app_http_api.hpp index ab4034e15..771b29b0d 100644 --- a/trunk/src/app/srs_app_http_api.hpp +++ b/trunk/src/app/srs_app_http_api.hpp @@ -32,16 +32,24 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #ifdef SRS_HTTP_API +class SrsSocket; +class SrsHttpMessage; +class SrsHttpParser; + #include #include class SrsHttpApi : public SrsConnection { +private: + SrsHttpParser* parser; public: SrsHttpApi(SrsServer* srs_server, st_netfd_t client_stfd); virtual ~SrsHttpApi(); protected: virtual int do_cycle(); +private: + virtual int process_request(SrsSocket* skt, SrsHttpMessage* req); }; #endif diff --git a/trunk/src/app/srs_app_http_conn.cpp b/trunk/src/app/srs_app_http_conn.cpp index 5a6ab0cb7..5f26a1a71 100644 --- a/trunk/src/app/srs_app_http_conn.cpp +++ b/trunk/src/app/srs_app_http_conn.cpp @@ -60,7 +60,7 @@ int SrsHttpConn::do_cycle() // initialize parser if ((ret = parser->initialize(HTTP_REQUEST)) != ERROR_SUCCESS) { - srs_error("initialize http parser failed. ret=%d", ret); + srs_error("http initialize http parser failed. ret=%d", ret); return ret; } @@ -109,7 +109,7 @@ int SrsHttpConn::process_request(SrsSocket* skt, SrsHttpMessage* req) return skt->write(data, sizeof(data), NULL); } else { std::string tilte = "SRS/"RTMP_SIG_SRS_VERSION; - tilte += " hello http/1.1~\n"; + tilte += " hello http/1.1 server~\n"; std::stringstream ss; ss << "HTTP/1.1 200 OK " << __CRLF