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: ''
--
vda
diff -x '*.po' -d -urpN abrt.4/lib/Utils/abrt_curl.cpp
abrt.5/lib/Utils/abrt_curl.cpp
--- abrt.4/lib/Utils/abrt_curl.cpp 2010-07-22 13:49:09.000000000 +0200
+++ abrt.5/lib/Utils/abrt_curl.cpp 2010-07-28 15:29:53.135925335 +0200
@@ -119,14 +119,34 @@ save_headers(void *buffer_pv, size_t cou
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;
Show replies by date