X-Git-Url: http://git.openwrt.org/?a=blobdiff_plain;f=uclient-http.c;h=83eac58f1ea9e24fece60ac7ac259378c0893fa6;hb=63a984dbdf8a4d1249838e0708a4bed2dfaff476;hp=1ab1f4619c5dd52820b1e0b928be97ef2e2cf49b;hpb=299b1af9c051248771537980ee2d16c29c61376d;p=project%2Fuclient.git diff --git a/uclient-http.c b/uclient-http.c index 1ab1f46..83eac58 100644 --- a/uclient-http.c +++ b/uclient-http.c @@ -101,6 +101,7 @@ static const char * const uclient_http_prefix[] = { static int uclient_do_connect(struct uclient_http *uh, const char *port) { + socklen_t sl; int fd; if (uh->uc.url->port) @@ -111,6 +112,14 @@ static int uclient_do_connect(struct uclient_http *uh, const char *port) return -1; ustream_fd_init(&uh->ufd, fd); + + memset(&uh->uc.local_addr, 0, sizeof(uh->uc.local_addr)); + memset(&uh->uc.remote_addr, 0, sizeof(uh->uc.remote_addr)); + + sl = sizeof(uh->uc.local_addr); + getsockname(fd, &uh->uc.local_addr.sa, &sl); + getpeername(fd, &uh->uc.remote_addr.sa, &sl); + return 0; } @@ -496,6 +505,8 @@ uclient_http_send_headers(struct uclient_http *uh) uclient_http_add_auth_header(uh); ustream_printf(uh->us, "\r\n"); + + uh->state = HTTP_STATE_HEADERS_SENT; } static void uclient_http_headers_complete(struct uclient_http *uh) @@ -516,7 +527,7 @@ static void uclient_http_headers_complete(struct uclient_http *uh) if (uh->uc.cb->header_done) uh->uc.cb->header_done(&uh->uc); - if (uh->req_type == REQ_HEAD) { + if (uh->req_type == REQ_HEAD || uh->uc.status_code == 204) { uh->eof = true; uclient_notify_eof(uh); } @@ -799,7 +810,7 @@ uclient_http_set_request_type(struct uclient *cl, const char *type) } int -uclient_http_reset_headers(struct uclient *cl, const char *name, const char *value) +uclient_http_reset_headers(struct uclient *cl) { struct uclient_http *uh = container_of(cl, struct uclient_http, uc); @@ -833,10 +844,11 @@ uclient_http_send_data(struct uclient *cl, char *buf, unsigned int len) uclient_http_send_headers(uh); - ustream_printf(uh->us, "%X\r\n", len); - if (len > 0) + if (len > 0) { + ustream_printf(uh->us, "%X\r\n", len); ustream_write(uh->us, buf, len, false); - ustream_printf(uh->us, "\r\n"); + ustream_printf(uh->us, "\r\n"); + } return len; } @@ -850,6 +862,8 @@ uclient_http_request_done(struct uclient *cl) return -1; uclient_http_send_headers(uh); + if (uh->req_type == REQ_POST) + ustream_printf(uh->us, "0\r\n\r\n"); uh->state = HTTP_STATE_REQUEST_DONE; return 0;