diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/http.c | 39 | 
1 files changed, 37 insertions, 2 deletions
| diff --git a/lib/http.c b/lib/http.c index b421a2c73..06bdf610c 100644 --- a/lib/http.c +++ b/lib/http.c @@ -2726,6 +2726,42 @@ static CURLcode header_append(struct SessionHandle *data,    return CURLE_OK;  } +static void print_http_error(struct SessionHandle *data) +{ +  struct SingleRequest *k = &data->req; +  char *beg = k->p; + +  /* make sure that data->req.p points to the HTTP status line */ +  if(!strncmp(beg, "HTTP", 4)) { + +    /* skip to HTTP status code */ +    beg = strchr(beg, ' '); +    if(beg && *++beg) { + +      /* find trailing CR */ +      char end_char = '\r'; +      char *end = strchr(beg, end_char); +      if(!end) { +        /* try to find LF (workaround for non-compliant HTTP servers) */ +        end_char = '\n'; +        end = strchr(beg, end_char); +      } + +      if(end) { +        /* temporarily replace CR or LF by NUL and print the error message */ +        *end = '\0'; +        failf(data, "The requested URL returned error: %s", beg); + +        /* restore the previously replaced CR or LF */ +        *end = end_char; +        return; +      } +    } +  } + +  /* fall-back to printing the HTTP status code only */ +  failf(data, "The requested URL returned error: %d", k->httpcode); +}  /*   * Read any HTTP header lines from the server and pass them to the client app. @@ -3114,8 +3150,7 @@ CURLcode Curl_http_readwrite_headers(struct SessionHandle *data,            }            else {              /* serious error, go home! */ -            failf (data, "The requested URL returned error: %d", -                   k->httpcode); +            print_http_error(data);              return CURLE_HTTP_RETURNED_ERROR;            }          } | 
