diff options
| -rw-r--r-- | tests/server/sws.c | 40 | 
1 files changed, 32 insertions, 8 deletions
| diff --git a/tests/server/sws.c b/tests/server/sws.c index c7d11c55e..fa93b1342 100644 --- a/tests/server/sws.c +++ b/tests/server/sws.c @@ -74,15 +74,20 @@  #define REQBUFSIZ 150000  #define REQBUFSIZ_TXT "149999" +long prevtestno=-1; /* previous test number we served */ +long prevpartno=-1; /* previous part number we served */ +bool prevbounce;    /* instructs the server to increase the part number for +                       a test in case the identical testno+partno request +                       shows up again */ +  struct httprequest {    char reqbuf[REQBUFSIZ]; /* buffer area for the incoming request */    int offset;     /* size of the incoming request */    long testno;     /* test number found in the request */ -  int partno;     /* part number found in the request */ +  long partno;     /* part number found in the request */    int open;       /* keep connection open info, as found in the request */    bool auth_req;  /* authentication required, don't wait for body unless                       there's an Authorization header */ -    bool auth;      /* Authorization header present in the incoming request */    size_t cl;      /* Content-Length of the incoming request */    bool digest;    /* Authorization digest header found */ @@ -226,8 +231,6 @@ int ProcessRequest(struct httprequest *req)      if(ptr) {        FILE *stream;        char *filename; -      char *cmd = NULL; -      size_t cmdsize = 0;        if((strlen(doc) + strlen(request)) < 200)          sprintf(logbuf, "Got request: %s %s HTTP/%d.%d", @@ -260,7 +263,7 @@ int ProcessRequest(struct httprequest *req)        else          req->partno = 0; -      sprintf(logbuf, "Reqested test number %ld part %d", +      sprintf(logbuf, "Reqested test number %ld part %ld",                req->testno, req->partno);        logmsg(logbuf); @@ -273,6 +276,9 @@ int ProcessRequest(struct httprequest *req)          return 0;        }        else {     +        char *cmd = NULL; +        size_t cmdsize = 0; +          /* get the custom server control "commands" */          cmd = (char *)spitout(stream, "reply", "servercmd", &cmdsize);          fclose(stream); @@ -284,6 +290,7 @@ int ProcessRequest(struct httprequest *req)              logmsg("instructed to require authorization header");              req->auth_req = TRUE;            } +          free(cmd);          }        }      } @@ -392,7 +399,7 @@ int ProcessRequest(struct httprequest *req)    }    if(strstr(req->reqbuf, "Connection: close"))      req->open = FALSE; /* close connection after this request */ -   +    if(req->cl && (req->auth || !req->auth_req)) {      if(req->cl <= strlen(end+strlen(END_OF_HEADERS)))        return 1; /* done */ @@ -426,7 +433,6 @@ static int get_request(int sock, struct httprequest *req)    char *reqbuf = req->reqbuf;    /*** Init the httpreqest structure properly for the upcoming request ***/ -    memset(req, 0, sizeof(struct httprequest));    /* here's what should not be 0 from the start */ @@ -530,7 +536,7 @@ static int send_doc(int sock, struct httprequest *req)      char *filename = test2file(req->testno);      if(0 != req->partno) -      sprintf(partbuf, "data%d", req->partno); +      sprintf(partbuf, "data%ld", req->partno);      stream=fopen(filename, "rb");      if(!stream) { @@ -569,6 +575,12 @@ static int send_doc(int sock, struct httprequest *req)      persistant = FALSE;      logmsg("connection close instruction swsclose found in response");    } +  if(strstr(buffer, "swsbounce")) { +    prevbounce = TRUE; +    logmsg("enable \"swsbounce\" in the next request"); +  } +  else +    prevbounce = FALSE;    do {      written = swrite(sock, buffer, count); @@ -613,6 +625,9 @@ static int send_doc(int sock, struct httprequest *req)    req->open = persistant; +  prevtestno = req->testno; +  prevpartno = req->partno; +    return 0;  } @@ -734,6 +749,15 @@ int main(int argc, char *argv[])          /* non-zero means error, break out of loop */          break; +      if(prevbounce) { +        /* bounce treatment requested */ +        if((req.testno == prevtestno) && +           (req.partno == prevpartno)) { +          req.partno++; +          logmsg("BOUNCE part number to %ld", req.partno); +        } +      } +        send_doc(msgsock, &req);        if((req.testno < 0) && (req.testno != DOCNUMBER_CONNECT)) { | 
