diff --git a/Makefile b/Makefile index cbb8deadf..a8a43b4fb 100644 --- a/Makefile +++ b/Makefile @@ -268,7 +268,7 @@ unittest: prepare $(CXX) -g -Wall -O0 -std=c++11 -I. -Ibase -o bin/hthread_test unittest/hthread_test.cpp -pthread $(CC) -g -Wall -O0 -std=c99 -I. -Ibase -o bin/hmutex_test unittest/hmutex_test.c base/htime.c -pthread $(CC) -g -Wall -O0 -std=c99 -I. -Ibase -o bin/connect_test unittest/connect_test.c base/hsocket.c base/htime.c - $(CC) -g -Wall -O0 -std=c99 -I. -Ibase -o bin/socketpair_test unittest/socketpair_test.c base/hsocket.c + $(CC) -g -Wall -O0 -std=c99 -I. -Ibase -o bin/socketpair_test unittest/socketpair_test.c base/hsocket.c base/htime.c $(CC) -g -Wall -O0 -std=c99 -I. -Iutil -o bin/base64 unittest/base64_test.c util/base64.c $(CC) -g -Wall -O0 -std=c99 -I. -Iutil -o bin/md5 unittest/md5_test.c util/md5.c $(CC) -g -Wall -O0 -std=c99 -I. -Iutil -o bin/sha1 unittest/sha1_test.c util/sha1.c @@ -282,10 +282,10 @@ unittest: prepare $(CXX) -g -Wall -O0 -std=c++11 -I. -Ibase -Icpputil -o bin/threadpool_test unittest/threadpool_test.cpp -pthread $(CXX) -g -Wall -O0 -std=c++11 -I. -Ibase -Icpputil -o bin/objectpool_test unittest/objectpool_test.cpp -pthread $(CXX) -g -Wall -O0 -std=c++11 -I. -Ibase -Issl -Ievent -Ievpp -Icpputil -Ihttp -Ihttp/client -Ihttp/server -o bin/sizeof_test unittest/sizeof_test.cpp - $(CC) -g -Wall -O0 -std=c99 -I. -Ibase -Iprotocol -o bin/nslookup unittest/nslookup_test.c protocol/dns.c base/hsocket.c + $(CC) -g -Wall -O0 -std=c99 -I. -Ibase -Iprotocol -o bin/nslookup unittest/nslookup_test.c protocol/dns.c base/hsocket.c base/htime.c $(CC) -g -Wall -O0 -std=c99 -I. -Ibase -Iprotocol -o bin/ping unittest/ping_test.c protocol/icmp.c base/hsocket.c base/htime.c -DPRINT_DEBUG - $(CC) -g -Wall -O0 -std=c99 -I. -Ibase -Iprotocol -o bin/ftp unittest/ftp_test.c protocol/ftp.c base/hsocket.c - $(CC) -g -Wall -O0 -std=c99 -I. -Ibase -Iprotocol -Iutil -o bin/sendmail unittest/sendmail_test.c protocol/smtp.c base/hsocket.c util/base64.c + $(CC) -g -Wall -O0 -std=c99 -I. -Ibase -Iprotocol -o bin/ftp unittest/ftp_test.c protocol/ftp.c base/hsocket.c base/htime.c + $(CC) -g -Wall -O0 -std=c99 -I. -Ibase -Iprotocol -Iutil -o bin/sendmail unittest/sendmail_test.c protocol/smtp.c base/hsocket.c base/htime.c util/base64.c run-unittest: unittest bash scripts/unittest.sh diff --git a/base/hsocket.c b/base/hsocket.c index 6131d23d2..c6f023db1 100644 --- a/base/hsocket.c +++ b/base/hsocket.c @@ -1,6 +1,7 @@ #include "hsocket.h" #include "hdef.h" +#include "htime.h" #ifdef OS_UNIX #include @@ -339,9 +340,16 @@ int ConnectNonblock(const char* host, int port) { } int ConnectTimeout(const char* host, int port, int ms) { + unsigned int start_time = gettick_ms(); int connfd = Connect(host, port, 1); if (connfd < 0) return connfd; - return ConnectFDTimeout(connfd, ms); + unsigned int elapsed = gettick_ms() - start_time; + int remaining = ms - (int)elapsed; + if (remaining <= 0) { + closesocket(connfd); + return -ETIMEDOUT; + } + return ConnectFDTimeout(connfd, remaining); } #ifdef ENABLE_UDS diff --git a/http/client/HttpClient.cpp b/http/client/HttpClient.cpp index 0960b682b..a05336e63 100644 --- a/http/client/HttpClient.cpp +++ b/http/client/HttpClient.cpp @@ -211,6 +211,7 @@ int http_client_connect(http_client_t* cli, const char* host, int port, int http if (timeout > 0) { blocktime = MIN(timeout*1000, blocktime); } + unsigned int start_time = gettick_ms(); int connfd = ConnectTimeout(host, port, blocktime); if (connfd < 0) { hloge("connect %s:%d failed!", host, port); @@ -241,7 +242,15 @@ int http_client_connect(http_client_t* cli, const char* host, int port, int http if (!is_ipaddr(host)) { hssl_set_sni_hostname(cli->ssl, host); } - so_rcvtimeo(connfd, blocktime); + unsigned int elapsed = gettick_ms() - start_time; + int ssl_timeout = blocktime - (int)elapsed; + if (ssl_timeout <= 0) { + hssl_free(cli->ssl); + cli->ssl = NULL; + closesocket(connfd); + return NABS(ETIMEDOUT); + } + so_rcvtimeo(connfd, ssl_timeout); int ret = hssl_connect(cli->ssl); if (ret != 0) { fprintf(stderr, "* ssl handshake failed: %d\n", ret); @@ -321,6 +330,12 @@ static int http_client_exec(http_client_t* cli, HttpRequest* req, HttpResponse* } } + char recvbuf[1024] = {0}; + char* data = NULL; + size_t len = 0; + int total_nsend, nsend, nrecv; + total_nsend = nsend = nrecv = 0; + if (connfd <= 0 || cli->host != req->host || cli->port != req->port) { cli->host = req->host; cli->port = req->port; @@ -329,15 +344,13 @@ static int http_client_exec(http_client_t* cli, HttpRequest* req, HttpResponse* if (connfd < 0) { return connfd; } + CHECK_TIMEOUT } cli->parser->SubmitRequest(req); - char recvbuf[1024] = {0}; - int total_nsend, nsend, nrecv; - total_nsend = nsend = nrecv = 0; send: - char* data = NULL; - size_t len = 0; + data = NULL; + len = 0; while (cli->parser->GetSendData(&data, &len)) { total_nsend = 0; while (total_nsend < len) { diff --git a/unittest/CMakeLists.txt b/unittest/CMakeLists.txt index 4e469e602..2eec34790 100644 --- a/unittest/CMakeLists.txt +++ b/unittest/CMakeLists.txt @@ -28,7 +28,7 @@ target_link_libraries(hmutex_test -lpthread) add_executable(connect_test connect_test.c ../base/hsocket.c ../base/htime.c) target_include_directories(connect_test PRIVATE .. ../base) -add_executable(socketpair_test socketpair_test.c ../base/hsocket.c) +add_executable(socketpair_test socketpair_test.c ../base/hsocket.c ../base/htime.c) target_include_directories(socketpair_test PRIVATE .. ../base) # ------util------ @@ -73,17 +73,17 @@ target_include_directories(objectpool_test PRIVATE .. ../base ../cpputil) target_link_libraries(objectpool_test -lpthread) # ------protocol------ -add_executable(nslookup nslookup_test.c ../protocol/dns.c) +add_executable(nslookup nslookup_test.c ../protocol/dns.c ../base/hsocket.c ../base/htime.c) target_include_directories(nslookup PRIVATE .. ../base ../protocol) add_executable(ping ping_test.c ../protocol/icmp.c ../base/hsocket.c ../base/htime.c) target_compile_definitions(ping PRIVATE -DPRINT_DEBUG) target_include_directories(ping PRIVATE .. ../base ../protocol) -add_executable(ftp ftp_test.c ../protocol/ftp.c ../base/hsocket.c) +add_executable(ftp ftp_test.c ../protocol/ftp.c ../base/hsocket.c ../base/htime.c) target_include_directories(ftp PRIVATE .. ../base ../protocol) -add_executable(sendmail sendmail_test.c ../protocol/smtp.c ../base/hsocket.c ../util/base64.c) +add_executable(sendmail sendmail_test.c ../protocol/smtp.c ../base/hsocket.c ../base/htime.c ../util/base64.c) target_include_directories(sendmail PRIVATE .. ../base ../protocol ../util) if(UNIX)