You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
86 lines
2.4 KiB
86 lines
2.4 KiB
/*
|
|
Cgi routines as used by the tests in the html/test subdirectory.
|
|
*/
|
|
|
|
/*
|
|
* ----------------------------------------------------------------------------
|
|
* "THE BEER-WARE LICENSE" (Revision 42):
|
|
* Jeroen Domburg <jeroen@spritesmods.com> wrote this file. As long as you retain
|
|
* this notice you can do whatever you want with this stuff. If we meet some day,
|
|
* and you think this stuff is worth it, you can buy me a beer in return.
|
|
* ----------------------------------------------------------------------------
|
|
*/
|
|
|
|
|
|
#include <esp8266.h>
|
|
#include "cgi-test.h"
|
|
|
|
|
|
typedef struct {
|
|
int len;
|
|
int sendPos;
|
|
} TestbedState;
|
|
|
|
|
|
httpd_cgi_state ICACHE_FLASH_ATTR cgiTestbed(HttpdConnData *connData) {
|
|
char buff[1024];
|
|
int first=0;
|
|
int l, x;
|
|
TestbedState *state=(TestbedState*)connData->cgiData;
|
|
|
|
if (connData->conn==NULL) {
|
|
//Connection aborted. Clean up.
|
|
if (state) free(state);
|
|
return HTTPD_CGI_DONE;
|
|
}
|
|
|
|
if (state==NULL) {
|
|
//First call
|
|
state=malloc(sizeof(TestbedState));
|
|
memset(state, 0, sizeof(state));
|
|
connData->cgiData=state;
|
|
first=1;
|
|
}
|
|
|
|
if (connData->requestType==HTTPD_METHOD_GET) {
|
|
if (first) {
|
|
httpdStartResponse(connData, 200);
|
|
httpdHeader(connData, "content-type", "application/data");
|
|
httpdEndHeaders(connData);
|
|
l=httpdFindArg(connData->getArgs, "len", buff, sizeof(buff));
|
|
state->len=1024;
|
|
if (l!=-1) state->len=atoi(buff);
|
|
state->sendPos=0;
|
|
return HTTPD_CGI_MORE;
|
|
} else {
|
|
l=sizeof(buff);
|
|
if (l>(state->len-state->sendPos)) l=(state->len-state->sendPos);
|
|
//Fill with semi-random data
|
|
for (x=0; x<l; x++) buff[x]=((x^(state->sendPos>>10))&0x1F)+'0';
|
|
httpdSend(connData, buff, l);
|
|
state->sendPos+=l;
|
|
printf("Test: Uploaded %d/%d bytes\n", state->sendPos, state->len);
|
|
if (state->len<=state->sendPos) {
|
|
if (state) free(state);
|
|
return HTTPD_CGI_DONE;
|
|
} else {
|
|
return HTTPD_CGI_MORE;
|
|
}
|
|
}
|
|
}
|
|
if (connData->requestType==HTTPD_METHOD_POST) {
|
|
if (connData->post->len!=connData->post->received) {
|
|
//Still receiving data. Ignore this.
|
|
printf("Test: got %d/%d bytes\n", connData->post->received, connData->post->len);
|
|
return HTTPD_CGI_MORE;
|
|
} else {
|
|
httpdStartResponse(connData, 200);
|
|
httpdHeader(connData, "content-type", "text/plain");
|
|
httpdEndHeaders(connData);
|
|
l=sprintf(buff, "%d", connData->post->received);
|
|
httpdSend(connData, buff, l);
|
|
return HTTPD_CGI_DONE;
|
|
}
|
|
}
|
|
return HTTPD_CGI_DONE;
|
|
}
|
|
|