aboutsummaryrefslogtreecommitdiff
path: root/lib/vquic/quiche.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/vquic/quiche.c')
-rw-r--r--lib/vquic/quiche.c33
1 files changed, 18 insertions, 15 deletions
diff --git a/lib/vquic/quiche.c b/lib/vquic/quiche.c
index 7f9b34a1e..0ee360d07 100644
--- a/lib/vquic/quiche.c
+++ b/lib/vquic/quiche.c
@@ -50,7 +50,7 @@
#define QUIC_MAX_STREAMS (256*1024)
#define QUIC_MAX_DATA (1*1024*1024)
-#define QUIC_IDLE_TIMEOUT 60 * 1000 /* milliseconds */
+#define QUIC_IDLE_TIMEOUT (60 * 1000) /* milliseconds */
static CURLcode process_ingress(struct connectdata *conn,
curl_socket_t sockfd,
@@ -203,17 +203,17 @@ CURLcode Curl_quic_connect(struct connectdata *conn, curl_socket_t sockfd,
if(result)
return result;
-#if 0
/* store the used address as a string */
- if(!Curl_addr2string((struct sockaddr*)addr,
+ if(!Curl_addr2string((struct sockaddr*)addr, addrlen,
conn->primary_ip, &conn->primary_port)) {
char buffer[STRERROR_LEN];
failf(data, "ssrem inet_ntop() failed with errno %d: %s",
- errno, Curl_strerror(errno, buffer, sizeof(buffer)));
+ SOCKERRNO, Curl_strerror(SOCKERRNO, buffer, sizeof(buffer)));
return CURLE_BAD_FUNCTION_ARGUMENT;
}
memcpy(conn->ip_addr_str, conn->primary_ip, MAX_IPADR_LEN);
-#endif
+ Curl_persistconninfo(conn);
+
/* for connection reuse purposes: */
conn->ssl[FIRSTSOCKET].state = ssl_connection_complete;
@@ -237,7 +237,7 @@ static CURLcode quiche_has_connected(struct connectdata *conn,
conn->httpversion = 30;
conn->bundle->multiuse = BUNDLE_MULTIPLEX;
- qs->h3config = quiche_h3_config_new(0, 1024, 0, 0);
+ qs->h3config = quiche_h3_config_new();
if(!qs->h3config)
return CURLE_OUT_OF_MEMORY;
@@ -301,7 +301,7 @@ static CURLcode process_ingress(struct connectdata *conn, int sockfd,
do {
recvd = recv(sockfd, buf, bufsize, 0);
- if((recvd < 0) && ((errno == EAGAIN) || (errno == EWOULDBLOCK)))
+ if((recvd < 0) && ((SOCKERRNO == EAGAIN) || (SOCKERRNO == EWOULDBLOCK)))
break;
if(recvd < 0) {
@@ -404,13 +404,14 @@ static ssize_t h3_stream_recv(struct connectdata *conn,
quiche_h3_event *ev;
int rc;
struct h3h1header headers;
- struct HTTP *stream = conn->data->req.protop;
+ struct Curl_easy *data = conn->data;
+ struct HTTP *stream = data->req.protop;
headers.dest = buf;
headers.destlen = buffersize;
headers.nlen = 0;
if(process_ingress(conn, sockfd, qs)) {
- infof(conn->data, "h3_stream_recv returns on ingress\n");
+ infof(data, "h3_stream_recv returns on ingress\n");
*curlcode = CURLE_RECV_ERROR;
return -1;
}
@@ -423,7 +424,7 @@ static ssize_t h3_stream_recv(struct connectdata *conn,
if(s != stream->stream3_id) {
/* another transfer, ignore for now */
- infof(conn->data, "Got h3 for stream %u, expects %u\n",
+ infof(data, "Got h3 for stream %u, expects %u\n",
s, stream->stream3_id);
continue;
}
@@ -458,9 +459,7 @@ static ssize_t h3_stream_recv(struct connectdata *conn,
break;
case QUICHE_H3_EVENT_FINISHED:
- if(quiche_conn_close(qs->conn, true, 0, NULL, 0) < 0) {
- ;
- }
+ streamclose(conn, "End of stream");
recvd = 0; /* end of stream */
break;
default:
@@ -477,7 +476,9 @@ static ssize_t h3_stream_recv(struct connectdata *conn,
*curlcode = (-1 == recvd)? CURLE_AGAIN : CURLE_OK;
if(recvd >= 0)
/* Get this called again to drain the event queue */
- Curl_expire(conn->data, 0, EXPIRE_QUIC);
+ Curl_expire(data, 0, EXPIRE_QUIC);
+
+ data->state.drain = (recvd >= 0) ? 1 : 0;
return recvd;
}
@@ -646,8 +647,10 @@ static CURLcode http_request(struct connectdata *conn, const void *mem,
nva[i].name_len = strlen((char *)nva[i].name);
}
else {
- nva[i].name = (unsigned char *)hdbuf;
nva[i].name_len = (size_t)(end - hdbuf);
+ /* Lower case the header name for HTTP/3 */
+ Curl_strntolower((char *)hdbuf, hdbuf, nva[i].name_len);
+ nva[i].name = (unsigned char *)hdbuf;
}
hdbuf = end + 1;
while(*hdbuf == ' ' || *hdbuf == '\t')