summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJiri Moskovcak <jmoskovc@redhat.com>2010-07-28 16:03:11 +0200
committerJiri Moskovcak <jmoskovc@redhat.com>2010-07-28 16:03:11 +0200
commit0ad275addffe66e343abc314bc7eac889cae65e9 (patch)
tree9e08ff7abb6cf815d5615c467a32e6cbca8d8812
parentdb1f780bf14d13d43c259c366b6aa012afff2b1a (diff)
parent7203b782cdaec2ffa00ce201eb833bc2e7b2e918 (diff)
downloadabrt-0ad275addffe66e343abc314bc7eac889cae65e9.tar.gz
abrt-0ad275addffe66e343abc314bc7eac889cae65e9.tar.xz
abrt-0ad275addffe66e343abc314bc7eac889cae65e9.zip
Merge branch 'master' of ssh://git.fedorahosted.org/git/abrt
-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;