servers: deduplicate `storerequest()` across two servers
No binary (build failed)
—
(log yok)
| @@ -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 | |
| @@ -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; | |
| @@ -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; | |
| } | |
| @@ -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); | |