diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2010-07-28 15:43:08 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2010-07-28 15:43:08 +0200 |
commit | 7203b782cdaec2ffa00ce201eb833bc2e7b2e918 (patch) | |
tree | 0b6cf2f386e044ec7a46cd8cce28b9a593bef1fc /lib | |
parent | 7469da1e14ef814488743c52187666d946d445d2 (diff) | |
download | abrt-7203b782cdaec2ffa00ce201eb833bc2e7b2e918.tar.gz abrt-7203b782cdaec2ffa00ce201eb833bc2e7b2e918.tar.xz abrt-7203b782cdaec2ffa00ce201eb833bc2e7b2e918.zip |
abrt_curl: discard headers from HTTP redirection
Example where it is needed:
abrtd: save_headers: header 0: 'HTTP/1.1 301 Moved Permanently'
abrtd: save_headers: header 1: 'Connection: close'
abrtd: save_headers: header 2: 'Location: NEW_URL'
abrtd: save_headers: header 3: ''
...
If we will continue collecting headers, we might be fooled to think
that the following transaction had "Location: NEW_URL" header.
This patch discards headers when it sees new "HTTP/..." line
(note the count restarting from 0):
...
abrtd: save_headers: header 0: 'HTTP/1.1 200 OK'
abrtd: save_headers: header 1: 'Date: Wed, 28 Jul 2010 13:33:55 GMT'
abrtd: save_headers: header 2: 'Server: Apache'
abrtd: save_headers: header 3: 'Cache-Control: no-cache'
abrtd: save_headers: header 4: 'Pragma: no-cache'
abrtd: save_headers: header 5: 'Content-Type: text/html; charset=UTF-8'
abrtd: save_headers: header 6: 'Connection: close'
abrtd: save_headers: header 7: 'Transfer-Encoding: chunked'
abrtd: save_headers: header 8: ''
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Utils/abrt_curl.cpp | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/lib/Utils/abrt_curl.cpp b/lib/Utils/abrt_curl.cpp index 2cf6b920..af3defca 100644 --- a/lib/Utils/abrt_curl.cpp +++ b/lib/Utils/abrt_curl.cpp @@ -119,14 +119,34 @@ save_headers(void *buffer_pv, size_t count, size_t nmemb, void *ptr) abrt_post_state_t* state = (abrt_post_state_t*)ptr; size_t size = count * nmemb; - - unsigned cnt = state->header_cnt; - state->headers = (char**)xrealloc(state->headers, (cnt+2) * sizeof(state->headers[0])); - char *h = xstrndup((char*)buffer_pv, size); strchrnul(h, '\r')[0] = '\0'; strchrnul(h, '\n')[0] = '\0'; + + unsigned cnt = state->header_cnt; + + /* Check for the case when curl follows a redirect: + * header 0: 'HTTP/1.1 301 Moved Permanently' + * header 1: 'Connection: close' + * header 2: 'Location: NEW_URL' + * header 3: '' + * header 0: 'HTTP/1.1 200 OK' <-- we need to forget all hdrs and start anew + */ + if (cnt != 0 + && strncmp(h, "HTTP/", 5) == 0 + && state->headers[cnt-1][0] == '\0' /* prev header is an empty string */ + ) { + char **headers = state->headers; + if (headers) + { + while (*headers) + free(*headers++); + } + cnt = 0; + } + VERB3 log("save_headers: header %d: '%s'", cnt, h); + state->headers = (char**)xrealloc(state->headers, (cnt+2) * sizeof(state->headers[0])); state->headers[cnt] = h; state->header_cnt = ++cnt; state->headers[cnt] = NULL; |