From d231dd62b33495eb62d788d2067c9777a76a4c95 Mon Sep 17 00:00:00 2001 From: Matthew Date: Sun, 25 Aug 2024 22:06:19 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/webclient.c | 69 +++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 56 insertions(+), 13 deletions(-) diff --git a/src/webclient.c b/src/webclient.c index ddb83c3..eb9a709 100644 --- a/src/webclient.c +++ b/src/webclient.c @@ -30,8 +30,13 @@ #include #include #else +#ifdef _WIN32 +#include +#include +#else #include #include +#endif #endif /* RT_USING_SAL */ #define DBG_ENABLE @@ -42,7 +47,9 @@ #define DBG_LEVEL DBG_INFO #endif /* WEBCLIENT_DEBUG */ #define DBG_COLOR +#ifndef _WIN32 #include +#endif /* default receive or send timeout */ #define WEBCLIENT_DEFAULT_TIMEO 6 @@ -123,8 +130,26 @@ static int webclient_read_line(struct webclient_session *session, char *buffer, continue; } #endif - if (rc <= 0) - return rc; + + if (rc < 0) + { +#ifdef _WIN32 + int err = WSAGetLastError(); + if (err == WSAEWOULDBLOCK || err == WSATRY_AGAIN || err == WSAEINTR || err == WSAETIMEDOUT) +#else + int err = errno; + if (err == EWOULDBLOCK || err == EAGAIN || err == EINTR) +#endif + { + continue; + } + + return rc; + } + else if (rc == 0) + { + return rc; + } if (ch == '\n' && last_ch == '\r') break; @@ -377,7 +402,7 @@ static int webclient_open_tls(struct webclient_session *session, const char *URI * @return <0: connect failed or other error * =0: connect success */ -static int webclient_connect(struct webclient_session *session, const char *URI) +int webclient_connect(struct webclient_session *session, const char *URI) { int rc = WEBCLIENT_OK; int socket_handle; @@ -629,7 +654,7 @@ int webclient_content_length_get(struct webclient_session *session) return session->content_length; } -static int webclient_send_header(struct webclient_session *session, int method) +int webclient_send_header(struct webclient_session *session, int method) { int rc = WEBCLIENT_OK; char *header = RT_NULL; @@ -1327,7 +1352,13 @@ int webclient_read(struct webclient_session *session, void *buffer, size_t lengt bytes_read = webclient_recv(session, buffer, length, 0); if (bytes_read <= 0) { - if (errno == EWOULDBLOCK || errno == EAGAIN) +#ifdef _WIN32 + int err = WSAGetLastError(); + if (err == WSAEWOULDBLOCK || err == WSATRY_AGAIN || err == WSAEINTR || err == WSAETIMEDOUT) +#else + int err = errno; + if (err == EWOULDBLOCK || err == EAGAIN || err == EINTR) +#endif { /* recv timeout */ return -WEBCLIENT_TIMEOUT; @@ -1382,19 +1413,25 @@ int webclient_read(struct webclient_session *session, void *buffer, size_t lengt #endif LOG_D("receive data error(%d).", bytes_read); +#ifdef _WIN32 + int err = WSAGetLastError(); + if (err == WSAEWOULDBLOCK || err == WSATRY_AGAIN || err == WSAEINTR || err == WSAETIMEDOUT) +#else + int err = errno; + if (err == EWOULDBLOCK || err == EAGAIN || err == EINTR) +#endif + { + /* recv timeout */ + LOG_E("receive data timeout."); + continue; + } + if (total_read) { break; } else { - if (errno == EWOULDBLOCK || errno == EAGAIN) - { - /* recv timeout */ - LOG_E("receive data timeout."); - return -WEBCLIENT_TIMEOUT; - } - else { closesocket(session->socket); session->socket = -1; @@ -1458,7 +1495,13 @@ int webclient_write(struct webclient_session *session, const void *buffer, size_ continue; } #endif - if (errno == EWOULDBLOCK || errno == EAGAIN) +#ifdef _WIN32 + int err = WSAGetLastError(); + if (err == WSAEWOULDBLOCK || err == WSATRY_AGAIN || err == WSAEINTR || err == WSAETIMEDOUT) +#else + int err = errno; + if (err == EWOULDBLOCK || err == EAGAIN || err == EINTR) +#endif { /* send timeout */ if (total_write)