aboutsummaryrefslogtreecommitdiff
path: root/tests/server
diff options
context:
space:
mode:
Diffstat (limited to 'tests/server')
-rw-r--r--tests/server/sws.c77
1 files changed, 72 insertions, 5 deletions
diff --git a/tests/server/sws.c b/tests/server/sws.c
index 5a2a15574..270c6a3af 100644
--- a/tests/server/sws.c
+++ b/tests/server/sws.c
@@ -66,6 +66,13 @@
/* include memdebug.h last */
#include "memdebug.h"
+/*
+ * The normal sws build for the plain standard curl test suite has no use for
+ * fork(), but if you feel wild and crazy and want to setup some more exotic
+ * tests. Define this and run...
+ */
+/*#define CURL_SWS_FORK_ENABLED 1 */
+
#define REQBUFSIZ 150000
#define REQBUFSIZ_TXT "149999"
@@ -75,6 +82,10 @@ bool prevbounce; /* instructs the server to increase the part number for
a test in case the identical testno+partno request
shows up again */
+#define RCMD_NORMALREQ 0 /* default request, use the tests file normally */
+#define RCMD_IDLE 1 /* told to sit idle */
+#define RCMD_STREAM 2 /* told to stream */
+
struct httprequest {
char reqbuf[REQBUFSIZ]; /* buffer area for the incoming request */
int offset; /* size of the incoming request */
@@ -87,6 +98,8 @@ struct httprequest {
size_t cl; /* Content-Length of the incoming request */
bool digest; /* Authorization digest header found */
bool ntlm; /* Authorization ntlm header found */
+
+ int rcmd; /* doing a special command, see defines above */
};
int ProcessRequest(struct httprequest *req);
@@ -113,6 +126,13 @@ const char *serverlogfile = DEFAULT_LOGFILE;
#define CMD_AUTH_REQUIRED "auth_required"
+/* 'idle' means that it will accept the request fine but never respond
+ any data. Just keep the connection alive. */
+#define CMD_IDLE "idle"
+
+/* 'stream' means to send a never-ending stream of data */
+#define CMD_STREAM "stream"
+
#define END_OF_HEADERS "\r\n\r\n"
enum {
@@ -256,6 +276,15 @@ int ProcessRequest(struct httprequest *req)
logmsg("instructed to require authorization header");
req->auth_req = TRUE;
}
+ else if(!strncmp(CMD_IDLE, cmd, strlen(CMD_IDLE))) {
+ logmsg("instructed to idle");
+ req->rcmd = RCMD_IDLE;
+ req->open = TRUE;
+ }
+ else if(!strncmp(CMD_STREAM, cmd, strlen(CMD_STREAM))) {
+ logmsg("instructed to stream");
+ req->rcmd = RCMD_STREAM;
+ }
free(cmd);
}
}
@@ -356,7 +385,7 @@ int ProcessRequest(struct httprequest *req)
/* If the client is passing this type-3 NTLM header */
req->partno += 1002;
req->ntlm = TRUE; /* NTLM found */
- logmsg("Received NTLM type-3, xxxxxxxxxxxxx sending back data %d", req->partno);
+ logmsg("Received NTLM type-3, sending back data %d", req->partno);
if(req->cl) {
logmsg(" Expecting %d POSTed bytes", req->cl);
}
@@ -478,10 +507,30 @@ static int send_doc(int sock, struct httprequest *req)
char partbuf[80]="data";
- req->open = FALSE;
-
logmsg("Send response number %d part %d", req->testno, req->partno);
+ switch(req->rcmd) {
+ default:
+ case RCMD_NORMALREQ:
+ break; /* continue with business as usual */
+ case RCMD_STREAM:
+#define STREAMTHIS "a string to stream 01234567890\n"
+ count = strlen(STREAMTHIS);
+ while(1) {
+ written = swrite(sock, STREAMTHIS, count);
+ if(written != (int)count) {
+ logmsg("Stopped streaming");
+ return -1;
+ }
+ }
+ break;
+ case RCMD_IDLE:
+ /* Do nothing. Sit idle. Pretend it rains. */
+ return 0;
+ }
+
+ req->open = FALSE;
+
if(req->testno < 0) {
switch(req->testno) {
case DOCNUMBER_QUIT:
@@ -752,9 +801,24 @@ int main(int argc, char *argv[])
while (1) {
msgsock = accept(sock, NULL, NULL);
- if (msgsock == -1)
- continue;
+ if (msgsock == -1) {
+ printf("MAJOR ERROR: accept() failed!\n");
+ break;
+ }
+
+#ifdef CURL_SWS_FORK_ENABLED
+ /* The fork enabled version just forks off the child and don't care
+ about it anymore, so don't assume otherwise. Beware and don't do
+ this at home. */
+ rc = fork();
+ if(-1 == rc) {
+ printf("MAJOR ERROR: fork() failed!\n");
+ break;
+ }
+ /* 0 is returned to the child */
+ if(0 == rc) {
+#endif
logmsg("====> Client connect");
do {
@@ -792,6 +856,9 @@ int main(int argc, char *argv[])
if (req.testno == DOCNUMBER_QUIT)
break;
+#ifdef CURL_SWS_FORK_ENABLED
+ }
+#endif
}
sclose(sock);