tReport CURL errors - vaccinewars - be a doctor and try to vaccinate the world (HTM) git clone git://src.adamsgaard.dk/vaccinewars (DIR) Log (DIR) Files (DIR) Refs (DIR) README (DIR) LICENSE --- (DIR) commit fb612bd25fece6710f09075ea0122f36e81dd292 (DIR) parent f024be5e55c9509ff3022d6616eef6c84fe4815a (HTM) Author: Ben Webb <ben@salilab.org> Date: Fri, 30 Oct 2020 00:06:22 -0700 Report CURL errors Diffstat: M src/serverside.c | 91 +++++++++++++++++++++---------- 1 file changed, 62 insertions(+), 29 deletions(-) --- (DIR) diff --git a/src/serverside.c b/src/serverside.c t@@ -168,18 +168,10 @@ static void MetaSocketStatus(NetworkBuffer *NetBuf, #endif #ifdef NETWORKING -static gboolean MetaConnectError(CURL *conn) +static void MetaConnectError(CurlConnection *conn, const char *errstr) { -/*GString *errstr; - - if (!IsHttpError(conn)) - return FALSE; - errstr = g_string_new(""); - g_string_assign_error(errstr, MetaConn->NetBuf.error); - dopelog(1, LF_SERVER, _("Failed to connect to metaserver at %s:%u (%s)"), - MetaServer.Name, MetaServer.Port, errstr->str); - g_string_free(errstr, TRUE);*/ - return TRUE; + dopelog(1, LF_SERVER, _("Failed to connect to metaserver at %s (%s)"), + MetaServer.URL, errstr); } void CurlInit(CurlConnection *conn) t@@ -211,7 +203,30 @@ void CurlCleanup(CurlConnection *conn) curl_global_cleanup(); } -gboolean OpenCurlConnection(CurlConnection *conn, char *URL, char *body) +const char *CurlConnectionPerform(CurlConnection *conn, int *still_running) +{ + CURLMcode mres; + struct CURLMsg *m; + + mres = curl_multi_perform(conn->multi, still_running); + if (mres != CURLM_OK && mres != CURLM_CALL_MULTI_PERFORM) { + CloseCurlConnection(conn); + return curl_multi_strerror(mres); + } + + do { + int msgq = 0; + m = curl_multi_info_read(conn->multi, &msgq); + if (m && m->msg == CURLMSG_DONE && m->data.result != CURLE_OK) { + CloseCurlConnection(conn); + return curl_easy_strerror(m->data.result); + } + } while(m); + + return NULL; +} + +const char *OpenCurlConnection(CurlConnection *conn, char *URL, char *body) { /* If the previous connect hung for so long that it's still active, then * break the connection before we start a new one */ t@@ -220,19 +235,34 @@ gboolean OpenCurlConnection(CurlConnection *conn, char *URL, char *body) } if (conn->h) { + const char *errstr; int still_running; + CURLcode res; + CURLMcode mres; + res = curl_easy_setopt(conn->h, CURLOPT_COPYPOSTFIELDS, body); + if (res != CURLE_OK) return curl_easy_strerror(res); + res = curl_easy_setopt(conn->h, CURLOPT_URL, URL); + if (res != CURLE_OK) return curl_easy_strerror(res); + res = curl_easy_setopt(conn->h, CURLOPT_WRITEFUNCTION, MetaConnWriteFunc); + if (res != CURLE_OK) return curl_easy_strerror(res); + res = curl_easy_setopt(conn->h, CURLOPT_WRITEDATA, conn); + if (res != CURLE_OK) return curl_easy_strerror(res); + conn->data = g_malloc(1); conn->data_size = 0; - curl_easy_setopt(conn->h, CURLOPT_COPYPOSTFIELDS, body); - curl_easy_setopt(conn->h, CURLOPT_URL, URL); - curl_easy_setopt(conn->h, CURLOPT_WRITEFUNCTION, MetaConnWriteFunc); - curl_easy_setopt(conn->h, CURLOPT_WRITEDATA, conn); - curl_multi_add_handle(conn->multi, conn->h); + mres = curl_multi_add_handle(conn->multi, conn->h); + if (mres != CURLM_OK && mres != CURLM_CALL_MULTI_PERFORM) { + g_free(conn->data); + return curl_multi_strerror(mres); + } conn->running = TRUE; - curl_multi_perform(conn->multi, &still_running); - return TRUE; + errstr = CurlConnectionPerform(conn, &still_running); + if (errstr) { + return errstr; + } + return NULL; } else { - return FALSE; + return "Could not init curl"; } } t@@ -296,7 +326,7 @@ void RegisterWithMetaServer(gboolean Up, gboolean SendData, struct HISCORE MultiScore[NUMHISCORE], AntiqueScore[NUMHISCORE]; GString *body; gchar *prstr; - gboolean retval; + const char *errstr; int i; if (!MetaServer.Active || WantQuit || !Server) { t@@ -345,16 +375,14 @@ void RegisterWithMetaServer(gboolean Up, gboolean SendData, } } - retval = OpenCurlConnection(&MetaConn, MetaServer.URL, body->str); + errstr = OpenCurlConnection(&MetaConn, MetaServer.URL, body->str); dopelog(2, LF_SERVER, _("Waiting for connect to metaserver at %s..."), MetaServer.URL); g_string_free(body, TRUE); - -/* MetaConnectError(MetaConn); - CloseHttpConnection(MetaConn); - MetaConn = NULL; - return;*/ + if (errstr) { + MetaConnectError(&MetaConn, errstr); + } /*SetHttpAuthFunc(MetaConn, ServerHttpAuth, NULL); if (Socks.authuser && Socks.authuser[0] && t@@ -1361,7 +1389,12 @@ void ServerLoop(struct CMDLINE *cmdline) #endif if (MetaConn.running) { int still_running; - curl_multi_perform(MetaConn.multi, &still_running); + const char *errstr; + errstr = CurlConnectionPerform(&MetaConn, &still_running); + if (errstr) { + MetaConnectError(&MetaConn, errstr); + if (IsServerShutdown()) + break; // dopelog(2, LF_SERVER, "MetaServer multi_perform: %d", still_running); /* if (RespondToSelect(&MetaConn->NetBuf, &readfs, &writefs, &errorfs, &DoneOK)) { t@@ -1383,7 +1416,7 @@ void ServerLoop(struct CMDLINE *cmdline) if (IsServerShutdown()) break; } */ - if (still_running == 0) { + } else if (still_running == 0) { char *ch = MetaConn.data; while(ch && *ch) { char *sep_pt = strchr(ch, MetaConn.Terminator);