X-Git-Url: http://sjero.net/git/?p=wget;a=blobdiff_plain;f=src%2Fhttp.c;h=b50acf48ea0ac601190d5920d13488d1f8a78bf9;hp=8bba70dfdb5cb0ea0fa192c01361559e18e81af4;hb=38a7829dcb4eb5dba28dbf0f05c6a80fea9217f8;hpb=dfa1f4e0646f6fab5b768fd67477601126070dbc diff --git a/src/http.c b/src/http.c index 8bba70df..b50acf48 100644 --- a/src/http.c +++ b/src/http.c @@ -1586,7 +1586,7 @@ read_response_body (struct http_stat *hs, int sock, FILE *fp, wgint contlen, /* Download the response body and write it to fp. If we are working on a WARC file, we simultaneously write the response body to warc_tmp. */ - hs->res = fd_read_body (sock, fp, contlen != -1 ? contlen : 0, + hs->res = fd_read_body (hs->local_file, sock, fp, contlen != -1 ? contlen : 0, hs->restval, &hs->rd_size, &hs->len, &hs->dltime, flags, warc_tmp); if (hs->res >= 0) @@ -2335,23 +2335,23 @@ read_header: But if we are writing a WARC file we are: we like to keep everyting. */ if (warc_enabled) { - int err; + int _err; type = resp_header_strdup (resp, "Content-Type"); - err = read_response_body (hs, sock, NULL, contlen, 0, + _err = read_response_body (hs, sock, NULL, contlen, 0, chunked_transfer_encoding, u->url, warc_timestamp_str, warc_request_uuid, warc_ip, type, statcode, head); xfree_null (type); - if (err != RETRFINISHED || hs->res < 0) + if (_err != RETRFINISHED || hs->res < 0) { CLOSE_INVALIDATE (sock); request_free (req); xfree_null (message); resp_free (resp); xfree (head); - return err; + return _err; } else CLOSE_FINISH (sock); @@ -2596,6 +2596,7 @@ read_header: tmp = parse_charset (tmp2); if (tmp) set_content_encoding (iri, tmp); + xfree_null(tmp); } } } @@ -2618,6 +2619,22 @@ read_header: if (H_20X (statcode)) *dt |= RETROKF; + if (statcode == HTTP_STATUS_NO_CONTENT) + { + /* 204 response has no body (RFC 2616, 4.3) */ + + /* In case the caller cares to look... */ + hs->len = 0; + hs->res = 0; + hs->restval = 0; + + CLOSE_FINISH (sock); + xfree_null (type); + xfree (head); + + return RETRFINISHED; + } + /* Return if redirected. */ if (H_REDIRECTED (statcode) || statcode == HTTP_STATUS_MULTIPLE_CHOICES) { @@ -2644,18 +2661,18 @@ read_header: But if we are writing a WARC file we are: we like to keep everyting. */ if (warc_enabled) { - int err = read_response_body (hs, sock, NULL, contlen, 0, + int _err = read_response_body (hs, sock, NULL, contlen, 0, chunked_transfer_encoding, u->url, warc_timestamp_str, warc_request_uuid, warc_ip, type, statcode, head); - if (err != RETRFINISHED || hs->res < 0) + if (_err != RETRFINISHED || hs->res < 0) { CLOSE_INVALIDATE (sock); xfree_null (type); xfree (head); - return err; + return _err; } else CLOSE_FINISH (sock); @@ -2691,7 +2708,6 @@ read_header: { case HTTP_STATUS_TEMPORARY_REDIRECT: return NEWLOCATION_KEEP_POST; - break; case HTTP_STATUS_MOVED_PERMANENTLY: if (opt.method && strcasecmp (opt.method, "post") != 0) return NEWLOCATION_KEEP_POST; @@ -2702,7 +2718,6 @@ read_header: break; default: return NEWLOCATION; - break; } return NEWLOCATION; } @@ -2823,18 +2838,18 @@ read_header: But if we are writing a WARC file we are: we like to keep everyting. */ if (warc_enabled) { - int err = read_response_body (hs, sock, NULL, contlen, 0, + int _err = read_response_body (hs, sock, NULL, contlen, 0, chunked_transfer_encoding, u->url, warc_timestamp_str, warc_request_uuid, warc_ip, type, statcode, head); - if (err != RETRFINISHED || hs->res < 0) + if (_err != RETRFINISHED || hs->res < 0) { CLOSE_INVALIDATE (sock); xfree (head); xfree_null (type); - return err; + return _err; } else CLOSE_FINISH (sock); @@ -2945,11 +2960,8 @@ read_header: fp = output_stream; /* Print fetch message, if opt.verbose. */ - if (opt.verbose) - { - logprintf (LOG_NOTQUIET, _("Saving to: %s\n"), + logprintf (LOG_VERBOSE, _("Saving to: %s\n"), HYPHENP (hs->local_file) ? quote ("STDOUT") : quote (hs->local_file)); - } err = read_response_body (hs, sock, fp, contlen, contrange, @@ -4056,12 +4068,12 @@ ensure_extension (struct http_stat *hs, const char *ext, int *dt) #ifdef TESTING const char * -test_parse_content_disposition() +test_parse_content_disposition(void) { - int i; - struct { - char *hdrval; - char *filename; + unsigned i; + static const struct { + const char *hdrval; + const char *filename; bool result; } test_array[] = { { "filename=\"file.ext\"", "file.ext", true }, @@ -4072,7 +4084,7 @@ test_parse_content_disposition() { "attachement; filename*0=\"hello\"; filename*1=\"world.txt\"", "helloworld.txt", true }, }; - for (i = 0; i < sizeof(test_array)/sizeof(test_array[0]); ++i) + for (i = 0; i < countof(test_array); ++i) { char *filename; bool res;