int SrsHttpConn::do_cycle() { int ret = ERROR_SUCCESS; if ((ret = get_peer_ip()) != ERROR_SUCCESS) { srs_error("get peer ip failed. ret=%d", ret); return ret; } srs_trace("http get peer ip success. ip=%s", ip); // initialize parser if ((ret = parser->initialize(HTTP_REQUEST)) != ERROR_SUCCESS) { srs_error("http 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 SrsHttpClient::post(SrsHttpUri* uri, string req, string& res) { res = ""; int ret = ERROR_SUCCESS; if (!parser) { parser = new SrsHttpParser(); if ((ret = parser->initialize(HTTP_RESPONSE)) != ERROR_SUCCESS) { srs_error("initialize parser failed. ret=%d", ret); return ret; } } if ((ret = connect(uri)) != ERROR_SUCCESS) { srs_error("http connect server failed. ret=%d", ret); return ret; } // send POST request to uri // POST %s HTTP/1.1\r\nHost: %s\r\nContent-Length: %d\r\n\r\n%s std::stringstream ss; ss << "POST " << uri->get_path() << " " << "HTTP/1.1" << __CRLF << "Host: " << uri->get_host() << __CRLF << "Connection: Keep-Alive" << __CRLF << "Content-Length: " << std::dec << req.length() << __CRLF << "User-Agent: " << RTMP_SIG_SRS_NAME << RTMP_SIG_SRS_VERSION << __CRLF << "Content-Type: text/html" << __CRLF << __CRLF << req; SrsSocket skt(stfd); std::string data = ss.str(); if ((ret = skt.write(data.c_str(), data.length(), NULL)) != ERROR_SUCCESS) { // disconnect when error. disconnect(); srs_error("write http post failed. ret=%d", ret); return ret; } SrsHttpMessage* msg = NULL; if ((ret = parser->parse_message(&skt, &msg)) != ERROR_SUCCESS) { srs_error("parse http post response failed. ret=%d", ret); return ret; } srs_assert(msg); srs_assert(msg->is_complete()); // get response body. if (msg->body_size() > 0) { res = msg->body(); } srs_info("parse http post response success."); return ret; }