From 7203b782cdaec2ffa00ce201eb833bc2e7b2e918 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Wed, 28 Jul 2010 15:43:08 +0200 Subject: 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 --- lib/Utils/abrt_curl.cpp | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) (limited to 'lib/Utils') 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; -- cgit