mirror of
https://github.com/curl/curl.git
synced 2025-04-24 16:40:32 +08:00
HTTP/2: Move :authority before non-pseudo header fields
This commit is contained in:
parent
26393a97b2
commit
7ceada43af
17
lib/http2.c
17
lib/http2.c
@ -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:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user