aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/server/sws.c84
1 files changed, 66 insertions, 18 deletions
diff --git a/tests/server/sws.c b/tests/server/sws.c
index b798a682b..bb29a3dc8 100644
--- a/tests/server/sws.c
+++ b/tests/server/sws.c
@@ -31,6 +31,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <stdarg.h>
#include <unistd.h>
#include <signal.h>
#include <time.h>
@@ -115,16 +116,22 @@ static volatile int sigpipe;
static FILE *logfp;
-static void logmsg(const char *msg)
+static void logmsg(const char *msg, ...)
{
- time_t t = time(NULL);
- struct tm *curr_time = localtime(&t);
- char loctime[80];
-
- strcpy(loctime, asctime(curr_time));
- loctime[strlen(loctime) - 1] = '\0';
- fprintf(logfp, "%s: %d: %s\n", loctime, (int)getpid(), msg);
- fflush(logfp);
+ time_t t = time(NULL);
+ va_list ap;
+ struct tm *curr_time = localtime(&t);
+ char loctime[80];
+ char buffer[256]; /* possible overflow if you pass in a huge string */
+
+ va_start(ap, msg);
+ vsprintf(buffer, msg, ap);
+ va_end(ap);
+
+ strcpy(loctime, asctime(curr_time));
+ loctime[strlen(loctime) - 1] = '\0';
+ fprintf(logfp, "%s: %d: %s\n", loctime, (int)getpid(), buffer);
+ fflush(logfp);
}
@@ -221,7 +228,7 @@ void storerequest(char *reqbuf)
#define MAXDOCNAMELEN_TXT "139999"
#define REQUEST_KEYWORD_SIZE 256
-static int get_request(int sock, int *part)
+static int get_request(int sock, int *part, int *open)
{
static char reqbuf[REQBUFSIZ], doc[MAXDOCNAMELEN];
static char request[REQUEST_KEYWORD_SIZE];
@@ -231,6 +238,8 @@ static int get_request(int sock, int *part)
*part = 0; /* part zero equals none */
+ *open = TRUE; /* connection should remain open and wait for more commands */
+
while (offset < REQBUFSIZ) {
int got = recv(sock, reqbuf + offset, REQBUFSIZ - offset, 0);
if (got <= 0) {
@@ -307,16 +316,22 @@ static int get_request(int sock, int *part)
/* If the client is passing this Digest-header, we set the part number
to 1000. Not only to spice up the complexity of this, but to make
Digest stuff to work in the test suite. */
+ logmsg("Received Digest request, sending back data 1000");
*part = 1000;
}
else if(strstr(reqbuf, "Authorization: NTLM TlRMTVNTUAAD")) {
/* If the client is passing this type-3 NTLM header */
+ logmsg("Received NTLM type-3, sending back data 1002");
*part = 1002;
}
else if(strstr(reqbuf, "Authorization: NTLM TlRMTVNTUAAB")) {
/* If the client is passing this type-1 NTLM header */
+ logmsg("Received NTLM type-1, sending back data 1001");
*part = 1001;
}
+
+ if(strstr(reqbuf, "Connection: close"))
+ *open = FALSE; /* close connection after this request */
}
else {
if(sscanf(reqbuf, "CONNECT %" MAXDOCNAMELEN_TXT "s HTTP/%d.%d",
@@ -326,6 +341,9 @@ static int get_request(int sock, int *part)
doc, prot_major, prot_minor);
logmsg(logbuf);
+ if(prot_major*10+prot_minor == 10)
+ *open = FALSE; /* HTTP 1.0 closes connection by default */
+
if(!strncmp(doc, "bad", 3))
/* if the host name starts with bad, we fake an error here */
test_no = DOCNUMBER_BADCONNECT;
@@ -346,8 +364,11 @@ static int get_request(int sock, int *part)
return DOCNUMBER_404;
}
-
-static int send_doc(int sock, int doc, int part_no)
+/* returns -1 on failure */
+static int send_doc(int sock,
+ int doc,
+ int part_no,
+ int *alive) /* keep the connection alive or not */
{
int written;
int count;
@@ -357,12 +378,15 @@ static int send_doc(int sock, int doc, int part_no)
char *cmd=NULL;
int cmdsize=0;
FILE *dump;
+ int persistant = TRUE;
static char weare[256];
char filename[256];
char partbuf[80]="data";
+ *alive = FALSE;
+
if(doc < 0) {
switch(doc) {
case DOCNUMBER_QUIT:
@@ -399,7 +423,7 @@ static int send_doc(int sock, int doc, int part_no)
count = strlen(buffer);
}
else {
- logmsg("Fetch response data");
+ logmsg("Fetch response data, test %d part %d", doc, part_no);
if(0 != part_no)
sprintf(partbuf, "data%d", part_no);
@@ -436,6 +460,14 @@ static int send_doc(int sock, int doc, int part_no)
return -1;
}
+ /* If the word 'swsclose' is present anywhere in the reply chunk, the
+ connection will be closed after the data has been sent to the requesting
+ client... */
+ if(strstr(buffer, "swsclose") || !count) {
+ persistant = FALSE;
+ logmsg("connection close instruction swsclose found in response");
+ }
+
do {
written = send(sock, buffer, count, 0);
if (written < 0) {
@@ -477,6 +509,8 @@ static int send_doc(int sock, int doc, int part_no)
if(cmd)
free(cmd);
+ *alive = persistant;
+
return 0;
}
@@ -541,7 +575,9 @@ int main(int argc, char *argv[])
while (1) {
int doc;
-
+ int open;
+ int alive;
+
msgsock = accept(sock, NULL, NULL);
if (msgsock == -1)
@@ -551,12 +587,24 @@ int main(int argc, char *argv[])
do {
- doc = get_request(msgsock, &part_no);
- logmsg("Received request, now send response");
- send_doc(msgsock, doc, part_no);
+ doc = get_request(msgsock, &part_no, &open);
+ logmsg("Received request, now send response number %d part %d",
+ doc, part_no);
+ send_doc(msgsock, doc, part_no, &alive);
+
+ if((doc < 0) && (doc != DOCNUMBER_CONNECT)) {
+ logmsg("special request received, no persistancy");
+ break;
+ }
+ if(!alive) {
+ logmsg("instructed to close connection after server-reply");
+ break;
+ }
+ if(open)
+ logmsg("persistant connection, awaits new request");
/* if we got a CONNECT, loop and get another request as well! */
- } while(doc == DOCNUMBER_CONNECT);
+ } while(open);
logmsg("Closing client connection");
close(msgsock);