]> granicus.if.org Git - curl/commitdiff
http: print reason phrase from HTTP status line on error
authorKamil Dudka <kdudka@redhat.com>
Fri, 20 Jul 2012 11:33:58 +0000 (13:33 +0200)
committerKamil Dudka <kdudka@redhat.com>
Sun, 22 Jul 2012 00:12:43 +0000 (02:12 +0200)
Bug: https://bugzilla.redhat.com/676596

RELEASE-NOTES
lib/http.c
tests/data/test24

index 7fc03a3e77d50f3c6c1bd7ec39eabb5e07af2642..32c27cbcaf0d1a7a34c28b71242985421fa59061 100644 (file)
@@ -19,6 +19,7 @@ This release includes the following changes:
  o pop3: Added support for apop authentication
  o Added support for Schannel (Native Windows) SSL/TLS encryption [2]
  o Added support for Darwin SSL (Native Mac OS X and iOS) [6]
+ o http: print reason phrase from HTTP status line on error [8]
 
 This release includes the following bugfixes:
 
@@ -68,3 +69,4 @@ References to bug reports and discussions on issues:
  [5] = http://daniel.haxx.se/blog/2012/06/03/curling-the-metalink/
  [6] = http://daniel.haxx.se/blog/2012/06/28/darwin-native-ssl-for-curl/
  [7] = http://daniel.haxx.se/blog/2012/07/08/curls-new-http-cookies-docs/
+ [8] = https://bugzilla.redhat.com/676596
index b421a2c738a49573b43381dc2a3a29f4d4131742..06bdf610c8ddc9e6d8e55acc4b223c78b03656b1 100644 (file)
@@ -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;
           }
         }
index 7985f43b78497b1fbbf64774705db108d0858c91..18e7d5b8e7d0f3abac33e043e787181e2954221f 100644 (file)
@@ -24,7 +24,7 @@ http
 HTTP GET fail silently on HTTP error return
  </name>
  <command>
-http://%HOSTIP:%HTTPPORT/24 --fail
+http://%HOSTIP:%HTTPPORT/24 --fail --silent --show-error
 </command>
 </client>
 
@@ -43,5 +43,8 @@ Accept: */*
 <errorcode>
 22
 </errorcode>
+<file2 name="log/stderr24">
+curl: (22) The requested URL returned error: 404 BAD BOY
+</file2>
 </verify>
 </testcase>