HTTP/2: Move :authority before non-pseudo header fields

This commit is contained in:
Tatsuhiro Tsujikawa 2014-08-07 23:09:25 +09:00 committed by Daniel Stenberg
parent 26393a97b2
commit 7ceada43af

View File

@ -761,6 +761,10 @@ static ssize_t http2_recv(struct connectdata *conn, int sockindex,
return -1; return -1;
} }
/* Index where :authority header field will appear in request header
field list. */
#define AUTHORITY_DST_IDX 3
/* return number of received (decrypted) bytes */ /* return number of received (decrypted) bytes */
static ssize_t http2_send(struct connectdata *conn, int sockindex, static ssize_t http2_send(struct connectdata *conn, int sockindex,
const void *mem, size_t len, CURLcode *err) const void *mem, size_t len, CURLcode *err)
@ -775,6 +779,7 @@ static ssize_t http2_send(struct connectdata *conn, int sockindex,
nghttp2_nv *nva; nghttp2_nv *nva;
size_t nheader; size_t nheader;
size_t i; size_t i;
size_t authority_idx;
char *hdbuf = (char*)mem; char *hdbuf = (char*)mem;
char *end; char *end;
nghttp2_data_provider data_prd; nghttp2_data_provider data_prd;
@ -845,10 +850,13 @@ static ssize_t http2_send(struct connectdata *conn, int sockindex,
hdbuf = strchr(hdbuf, 0x0a); hdbuf = strchr(hdbuf, 0x0a);
++hdbuf; ++hdbuf;
authority_idx = 0;
for(i = 3; i < nheader; ++i) { for(i = 3; i < nheader; ++i) {
end = strchr(hdbuf, ':'); end = strchr(hdbuf, ':');
assert(end); assert(end);
if(end - hdbuf == 4 && Curl_raw_nequal("host", hdbuf, 4)) { if(end - hdbuf == 4 && Curl_raw_nequal("host", hdbuf, 4)) {
authority_idx = i;
nva[i].name = (unsigned char *)":authority"; nva[i].name = (unsigned char *)":authority";
nva[i].namelen = (uint16_t)strlen((char *)nva[i].name); nva[i].namelen = (uint16_t)strlen((char *)nva[i].name);
} }
@ -879,6 +887,15 @@ static ssize_t http2_send(struct connectdata *conn, int sockindex,
} }
} }
/* :authority must come before non-pseudo header fields */
if(authority_idx != 0 && authority_idx != AUTHORITY_DST_IDX) {
nghttp2_nv authority = nva[authority_idx];
for(i = authority_idx; i > AUTHORITY_DST_IDX; --i) {
nva[i] = nva[i - 1];
}
nva[i] = authority;
}
switch(conn->data->set.httpreq) { switch(conn->data->set.httpreq) {
case HTTPREQ_POST: case HTTPREQ_POST:
case HTTPREQ_POST_FORM: case HTTPREQ_POST_FORM: