- httpstate *mystate=(httpstate *)arg->state;\r
-\r
- // first check if there was a connection error - if so delete the input/output and state buffers and return immediately\r
- if((arg->flags & SHTTPD_CONNECTION_ERROR)==SHTTPD_CONNECTION_ERROR)\r
- {\r
- if(mystate && mystate->m_indata)\r
- {\r
- delete mystate->m_indata;\r
- mystate->m_indata=NULL;\r
- }\r
- if(mystate && mystate->m_outdata)\r
- {\r
- delete mystate->m_outdata;\r
- mystate->m_outdata=NULL;\r
- }\r
- if(mystate)\r
- {\r
- delete mystate;\r
- mystate=NULL;\r
- }\r
- return true;\r
- }\r
-\r
- // this is a new request - create a new arg object\r
- if(arg->state==NULL)\r
- {\r
- arg->state=new httpstate;\r
- memset(arg->state,0,sizeof(httpstate));\r
- mystate=(httpstate *)arg->state;\r
-\r
- // if post then create input buffer\r
- if(methodstr=="POST")\r
- {\r
- const char *lenstr=shttpd_get_header(arg,"Content-Length");\r
- if(lenstr)\r
- {\r
- long len=0;\r
- StringFunctions::Convert(std::string(lenstr),len);\r
- mystate->m_indata=new char[len+1];\r
- mystate->m_indata[len]='\0';\r
- mystate->m_indatalen=len;\r
- mystate->m_indatapos=0;\r
- }\r
- }\r
- }\r
-\r
- // we have more POST data to get\r
- if(arg->in.len>0)\r
- {\r
- int pos=0;\r
- while(pos<arg->in.len)\r
- {\r
- mystate->m_indata[mystate->m_indatapos++]=arg->in.buf[pos++];\r
- }\r
- arg->in.num_bytes=arg->in.len;\r
- }\r
-\r
- // we have all POST data (or it was 0 to begin with) - generate the page\r
- if(mystate->m_indatalen==mystate->m_indatapos && mystate->m_outdata==NULL)\r
- {\r
- //parse POST data and any QUERY_STRING before generating page\r
- std::map<std::string,std::string> args;\r
- std::vector<std::string> argparts;\r
- std::string contenttype="";\r
- \r
- if(shttpd_get_header(arg,"Content-Type"))\r
- {\r
- contenttype=shttpd_get_header(arg,"Content-Type");\r
- }\r
- \r
- if(contenttype.find("multipart/form-data")!=std::string::npos)\r
- {\r
- HandleMultiPartData(contenttype,mystate->m_indata,mystate->m_indatalen,args);\r
- }\r
- else\r
- {\r
- // split apart non-multipart POST\r
- if(mystate->m_indata)\r
- {\r
- StringFunctions::Split(mystate->m_indata,"&",argparts);\r
- }\r
- // split apart query string\r
- if(shttpd_get_env(arg,"QUERY_STRING"))\r
- {\r
- StringFunctions::Split(shttpd_get_env(arg,"QUERY_STRING"),"&",argparts);\r
- }\r
-\r
- for(std::vector<std::string>::iterator argi=argparts.begin(); argi!=argparts.end(); argi++)\r
- {\r
- std::vector<std::string> parts;\r
- StringFunctions::Split((*argi),"=",parts);\r
- if(parts.size()>0)\r
- {\r
- // replace + with space before UriDecoding\r
- parts[0]=StringFunctions::Replace(parts[0],"+"," ");\r
- args[StringFunctions::UriDecode(parts[0])];\r
- if(parts.size()>1)\r
- {\r
- // replace + with space before UriDecoding\r
- parts[1]=StringFunctions::Replace(parts[1],"+"," ");\r
- args[StringFunctions::UriDecode(parts[0])]=StringFunctions::UriDecode(parts[1]);\r
- }\r
- }\r
- }\r
- }\r
-\r
- std::string page=GeneratePage(methodstr,args);\r
- mystate->m_outdata=new char[page.size()];\r
- memcpy(mystate->m_outdata,page.c_str(),page.size());\r
- mystate->m_outdatalen=page.size();\r
- mystate->m_outdatapos=0;\r
- }\r
-\r
- // if we have output data, push next block of data onto out buffer\r
- if(mystate->m_outdata && mystate->m_outdatapos<mystate->m_outdatalen)\r
- {\r
- int pos=0;\r
- while(mystate->m_outdatapos<mystate->m_outdatalen && pos<arg->out.len)\r
- {\r
- arg->out.buf[pos++]=mystate->m_outdata[mystate->m_outdatapos++];\r
- }\r
- arg->out.num_bytes=pos;\r
- }\r