int http_client::read_request_body(char* buf, size_t size) { if (hdr_req_ == NULL) { logger_error("request header not get yet"); return (-1); } if (stream_ == NULL) { logger_error("not connected yet"); return (-1); } ACL_VSTREAM* vstream = stream_->get_vstream(); if (vstream == NULL) { logger_error("client stream null"); return (-1); } if (req_ == NULL) req_ = http_req_new(hdr_req_); // 缓冲区太大了没有任何意义 if (size >= 1024000) size = 1024000; http_off_t ret = http_req_body_get_sync(req_, vstream, buf, (int) size); if (ret <= 0) body_finish_ = true; return ((int) ret); }
int http_client::read_request_body(string& out, bool clean, int* real_size) { if (real_size) *real_size = 0; if (body_finish_) return last_ret_; if (stream_ == NULL) { logger_error("client null"); disconnected_ = true; return -1; } ACL_VSTREAM* vstream = stream_->get_vstream(); if (vstream == NULL) { logger_error("client stream null"); disconnected_ = true; return -1; } if (hdr_req_ == NULL) { logger_error("request header not get yet"); disconnected_ = true; return -1; } if (req_ == NULL) req_ = http_req_new(hdr_req_); if (clean) out.clear(); char buf[8192]; int ret = (int) http_req_body_get_sync(req_, vstream, buf, sizeof(buf)); if (ret > 0) { out.append(buf, ret); if (real_size) *real_size = ret; } else { body_finish_ = true; // 表示数据已经读完 if (ret < 0) disconnected_ = true; last_ret_ = ret; } return ret; }
static void thread_run(void *arg) { CONN *conn = (CONN*) arg; ACL_VSTREAM *client = conn->stream; const char *reply_200 = "HTTP/1.1 200 OK\r\n" "Server: nginx/0.6.32\r\n" "Date: Tue, 29 Dec 2009 02:18:25 GMT\r\n" "Content-Type: text/html\r\n" "Content-Length: 43\r\n" "Last-Modified: Mon, 16 Nov 2009 02:18:14 GMT\r\n" "Connection: keep-alive\r\n" "Accept-Ranges: bytes\r\n\r\n" "<html>\n" "<body>\n" "hello world!\n" "</body>\n" "</html>\n"; int ret, keep_alive; char buf[4096]; while (0) { ret = read(ACL_VSTREAM_SOCK(client), buf, sizeof(buf)); if (ret == ACL_VSTREAM_EOF) break; ret = acl_vstream_writen(client, reply_200, strlen(reply_200)); if (ret == ACL_VSTREAM_EOF) break; } while (0) { ret = acl_vstream_read(client, buf, sizeof(buf)); if (ret == ACL_VSTREAM_EOF) break; ret = acl_vstream_writen(client, reply_200, strlen(reply_200)); if (ret == ACL_VSTREAM_EOF) break; } while (0) { /* HTTP_REQ *req; */ HTTP_HDR_REQ *hdr_req = http_hdr_req_new(); ret = http_hdr_req_get_sync(hdr_req, client, 300); if (ret < 0) { http_hdr_req_free(hdr_req); break; } if (http_hdr_req_parse(hdr_req) < 0) { http_hdr_req_free(hdr_req); printf("parse error\n"); break; } /* keep_alive = hdr_req->hdr.keep_alive; if (hdr_req->hdr.content_length > 0) { req = http_req_new(hdr_req); ret = (int) http_req_body_get_sync(req, client, buf, sizeof(buf)); if (ret < 0) { http_req_free(req); break; } http_req_free(req); } else { http_hdr_req_free(hdr_req); } */ http_hdr_req_free(hdr_req); ret = acl_vstream_writen(client, reply_200, strlen(reply_200)); if (ret == ACL_VSTREAM_EOF) { break; } /* if (!keep_alive) break; */ } while (1) { HTTP_REQ *req; HTTP_HDR_REQ *hdr_req = http_hdr_req_new(); ret = http_hdr_req_get_sync(hdr_req, client, 0); if (ret < 0) { http_hdr_req_free(hdr_req); break; } if (http_hdr_req_parse(hdr_req) < 0) { http_hdr_req_free(hdr_req); printf("parse error\n"); break; } keep_alive = hdr_req->hdr.keep_alive; if (hdr_req->hdr.content_length > 0) { req = http_req_new(hdr_req); ret = (int) http_req_body_get_sync(req, client, buf, sizeof(buf)); if (ret < 0) { http_req_free(req); break; } http_req_free(req); } else { http_hdr_req_free(hdr_req); } ret = acl_vstream_writen(client, reply_200, strlen(reply_200)); if (ret == ACL_VSTREAM_EOF) { break; } if (!keep_alive) break; } acl_vstream_close(client); acl_myfree(conn); printf("thread(%ld) exit\n", (long) acl_pthread_self()); }