Commit 81cd24ad authored by Daniel Stenberg's avatar Daniel Stenberg
Browse files

http2: more and better error checking

1 - fixes the warnings when built without http2 support

2 - adds CURLE_HTTP2, a new error code for errors detected by nghttp2
basically when they are about http2 specific things.
parent 713f96ee
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -83,6 +83,9 @@ FTP servers return a 227-line as a response to a PASV command. If libcurl
fails to parse that line, this return code is passed back.
.IP "CURLE_FTP_CANT_GET_HOST (15)"
An internal failure to lookup the host used for the new connection.
.IP "CURLE_HTTP2 (16)"
A problem was detected in the HTTP2 framing layer. This is somewhat generic
and can be one out of several problems, see the error buffer for details.
.IP "CURLE_FTP_COULDNT_SET_TYPE (17)"
Received an error when trying to set the transfer mode to binary or ASCII.
.IP "CURLE_PARTIAL_FILE (18)"
+1 −0
Original line number Diff line number Diff line
@@ -79,6 +79,7 @@ CURLE_HTTP_PORT_FAILED 7.3 7.12.0
CURLE_HTTP_POST_ERROR           7.1
CURLE_HTTP_RANGE_ERROR          7.1           7.17.0
CURLE_HTTP_RETURNED_ERROR       7.10.3
CURLE_HTTP2                     7.38.0
CURLE_INTERFACE_FAILED          7.12.0
CURLE_LDAP_CANNOT_BIND          7.1
CURLE_LDAP_INVALID_URL          7.10.8
+3 −1
Original line number Diff line number Diff line
@@ -423,7 +423,9 @@ typedef enum {
  CURLE_FTP_WEIRD_PASV_REPLY,    /* 13 */
  CURLE_FTP_WEIRD_227_FORMAT,    /* 14 */
  CURLE_FTP_CANT_GET_HOST,       /* 15 */
  CURLE_OBSOLETE16,              /* 16 - NOT USED */
  CURLE_HTTP2,                   /* 16 - A problem in the http2 framing layer.
                                    [was obsoleted in August 2007 for 7.17.0,
                                    reused in July 2014 for 7.38.0] */
  CURLE_FTP_COULDNT_SET_TYPE,    /* 17 */
  CURLE_PARTIAL_FILE,            /* 18 */
  CURLE_FTP_COULDNT_RETR_FILE,   /* 19 */
+9 −5
Original line number Diff line number Diff line
@@ -1760,8 +1760,9 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
      if(result)
        return result;

      /* TODO: add error checking here */
      Curl_http2_switched(conn);
      result = Curl_http2_switched(conn);
      if(result)
        return result;
      break;
    case NPN_HTTP1_1:
      /* continue with HTTP/1.1 when explicitly requested */
@@ -1773,7 +1774,9 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
  }
  else {
    /* prepare for a http2 request */
    Curl_http2_setup(conn);
    result = Curl_http2_setup(conn);
    if(result)
      return result;
  }

  http = data->req.protop;
@@ -3007,8 +3010,9 @@ CURLcode Curl_http_readwrite_headers(struct SessionHandle *data,
            k->upgr101 = UPGR101_RECEIVED;

            /* switch to http2 now */
            /* TODO: add error checking */
            Curl_http2_switched(conn);
            result = Curl_http2_switched(conn);
            if(result)
              return result;
          }
          break;
        default:
+16 −8
Original line number Diff line number Diff line
@@ -810,12 +810,12 @@ CURLcode Curl_http2_setup(struct connectdata *conn)
  return Curl_add_buffer(httpc->header_recvbuf, "HTTP/2.0 200\r\n", 14);
}

int Curl_http2_switched(struct connectdata *conn)
CURLcode Curl_http2_switched(struct connectdata *conn)
{
  /* TODO: May get CURLE_AGAIN */
  CURLcode rc;
  struct http_conn *httpc = &conn->proto.httpc;
  int rv;
  struct SessionHandle *data = conn->data;

  httpc->recv_underlying = (recving)conn->recv[FIRSTSOCKET];
  httpc->send_underlying = (sending)conn->send[FIRSTSOCKET];
@@ -827,7 +827,15 @@ int Curl_http2_switched(struct connectdata *conn)
     NGHTTP2_CLIENT_CONNECTION_PREFACE,
     NGHTTP2_CLIENT_CONNECTION_PREFACE_LEN,
     &rc);
  assert(rv == 24);
  if(rc)
    /* TODO: This may get CURLE_AGAIN */
    return rc;

  if(rv != 24) {
    failf(data, "Only sent partial HTTP2 packet");
    return CURLE_SEND_ERROR;
  }

  if(conn->data->req.upgr101 == UPGR101_RECEIVED) {
    /* stream 1 is opened implicitly on upgrade */
    httpc->stream_id = 1;
@@ -835,9 +843,9 @@ int Curl_http2_switched(struct connectdata *conn)
    rv = nghttp2_session_upgrade(httpc->h2, httpc->binsettings,
                                 httpc->binlen, NULL);
    if(rv != 0) {
      failf(conn->data, "nghttp2_session_upgrade() failed: %s(%d)",
      failf(data, "nghttp2_session_upgrade() failed: %s(%d)",
            nghttp2_strerror(rv), rv);
      return -1;
      return CURLE_HTTP2;
    }
  }
  else {
@@ -845,12 +853,12 @@ int Curl_http2_switched(struct connectdata *conn)
    httpc->stream_id = -1;
    rv = nghttp2_submit_settings(httpc->h2, NGHTTP2_FLAG_NONE, NULL, 0);
    if(rv != 0) {
      failf(conn->data, "nghttp2_submit_settings() failed: %s(%d)",
      failf(data, "nghttp2_submit_settings() failed: %s(%d)",
            nghttp2_strerror(rv), rv);
      return -1;
      return CURLE_HTTP2;
    }
  }
  return 0;
  return CURLE_OK;
}

#endif
Loading