diff options
author | Dan Fandrich <dan@coneharvesters.com> | 2008-07-30 20:11:51 +0000 |
---|---|---|
committer | Dan Fandrich <dan@coneharvesters.com> | 2008-07-30 20:11:51 +0000 |
commit | cc0285da7f99fd4cb87db7059552db929b6f24f2 (patch) | |
tree | dc0ba4dd8b49a869169acd567507f349fa32b213 /lib/transfer.c | |
parent | f3bc16f4f5139371725b26139429ad4e51ec1473 (diff) |
Factored out Curl_copy_header_value
Diffstat (limited to 'lib/transfer.c')
-rw-r--r-- | lib/transfer.c | 85 |
1 files changed, 22 insertions, 63 deletions
diff --git a/lib/transfer.c b/lib/transfer.c index 4201ad18a..7f59be876 100644 --- a/lib/transfer.c +++ b/lib/transfer.c @@ -109,6 +109,7 @@ #define CURL_TIMEOUT_EXPECT_100 1000 /* counting ms here */ + /* * This function will call the read callback to fill our buffer with data * to upload. @@ -927,42 +928,17 @@ CURLcode Curl_readwrite(struct connectdata *conn, ", closing after transfer\n", contentlength); } } - /* check for Content-Type: header lines to get the mime-type */ + /* check for Content-Type: header lines to get the MIME-type */ else if(checkprefix("Content-Type:", k->p)) { - char *start; - char *end; - size_t len; - - /* Find the first non-space letter */ - for(start=k->p+13; - *start && ISSPACE(*start); - start++) - ; /* empty loop */ - - /* data is now in the host encoding so - use '\r' and '\n' instead of 0x0d and 0x0a */ - end = strchr(start, '\r'); - if(!end) - end = strchr(start, '\n'); - - if(end) { - /* skip all trailing space letters */ - for(; ISSPACE(*end) && (end > start); end--) - ; /* empty loop */ - - /* get length of the type */ - len = end-start+1; - - /* allocate memory of a cloned copy */ + char *contenttype = Curl_copy_header_value(k->p); + if (!contenttype) + return CURLE_OUT_OF_MEMORY; + if (!*contenttype) + /* ignore empty data */ + free(contenttype); + else { Curl_safefree(data->info.contenttype); - - data->info.contenttype = malloc(len + 1); - if(NULL == data->info.contenttype) - return CURLE_OUT_OF_MEMORY; - - /* copy the content-type string */ - memcpy(data->info.contenttype, start, len); - data->info.contenttype[len] = 0; /* zero terminate */ + data->info.contenttype = contenttype; } } #ifndef CURL_DISABLE_HTTP @@ -1123,36 +1099,19 @@ CURLcode Curl_readwrite(struct connectdata *conn, } else if((k->httpcode >= 300 && k->httpcode < 400) && checkprefix("Location:", k->p)) { - /* this is the URL that the server advices us to use instead */ - char *ptr; - char *start=k->p; - char backup; - - start += 9; /* pass "Location:" */ - - /* Skip spaces and tabs. We do this to support multiple - white spaces after the "Location:" keyword. */ - while(*start && ISSPACE(*start )) - start++; - - /* Scan through the string from the end to find the last - non-space. k->end_ptr points to the actual terminating zero - letter, move pointer one letter back and start from - there. This logic strips off trailing whitespace, but keeps - any embedded whitespace. */ - ptr = k->end_ptr-1; - while((ptr>=start) && ISSPACE(*ptr)) - ptr--; - ptr++; - - backup = *ptr; /* store the ending letter */ - if(ptr != start) { - *ptr = '\0'; /* zero terminate */ - data->req.location = strdup(start); /* clone string */ - *ptr = backup; /* restore ending letter */ - if(!data->req.location) - return CURLE_OUT_OF_MEMORY; + /* this is the URL that the server advises us to use instead */ + char *location = Curl_copy_header_value(k->p); + if (!location) + return CURLE_OUT_OF_MEMORY; + if (!*location) + /* ignore empty data */ + free(location); + else { + DEBUGASSERT(!data->req.location); + data->req.location = location; + if(data->set.http_follow_location) { + DEBUGASSERT(!data->req.newurl); data->req.newurl = strdup(data->req.location); /* clone */ if(!data->req.newurl) return CURLE_OUT_OF_MEMORY; |