From: Viktor Szakats Date: Tue, 16 Jun 2026 09:44:18 +0000 (+0200) Subject: servers: deduplicate `storerequest()` across two servers X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=HEAD;p=thirdparty%2Fcurl.git servers: deduplicate `storerequest()` across two servers Closes #22041 --- diff --git a/tests/server/first.h b/tests/server/first.h index ad5cec41b3..3bd75a2d88 100644 --- a/tests/server/first.h +++ b/tests/server/first.h @@ -141,6 +141,8 @@ extern int write_pidfile(const char *filename); extern int write_portfile(const char *filename, int port); extern void set_advisor_read_lock(const char *filename); extern void clear_advisor_read_lock(const char *filename); +extern void storerequest(const char *reqbuf, size_t totalsize, + const char *filename); static volatile int got_exit_signal = 0; static volatile int exit_signal = 0; #ifdef _WIN32 diff --git a/tests/server/rtspd.c b/tests/server/rtspd.c index d6d32ddac2..36973185ed 100644 --- a/tests/server/rtspd.c +++ b/tests/server/rtspd.c @@ -544,61 +544,6 @@ static int rtspd_ProcessRequest(struct rtspd_httprequest *req) return 1; /* done */ } -/* store the entire request in a file */ -static void rtspd_storerequest(const char *reqbuf, size_t totalsize) -{ - int error = 0; - char errbuf[STRERROR_LEN]; - size_t written; - size_t writeleft; - FILE *dump; - char dumpfile[256]; - - snprintf(dumpfile, sizeof(dumpfile), "%s/%s", logdir, REQUEST_DUMP); - - if(!reqbuf) - return; - if(totalsize == 0) - return; - - do { - dump = curlx_fopen(dumpfile, "ab"); - /* !checksrc! disable ERRNOVAR 1 */ - } while(!dump && ((error = errno) == EINTR)); - if(!dump) { - logmsg("Error opening file %s error (%d) %s", dumpfile, - error, curlx_strerror(error, errbuf, sizeof(errbuf))); - logmsg("Failed to write request input to %s", dumpfile); - return; - } - - writeleft = totalsize; - do { - written = fwrite(&reqbuf[totalsize - writeleft], 1, writeleft, dump); - if(got_exit_signal) - goto storerequest_cleanup; - if(written > 0) - writeleft -= written; - error = errno; - /* !checksrc! disable ERRNOVAR 1 */ - } while((writeleft > 0) && (error == EINTR)); - - if(writeleft == 0) - logmsg("Wrote request (%zu bytes) input to %s", totalsize, dumpfile); - else if(writeleft > 0) { - logmsg("Error writing file %s error (%d) %s", dumpfile, - error, curlx_strerror(error, errbuf, sizeof(errbuf))); - logmsg("Wrote only (%zu bytes) of (%zu bytes) request input to %s", - totalsize - writeleft, totalsize, dumpfile); - } - -storerequest_cleanup: - - if(curlx_fclose(dump)) - logmsg("Error closing file %s error (%d) %s", dumpfile, - errno, curlx_strerror(errno, errbuf, sizeof(errbuf))); -} - /* return 0 on success, non-zero on failure */ static int rtspd_get_request(curl_socket_t sock, struct rtspd_httprequest *req) { @@ -671,7 +616,7 @@ static int rtspd_get_request(curl_socket_t sock, struct rtspd_httprequest *req) if(fail) { /* dump the request received so far to the external file */ reqbuf[req->offset] = '\0'; - rtspd_storerequest(reqbuf, req->offset); + storerequest(reqbuf, req->offset, REQUEST_DUMP); return 1; } @@ -706,7 +651,8 @@ static int rtspd_get_request(curl_socket_t sock, struct rtspd_httprequest *req) reqbuf[req->offset] = '\0'; /* dump the request to an external file */ - rtspd_storerequest(reqbuf, req->pipelining ? req->checkindex : req->offset); + storerequest(reqbuf, req->pipelining ? req->checkindex : req->offset, + REQUEST_DUMP); if(got_exit_signal) return 1; diff --git a/tests/server/sws.c b/tests/server/sws.c index dc376a70f5..04e6025fa5 100644 --- a/tests/server/sws.c +++ b/tests/server/sws.c @@ -100,6 +100,9 @@ static size_t num_sockets = 0; #define REQUEST_PROXY_DUMP "proxy.input" #define RESPONSE_PROXY_DUMP "proxy.response" +#define REQUEST_DUMP_FILENAME \ + (is_proxy ? REQUEST_PROXY_DUMP : REQUEST_DUMP) + /* file in which additional instructions may be found */ static const char *cmdfile = "log/server.cmd"; @@ -739,62 +742,6 @@ static int sws_ProcessRequest(struct sws_httprequest *req) return 1; /* done */ } -/* store the entire request in a file */ -static void sws_storerequest(const char *reqbuf, size_t totalsize) -{ - int error = 0; - char errbuf[STRERROR_LEN]; - size_t written; - size_t writeleft; - FILE *dump; - char dumpfile[256]; - - snprintf(dumpfile, sizeof(dumpfile), "%s/%s", - logdir, is_proxy ? REQUEST_PROXY_DUMP : REQUEST_DUMP); - - if(!reqbuf) - return; - if(totalsize == 0) - return; - - do { - dump = curlx_fopen(dumpfile, "ab"); - /* !checksrc! disable ERRNOVAR 1 */ - } while(!dump && ((error = errno) == EINTR)); - if(!dump) { - logmsg("[2] Error opening file %s error (%d) %s", dumpfile, - error, curlx_strerror(error, errbuf, sizeof(errbuf))); - logmsg("Failed to write request input "); - return; - } - - writeleft = totalsize; - do { - written = fwrite(&reqbuf[totalsize - writeleft], 1, writeleft, dump); - if(got_exit_signal) - goto storerequest_cleanup; - if(written > 0) - writeleft -= written; - error = errno; - /* !checksrc! disable ERRNOVAR 1 */ - } while((writeleft > 0) && (error == EINTR)); - - if(writeleft == 0) - logmsg("Wrote request (%zu bytes) input to %s", totalsize, dumpfile); - else if(writeleft > 0) { - logmsg("Error writing file %s error (%d) %s", dumpfile, - error, curlx_strerror(error, errbuf, sizeof(errbuf))); - logmsg("Wrote only (%zu bytes) of (%zu bytes) request input to %s", - totalsize - writeleft, totalsize, dumpfile); - } - -storerequest_cleanup: - - if(curlx_fclose(dump)) - logmsg("Error closing file %s error (%d) %s", dumpfile, - errno, curlx_strerror(errno, errbuf, sizeof(errbuf))); -} - /* returns -1 on failure */ static int sws_send_doc(curl_socket_t sock, struct sws_httprequest *req) { @@ -1114,7 +1061,7 @@ static int sws_get_request(curl_socket_t sock, struct sws_httprequest *req) /* dump the request received so far to the external file */ reqbuf[req->offset] = '\0'; - sws_storerequest(reqbuf, req->offset); + storerequest(reqbuf, req->offset, REQUEST_DUMP_FILENAME); req->offset = 0; /* read websocket traffic */ @@ -1157,7 +1104,7 @@ static int sws_get_request(curl_socket_t sock, struct sws_httprequest *req) logmsg("log the websocket traffic"); /* dump the incoming websocket traffic to the external file */ reqbuf[req->offset] = '\0'; - sws_storerequest(reqbuf, req->offset); + storerequest(reqbuf, req->offset, REQUEST_DUMP_FILENAME); req->offset = 0; } init_httprequest(req); @@ -1199,7 +1146,7 @@ static int sws_get_request(curl_socket_t sock, struct sws_httprequest *req) if(fail) { /* dump the request received so far to the external file */ reqbuf[req->offset] = '\0'; - sws_storerequest(reqbuf, req->offset); + storerequest(reqbuf, req->offset, REQUEST_DUMP_FILENAME); return -1; } @@ -1230,7 +1177,7 @@ static int sws_get_request(curl_socket_t sock, struct sws_httprequest *req) /* at the end of a request dump it to an external file */ if(fail || req->done_processing) - sws_storerequest(reqbuf, req->offset); + storerequest(reqbuf, req->offset, REQUEST_DUMP_FILENAME); if(got_exit_signal) return -1; @@ -2379,7 +2326,7 @@ static int test_sws(int argc, const char *argv[]) if(req->connmon) { const char *keepopen = "[DISCONNECT]\n"; - sws_storerequest(keepopen, strlen(keepopen)); + storerequest(keepopen, strlen(keepopen), REQUEST_DUMP_FILENAME); req->connmon = FALSE; } diff --git a/tests/server/util.c b/tests/server/util.c index a6511598dc..77d635a9e9 100644 --- a/tests/server/util.c +++ b/tests/server/util.c @@ -268,6 +268,60 @@ void clear_advisor_read_lock(const char *filename) } } +/* store the entire request in a file */ +void storerequest(const char *reqbuf, size_t totalsize, const char *filename) +{ + int error = 0; + char errbuf[STRERROR_LEN]; + size_t written; + size_t writeleft; + FILE *dump; + char dumpfile[256]; + + snprintf(dumpfile, sizeof(dumpfile), "%s/%s", logdir, filename); + + if(!reqbuf) + return; + if(totalsize == 0) + return; + + do { + dump = curlx_fopen(dumpfile, "ab"); + /* !checksrc! disable ERRNOVAR 1 */ + } while(!dump && ((error = errno) == EINTR)); + if(!dump) { + logmsg("storerequest: Error opening file %s error (%d) %s", dumpfile, + error, curlx_strerror(error, errbuf, sizeof(errbuf))); + return; + } + + writeleft = totalsize; + do { + written = fwrite(&reqbuf[totalsize - writeleft], 1, writeleft, dump); + if(got_exit_signal) + goto storerequest_cleanup; + if(written > 0) + writeleft -= written; + error = errno; + /* !checksrc! disable ERRNOVAR 1 */ + } while((writeleft > 0) && (error == EINTR)); + + if(writeleft == 0) + logmsg("Wrote request (%zu bytes) input to %s", totalsize, dumpfile); + else if(writeleft > 0) { + logmsg("Error writing file %s error (%d) %s", dumpfile, + error, curlx_strerror(error, errbuf, sizeof(errbuf))); + logmsg("Wrote only (%zu bytes) of (%zu bytes) request input to %s", + totalsize - writeleft, totalsize, dumpfile); + } + +storerequest_cleanup: + + if(curlx_fclose(dump)) + logmsg("Error closing file %s error (%d) %s", dumpfile, + errno, curlx_strerror(errno, errbuf, sizeof(errbuf))); +} + /* vars used to keep around previous signal handlers */ typedef void (*SIGHANDLER_T)(int);