mirror of
https://github.com/moparisthebest/curl
synced 2025-02-28 09:21:50 -05:00
http2: do the POST Upgrade dance properly
This commit is contained in:
parent
0e11307057
commit
a878cb3056
@ -7,7 +7,7 @@
|
|||||||
* | (__| |_| | _ <| |___
|
* | (__| |_| | _ <| |___
|
||||||
* \___|\___/|_| \_\_____|
|
* \___|\___/|_| \_\_____|
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
|
* Copyright (C) 1998 - 2014, 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
|
||||||
@ -151,7 +151,10 @@ struct HTTP {
|
|||||||
|
|
||||||
struct http_conn {
|
struct http_conn {
|
||||||
#ifdef USE_NGHTTP2
|
#ifdef USE_NGHTTP2
|
||||||
|
#define H2_BINSETTINGS_LEN 80
|
||||||
nghttp2_session *h2;
|
nghttp2_session *h2;
|
||||||
|
uint8_t binsettings[H2_BINSETTINGS_LEN];
|
||||||
|
size_t binlen; /* length of the binsettings data */
|
||||||
char *mem; /* points to a buffer in memory to store or read from */
|
char *mem; /* points to a buffer in memory to store or read from */
|
||||||
size_t size; /* size of the buffer 'mem' points to */
|
size_t size; /* size of the buffer 'mem' points to */
|
||||||
ssize_t nread; /* how much data that was sent/recv by the HTTP2 engine */
|
ssize_t nread; /* how much data that was sent/recv by the HTTP2 engine */
|
||||||
|
15
lib/http2.c
15
lib/http2.c
@ -320,12 +320,12 @@ CURLcode Curl_http2_send_request(struct connectdata *conn)
|
|||||||
CURLcode Curl_http2_request_upgrade(Curl_send_buffer *req,
|
CURLcode Curl_http2_request_upgrade(Curl_send_buffer *req,
|
||||||
struct connectdata *conn)
|
struct connectdata *conn)
|
||||||
{
|
{
|
||||||
uint8_t binsettings[80];
|
|
||||||
CURLcode result;
|
CURLcode result;
|
||||||
ssize_t binlen;
|
ssize_t binlen;
|
||||||
char *base64;
|
char *base64;
|
||||||
size_t blen;
|
size_t blen;
|
||||||
struct SingleRequest *k = &conn->data->req;
|
struct SingleRequest *k = &conn->data->req;
|
||||||
|
uint8_t *binsettings = conn->proto.httpc.binsettings;
|
||||||
|
|
||||||
Curl_http2_init(conn);
|
Curl_http2_init(conn);
|
||||||
|
|
||||||
@ -335,14 +335,14 @@ CURLcode Curl_http2_request_upgrade(Curl_send_buffer *req,
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/* this returns number of bytes it wrote */
|
/* this returns number of bytes it wrote */
|
||||||
binlen = nghttp2_pack_settings_payload(binsettings,
|
binlen = nghttp2_pack_settings_payload(binsettings, H2_BINSETTINGS_LEN,
|
||||||
sizeof(binsettings),
|
|
||||||
settings,
|
settings,
|
||||||
sizeof(settings)/sizeof(settings[0]));
|
sizeof(settings)/sizeof(settings[0]));
|
||||||
if(!binlen) {
|
if(!binlen) {
|
||||||
failf(conn->data, "nghttp2 unexpectedly failed on pack_settings_payload");
|
failf(conn->data, "nghttp2 unexpectedly failed on pack_settings_payload");
|
||||||
return CURLE_FAILED_INIT;
|
return CURLE_FAILED_INIT;
|
||||||
}
|
}
|
||||||
|
conn->proto.httpc.binlen = binlen;
|
||||||
|
|
||||||
result = Curl_base64_encode(conn->data, (const char *)binsettings, binlen,
|
result = Curl_base64_encode(conn->data, (const char *)binsettings, binlen,
|
||||||
&base64, &blen);
|
&base64, &blen);
|
||||||
@ -397,13 +397,20 @@ static ssize_t http2_send(struct connectdata *conn, int sockindex,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Curl_http2_switched(struct connectdata *conn)
|
int Curl_http2_switched(struct connectdata *conn)
|
||||||
{
|
{
|
||||||
|
int rc;
|
||||||
|
struct http_conn *httpc = &conn->proto.httpc;
|
||||||
/* we are switched! */
|
/* we are switched! */
|
||||||
conn->handler = &Curl_handler_http2;
|
conn->handler = &Curl_handler_http2;
|
||||||
conn->recv[FIRSTSOCKET] = http2_recv;
|
conn->recv[FIRSTSOCKET] = http2_recv;
|
||||||
conn->send[FIRSTSOCKET] = http2_send;
|
conn->send[FIRSTSOCKET] = http2_send;
|
||||||
infof(conn->data, "We have switched to HTTP2\n");
|
infof(conn->data, "We have switched to HTTP2\n");
|
||||||
|
|
||||||
|
/* send the SETTINGS frame (again) */
|
||||||
|
rc = nghttp2_session_upgrade(httpc->h2, httpc->binsettings, httpc->binlen,
|
||||||
|
conn);
|
||||||
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -36,7 +36,7 @@ CURLcode Curl_http2_init(struct connectdata *conn);
|
|||||||
CURLcode Curl_http2_send_request(struct connectdata *conn);
|
CURLcode Curl_http2_send_request(struct connectdata *conn);
|
||||||
CURLcode Curl_http2_request_upgrade(Curl_send_buffer *req,
|
CURLcode Curl_http2_request_upgrade(Curl_send_buffer *req,
|
||||||
struct connectdata *conn);
|
struct connectdata *conn);
|
||||||
void Curl_http2_switched(struct connectdata *conn);
|
int Curl_http2_switched(struct connectdata *conn);
|
||||||
#else /* USE_NGHTTP2 */
|
#else /* USE_NGHTTP2 */
|
||||||
#define Curl_http2_init(x)
|
#define Curl_http2_init(x)
|
||||||
#define Curl_http2_send_request(x)
|
#define Curl_http2_send_request(x)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user