diff options
Diffstat (limited to 'lib/vquic/quiche.c')
-rw-r--r-- | lib/vquic/quiche.c | 33 |
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') |