Commit dd011df9 authored by Fabian Frank's avatar Fabian Frank Committed by Daniel Stenberg
Browse files

http2: switch into http2 mode if NPN indicates

Check the NPN result before preparing an HTTP request and switch into
HTTP/2.0 mode if necessary. This is a work in progress, the actual code
to prepare and send the request using nghttp2 is still missing from
Curl_http2_send_request().
parent 8e778887
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -1668,6 +1668,21 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
     the rest of the request in the PERFORM phase. */
  *done = TRUE;

  switch (conn->negnpn) {
    case NPN_HTTP2_DRAFT09:
      infof(data, "http, we have to use HTTP-draft-09/2\n");
      Curl_http2_init(conn);
      Curl_http2_switched(conn);
      Curl_http2_send_request(conn);
      break;
    case NPN_HTTP1_1:
      /* continue with HTTP/1.1 when explicitly requested */
      break;
    default:
      /* and as fallback */
      break;
  }

  http = data->req.protop;

  if(!data->state.this_is_a_follow) {
+32 −11
Original line number Diff line number Diff line
@@ -115,7 +115,11 @@ static ssize_t recv_callback(nghttp2_session *h2,
{
  struct connectdata *conn = (struct connectdata *)userp;
  ssize_t nread;
  CURLcode rc = Curl_read_plain(conn->sock[FIRSTSOCKET], (char *)buf, length,
  CURLcode rc;

  infof(conn->data, "recv_callback() was called with length %d\n", length);

  rc = Curl_read_plain(conn->sock[FIRSTSOCKET], (char *)buf, length,
                       &nread);
  (void)h2;
  (void)flags;
@@ -285,6 +289,31 @@ static nghttp2_settings_entry settings[] = {
  { NGHTTP2_SETTINGS_INITIAL_WINDOW_SIZE, NGHTTP2_INITIAL_WINDOW_SIZE },
};

/*
 * Initialize nghttp2 for a Curl connection
 */
CURLcode Curl_http2_init(struct connectdata *conn) {
  if(!conn->proto.httpc.h2) {
    /* The nghttp2 session is not yet setup, do it */
    int rc = nghttp2_session_client_new(&conn->proto.httpc.h2,
                                        &callbacks, conn);
    if(rc) {
      failf(conn->data, "Couldn't initialize nghttp2!");
      return CURLE_OUT_OF_MEMORY; /* most likely at least */
    }
  }
  return CURLE_OK;
}

/*
 * Send a request using http2
 */
CURLcode Curl_http2_send_request(struct connectdata *conn)
{
  (void)conn;
  return CURLE_OK;
}

/*
 * Append headers to ask for a HTTP1.1 to HTTP2 upgrade.
 */
@@ -298,15 +327,7 @@ CURLcode Curl_http2_request_upgrade(Curl_send_buffer *req,
  size_t blen;
  struct SingleRequest *k = &conn->data->req;

  if(!conn->proto.httpc.h2) {
    /* The nghttp2 session is not yet setup, do it */
    int rc = nghttp2_session_client_new(&conn->proto.httpc.h2,
                                        &callbacks, conn);
    if(rc) {
      failf(conn->data, "Couldn't initialize nghttp2!");
      return CURLE_OUT_OF_MEMORY; /* most likely at least */
    }
  }
  Curl_http2_init(conn);

  /* As long as we have a fixed set of settings, we don't have to dynamically
   * figure out the base64 strings since it'll always be the same. However,