http2: init the pushed transfer properly

This commit is contained in:
Daniel Stenberg 2015-06-02 10:34:27 +02:00
parent f65ab8864e
commit e9f0dd43bc
3 changed files with 21 additions and 10 deletions

View File

@ -958,9 +958,16 @@ CURLMcode Curl_multi_add_perform(struct Curl_multi *multi,
rc = curl_multi_add_handle(multi, data); rc = curl_multi_add_handle(multi, data);
if(!rc) { if(!rc) {
struct SingleRequest *k = &data->req;
/* pass in NULL for 'conn' here since we don't want to init the
connection, only this transfer */
Curl_init_do(data, NULL);
/* take this handle to the perform state right away */ /* take this handle to the perform state right away */
multistate(data, CURLM_STATE_PERFORM); multistate(data, CURLM_STATE_PERFORM);
data->easy_conn = conn; data->easy_conn = conn;
k->keepon |= KEEP_RECV; /* setup to receive! */
} }
return rc; return rc;
} }

View File

@ -142,7 +142,6 @@ find_oldest_idle_connection_in_bundle(struct SessionHandle *data,
struct connectbundle *bundle); struct connectbundle *bundle);
static void conn_free(struct connectdata *conn); static void conn_free(struct connectdata *conn);
static void signalPipeClose(struct curl_llist *pipeline, bool pipe_broke); static void signalPipeClose(struct curl_llist *pipeline, bool pipe_broke);
static CURLcode do_init(struct connectdata *conn);
static CURLcode parse_url_login(struct SessionHandle *data, static CURLcode parse_url_login(struct SessionHandle *data,
struct connectdata *conn, struct connectdata *conn,
char **userptr, char **passwdptr, char **userptr, char **passwdptr,
@ -5651,7 +5650,7 @@ static CURLcode create_conn(struct SessionHandle *data,
} }
/* since we skip do_init() */ /* since we skip do_init() */
do_init(conn); Curl_init_do(data, conn);
goto out; goto out;
} }
@ -5830,7 +5829,7 @@ static CURLcode create_conn(struct SessionHandle *data,
conn->inuse = TRUE; conn->inuse = TRUE;
/* Setup and init stuff before DO starts, in preparing for the transfer. */ /* Setup and init stuff before DO starts, in preparing for the transfer. */
do_init(conn); Curl_init_do(data, conn);
/* /*
* Setup whatever necessary for a resumed transfer * Setup whatever necessary for a resumed transfer
@ -6112,20 +6111,24 @@ CURLcode Curl_done(struct connectdata **connp,
} }
/* /*
* do_init() inits the readwrite session. This is inited each time (in the DO * Curl_init_do() inits the readwrite session. This is inited each time (in
* function before the protocol-specific DO functions are invoked) for a * the DO function before the protocol-specific DO functions are invoked) for
* transfer, sometimes multiple times on the same SessionHandle. Make sure * a transfer, sometimes multiple times on the same SessionHandle. Make sure
* nothing in here depends on stuff that are setup dynamically for the * nothing in here depends on stuff that are setup dynamically for the
* transfer. * transfer.
*
* Allow this function to get called with 'conn' set to NULL.
*/ */
static CURLcode do_init(struct connectdata *conn) CURLcode Curl_init_do(struct SessionHandle *data, struct connectdata *conn)
{ {
struct SessionHandle *data = conn->data;
struct SingleRequest *k = &data->req; struct SingleRequest *k = &data->req;
if(conn)
conn->bits.do_more = FALSE; /* by default there's no curl_do_more() to
* use */
data->state.done = FALSE; /* Curl_done() is not called yet */ data->state.done = FALSE; /* Curl_done() is not called yet */
conn->bits.do_more = FALSE; /* by default there's no curl_do_more() to use */
data->state.expect100header = FALSE; data->state.expect100header = FALSE;
if(data->set.opt_no_body) if(data->set.opt_no_body)

View File

@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___ * | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____| * \___|\___/|_| \_\_____|
* *
* Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al. * Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
* *
* This software is licensed as described in the file COPYING, which * This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms * you should have received as part of this distribution. The terms
@ -27,6 +27,7 @@
* Prototypes for library-wide functions provided by url.c * Prototypes for library-wide functions provided by url.c
*/ */
CURLcode Curl_init_do(struct SessionHandle *data, struct connectdata *conn);
CURLcode Curl_open(struct SessionHandle **curl); CURLcode Curl_open(struct SessionHandle **curl);
CURLcode Curl_init_userdefined(struct UserDefined *set); CURLcode Curl_init_userdefined(struct UserDefined *set);
CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option,