diff --git a/qse/lib/http/httpd-std-dns.h b/qse/lib/http/httpd-std-dns.h index 55d1fd79..a989f04d 100644 --- a/qse/lib/http/httpd-std-dns.h +++ b/qse/lib/http/httpd-std-dns.h @@ -831,9 +831,18 @@ printf (">>tmr_dns_tmout_handle req->>%p\n", req); (!(req->flags & DNS_REQ_AAAA_NX) && req->qaaaalen > 0 && sendto (req->dns_socket, req->qaaaa, req->qaaaalen, 0, (struct sockaddr*)&req->dns_skad, req->dns_skadlen) != req->qaaaalen)) { /* resend failed. fall thru and destroy the request*/ + + /* Unix datagram socket seems to fail with EAGAIN often + * even with increased SO_SNDBUF size. */ + if (dc->httpd->errnum == QSE_HTTPD_EAGAIN && req->dns_retries > 1) + { + /* TODO: check writability of req->urs_socket instead of just retrying... */ + goto send_ok; + } } else { + send_ok: QSE_ASSERT (tmr == dc->httpd->tmr); if (qse_httpd_inserttimerevent (dc->httpd, &tmout_event, &req->tmr_tmout) >= 0) { @@ -992,10 +1001,19 @@ static int dns_send (qse_httpd_t* httpd, qse_httpd_dns_t* dns, const qse_mchar_t (req->qaaaalen > 0 && sendto (req->dns_socket, req->qaaaa, req->qaaaalen, 0, (struct sockaddr*)&req->dns_skad, req->dns_skadlen) != req->qaaaalen)) { qse_httpd_seterrnum (httpd, SKERR_TO_ERRNUM()); - if (httpd->errnum != QSE_HTTPD_EAGAIN || req->dns_retries <= 0) goto oops; - /*goto oops;*/ + /* Unix datagram socket seems to fail with EAGAIN often + * even with increased SO_SNDBUF size. */ + if (httpd->errnum == QSE_HTTPD_EAGAIN && req->dns_retries > 0) + { + /* TODO: check writability of req->urs_socket instead of just retrying... */ + goto send_ok; + } + + goto oops; + } +send_ok: /* NOTE: * if the sequence number is repeated before it timed out or resolved, * the newer request gets chained together with the older one. diff --git a/qse/lib/http/httpd-std-urs.h b/qse/lib/http/httpd-std-urs.h index 955e5141..82158c13 100644 --- a/qse/lib/http/httpd-std-urs.h +++ b/qse/lib/http/httpd-std-urs.h @@ -382,9 +382,19 @@ static void tmr_urs_tmout_handle (qse_tmr_t* tmr, const qse_ntime_t* now, void* if (sendto (req->urs_socket, req->pkt, req->pktlen, 0, (struct sockaddr*)&req->urs_skad, req->urs_skadlen) != req->pktlen) { /* error. fall thru */ + qse_httpd_seterrnum (dc->httpd, SKERR_TO_ERRNUM()); + + /* Unix datagram socket seems to fail with EAGAIN often + * even with increased SO_SNDBUF size. */ + if (dc->httpd->errnum == QSE_HTTPD_EAGAIN && req->urs_retries > 1) + { + /* TODO: check writability of req->urs_socket instead of just retrying... */ + goto send_ok; + } } else { + send_ok: QSE_ASSERT (tmr == dc->httpd->tmr); if (qse_httpd_inserttimerevent (dc->httpd, &tmout_event, &req->tmr_tmout) >= 0) { @@ -533,12 +543,18 @@ static int urs_send (qse_httpd_t* httpd, qse_httpd_urs_t* urs, const qse_mchar_t qse_httpd_seterrnum (httpd, SKERR_TO_ERRNUM()); printf ("URS SENDTO FAILURE........................\n"); /* TODO: logging */ - /* it looks like the EAGAIN is frequently seen on a unix datagram socket + /* Unix datagram socket seems to fail with EAGAIN often * even with increased SO_SNDBUF size. */ - if (httpd->errnum != QSE_HTTPD_EAGAIN || req->urs_retries <= 0) goto oops; - /* goto oops; */ + if (httpd->errnum == QSE_HTTPD_EAGAIN && req->urs_retries > 0) + { + /* TODO: check writability of req->urs_socket instead of just retrying... */ + goto send_ok; + } + + goto oops; } +send_ok: req->dc = dc; /* link the request to the front of the chain */ @@ -548,7 +564,6 @@ printf ("URS SENDTO FAILURE........................\n"); /* TODO: logging */ /* increment the number of pending requests */ dc->req_count++; - return 0; oops: