mirror of
https://github.com/moparisthebest/curl
synced 2024-10-31 15:45:12 -04:00
- Sergio Ballestrero provided a patch for reading responses from NCSA httpd
1.5.x servers, as they return really screwed up response headers when asked for with HTTP 1.1.
This commit is contained in:
parent
7f21669ef2
commit
47bb09e908
@ -194,7 +194,7 @@ Transfer(struct connectdata *c_conn)
|
|||||||
int offset = 0; /* possible resume offset read from the
|
int offset = 0; /* possible resume offset read from the
|
||||||
Content-Range: header */
|
Content-Range: header */
|
||||||
int httpcode = 0; /* error code from the 'HTTP/1.? XXX' line */
|
int httpcode = 0; /* error code from the 'HTTP/1.? XXX' line */
|
||||||
int httpversion = -1; /* the last digit in the HTTP/1.1 string */
|
int httpversion = -1; /* the HTTP version*10 */
|
||||||
|
|
||||||
/* for the low speed checks: */
|
/* for the low speed checks: */
|
||||||
CURLcode urg;
|
CURLcode urg;
|
||||||
@ -465,8 +465,21 @@ Transfer(struct connectdata *c_conn)
|
|||||||
if (!headerline++) {
|
if (!headerline++) {
|
||||||
/* This is the first header, it MUST be the error code line
|
/* This is the first header, it MUST be the error code line
|
||||||
or else we consiser this to be the body right away! */
|
or else we consiser this to be the body right away! */
|
||||||
if (2 == sscanf (p, " HTTP/1.%d %3d", &httpversion,
|
int httpversion_major;
|
||||||
&httpcode)) {
|
int nc=sscanf (p, " HTTP/%d.%d %3d",
|
||||||
|
&httpversion_major ,&httpversion, &httpcode);
|
||||||
|
if (nc==3) {
|
||||||
|
httpversion+=10*httpversion_major;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* this is the real world, not a Nirvana
|
||||||
|
NCSA 1.5.x returns this crap when asked for HTTP/1.1
|
||||||
|
*/
|
||||||
|
nc=sscanf (p, " HTTP %3d", &httpcode);
|
||||||
|
httpversion = 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nc) {
|
||||||
data->progress.httpcode = httpcode;
|
data->progress.httpcode = httpcode;
|
||||||
data->progress.httpversion = httpversion;
|
data->progress.httpversion = httpversion;
|
||||||
|
|
||||||
@ -485,7 +498,7 @@ Transfer(struct connectdata *c_conn)
|
|||||||
return CURLE_HTTP_NOT_FOUND;
|
return CURLE_HTTP_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(httpversion == 0)
|
if(httpversion == 10)
|
||||||
/* Default action for HTTP/1.0 must be to close, unless
|
/* Default action for HTTP/1.0 must be to close, unless
|
||||||
we get one of those fancy headers that tell us the
|
we get one of those fancy headers that tell us the
|
||||||
server keeps it open for us! */
|
server keeps it open for us! */
|
||||||
@ -511,7 +524,7 @@ Transfer(struct connectdata *c_conn)
|
|||||||
conn->size = contentlength;
|
conn->size = contentlength;
|
||||||
Curl_pgrsSetDownloadSize(data, contentlength);
|
Curl_pgrsSetDownloadSize(data, contentlength);
|
||||||
}
|
}
|
||||||
else if((httpversion == 0) &&
|
else if((httpversion == 10) &&
|
||||||
conn->bits.httpproxy &&
|
conn->bits.httpproxy &&
|
||||||
compareheader(p, "Proxy-Connection:", "keep-alive")) {
|
compareheader(p, "Proxy-Connection:", "keep-alive")) {
|
||||||
/*
|
/*
|
||||||
@ -523,7 +536,7 @@ Transfer(struct connectdata *c_conn)
|
|||||||
conn->bits.close = FALSE; /* don't close when done */
|
conn->bits.close = FALSE; /* don't close when done */
|
||||||
infof(data, "HTTP/1.0 proxy connection set to keep alive!\n");
|
infof(data, "HTTP/1.0 proxy connection set to keep alive!\n");
|
||||||
}
|
}
|
||||||
else if((httpversion == 0) &&
|
else if((httpversion == 10) &&
|
||||||
compareheader(p, "Connection:", "keep-alive")) {
|
compareheader(p, "Connection:", "keep-alive")) {
|
||||||
/*
|
/*
|
||||||
* A HTTP/1.0 reply with the 'Connection: keep-alive' line
|
* A HTTP/1.0 reply with the 'Connection: keep-alive' line
|
||||||
|
Loading…
Reference in New Issue
Block a user