bool logger_servlet::doPost(acl::HttpServletRequest& req, acl::HttpServletResponse&) { const char* uri = req.getRequestUri(); if (uri == NULL || *uri == 0) { logger_debug(DEBUG_HTTP, 1, "getRequestUri null"); return false; } const char* host = req.getRemoteHost(); if (host == NULL || *host == 0) { logger_debug(DEBUG_HTTP, 1, "no Host"); return false; } acl::string url; url.format("http://%s/%s", host, uri); logger("%s", url.c_str()); int n; char buf[8192]; acl::http_client* conn = req.getClient(); while (true) { n = conn->read_body(buf, sizeof(buf)); if (n < 0) return false; else if (n == 0) break; } return true; }
void http_servlet::logger_request(acl::HttpServletRequest& req) { acl::string req_hdr; acl::http_client* client = req.getClient(); client->sprint_header(req_hdr, NULL); out_.format("\r\n>>>request header<<<\r\n"); out_.write(req_hdr); out_.format("\r\n"); }
bool http_servlet::doPost(acl::HttpServletRequest& req, acl::HttpServletResponse& res) { handled_ = true; acl::http_client* conn = req.getClient(); conn->header_disable("Accept-Encoding"); logger_request(req); // 生成完整的 url,以备下面使用 const char* host = req.getRemoteHost(); const char* uri = req.getRequestUri(); if (host == NULL || *host == 0) host = req.getLocalAddr(); url_.format("http://%s%s", host, uri ? uri : "/"); out_.format(">>> request url: %s\r\n", url_.c_str()); https_client client(out_, client_ssl_conf_); return client.http_request(req, res); }
bool https_client::http_request(acl::HttpServletRequest& req, acl::HttpServletResponse& res) { const char* host = req.getRemoteHost(); if (host == NULL || *host == 0) host = req.getLocalAddr(); acl::string server_addr; if (ssl_conf_ == NULL) server_addr.format("%s:80", host); else server_addr.format("%s:443", host); std::auto_ptr<acl::http_client> backend(new acl::http_client); // 连接服务器 if (connect_server(server_addr, *backend) == false) return false; acl::http_client* front = req.getClient(); // 取得 HTTP 请求头数据 acl::string req_hdr; front->sprint_header(req_hdr, NULL); // 转发 HTTP 请求头至服务器 if (backend->get_ostream().write(req_hdr) == -1) { out_.puts(">>>>write header error"); return false; } if (backend->get_ostream().write("\r\n") == -1) { out_.puts(">>>>write CRLF error"); return false; } // 如果还有数据体,则转发请求的数据体给服务器 long long int len = req.getContentLength(); if (len > 0) { char req_body[8192]; int ret; while (true) { ret = front->read_body(req_body, sizeof(req_body) - 1); if (ret < 0) { out_.puts(">>> read req body error"); return false; } if (ret == 0) break; req_body[ret] = 0; out_.write(req_body, ret); if (backend->get_ostream().write(req_body, ret) == -1) { out_.puts(">>> write body to server error"); return false; } } } out_.puts(""); // 开始从后端服务器读取响应头和响应体数据 out_.puts(">>>> begin read res header<<<<<"); if (backend->read_head() == false) { out_.puts(">>>>>>>>read header error<<<<<<<<<<"); return false; } acl::string res_hdr; backend->sprint_header(res_hdr, NULL); if (res.getOutputStream().write(res_hdr) == -1) { out_.puts(">>>>>write res hdr error<<<<<<"); return false; } if (res.getOutputStream().write("\r\n") == -1) { out_.puts(">>>write CRLF error"); return false; } out_.puts("------------------res hdr----------------"); out_.write(res_hdr); out_.puts("------------------res hdr end------------"); char buf[8192]; while (true) { int ret = backend->read_body(buf, sizeof(buf) - 1); if (ret < 0) { logger_error(">>> read body error"); return false; } else if (ret == 0) break; buf[ret] = 0; out_.write(buf, ret); if (res.getOutputStream().write(buf, ret) == -1) { out_.puts(">>> write res body error"); return false; } } const char* ptr = backend->header_value("Transfer-Encoding"); if (ptr == NULL || *ptr == 0 || strcasecmp(ptr, "chunked") != 0) return backend->keep_alive(); // 发送 http 响应体,因为设置了 chunk 传输模式,所以需要多调用一次 // res.write 且两个参数均为 0 以表示 chunk 传输数据结束 return res.write(NULL, 0); }