summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2010-07-28 15:43:08 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2010-07-28 15:43:08 +0200
commit7203b782cdaec2ffa00ce201eb833bc2e7b2e918 (patch)
tree0b6cf2f386e044ec7a46cd8cce28b9a593bef1fc
parent7469da1e14ef814488743c52187666d946d445d2 (diff)
downloadabrt-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>
-rw-r--r--lib/Utils/abrt_curl.cpp28
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;