LRSD stephane / Mbed 2 deprecated WEBserverv4

Dependencies:   mbed

Committer:
geiineuville
Date:
Thu Sep 22 15:59:17 2011 +0000
Revision:
0:3c32eeb9292a
V4

Who changed what in which revision?

UserRevisionLine numberNew contents of line
geiineuville 0:3c32eeb9292a 1 #include "HTTPServer.h"
geiineuville 0:3c32eeb9292a 2 #include "NetServer.h"
geiineuville 0:3c32eeb9292a 3
geiineuville 0:3c32eeb9292a 4 extern int gDebug; // [iva2k]
geiineuville 0:3c32eeb9292a 5 extern int var ;
geiineuville 0:3c32eeb9292a 6 extern int adc;
geiineuville 0:3c32eeb9292a 7 extern char *url;
geiineuville 0:3c32eeb9292a 8 extern char *lieu;
geiineuville 0:3c32eeb9292a 9 using namespace std;
geiineuville 0:3c32eeb9292a 10 using namespace mbed;
geiineuville 0:3c32eeb9292a 11
geiineuville 0:3c32eeb9292a 12 //unsigned int gconnections = 0;
geiineuville 0:3c32eeb9292a 13
geiineuville 0:3c32eeb9292a 14 unsigned int mbed::hash(unsigned char *str) {
geiineuville 0:3c32eeb9292a 15 unsigned int hash = 5381;
geiineuville 0:3c32eeb9292a 16 int c;
geiineuville 0:3c32eeb9292a 17 while((c = *(str++))!=(unsigned char)'\0') {
geiineuville 0:3c32eeb9292a 18 hash = ((hash << 5) + hash) + c; /* hash * 33 + c */
geiineuville 0:3c32eeb9292a 19 }
geiineuville 0:3c32eeb9292a 20 return hash;
geiineuville 0:3c32eeb9292a 21 }
geiineuville 0:3c32eeb9292a 22
geiineuville 0:3c32eeb9292a 23 HTTPConnection::HTTPConnection(HTTPServer *pparent, struct tcp_pcb *pcb)
geiineuville 0:3c32eeb9292a 24 : TCPConnection(pparent, pcb), request_incomplete(true), data(NULL),
geiineuville 0:3c32eeb9292a 25 request_handler(NULL), request_status(HTTP_NotFound), parent(pparent),
geiineuville 0:3c32eeb9292a 26 _request_url(NULL), _request_type(0), _request_headerfields(NULL),
geiineuville 0:3c32eeb9292a 27 _request_length(0), _request_arg_key(NULL), _request_arg_value(NULL),
geiineuville 0:3c32eeb9292a 28 _request_arg_state(0), emptypolls(0) {
geiineuville 0:3c32eeb9292a 29 _timeout_max = pparent->timeout();
geiineuville 0:3c32eeb9292a 30 }
geiineuville 0:3c32eeb9292a 31
geiineuville 0:3c32eeb9292a 32 HTTPConnection::~HTTPConnection() {
geiineuville 0:3c32eeb9292a 33 deleteRequest();
geiineuville 0:3c32eeb9292a 34 emptypolls = NetServer::time();
geiineuville 0:3c32eeb9292a 35 }
geiineuville 0:3c32eeb9292a 36
geiineuville 0:3c32eeb9292a 37 const char *HTTPConnection::getField(char *key) const {
geiineuville 0:3c32eeb9292a 38 unsigned int h = hash((unsigned char *)key);
geiineuville 0:3c32eeb9292a 39 return _request_fields.find(h)->second;
geiineuville 0:3c32eeb9292a 40 }
geiineuville 0:3c32eeb9292a 41
geiineuville 0:3c32eeb9292a 42 void HTTPConnection::addField(char *key, char *value) {
geiineuville 0:3c32eeb9292a 43 unsigned int h = hash((unsigned char *)key);
geiineuville 0:3c32eeb9292a 44 if(parent->isField(h)) {
geiineuville 0:3c32eeb9292a 45 _request_fields.insert( make_pair(h, value));
geiineuville 0:3c32eeb9292a 46 }
geiineuville 0:3c32eeb9292a 47 }
geiineuville 0:3c32eeb9292a 48
geiineuville 0:3c32eeb9292a 49 void HTTPConnection::send() {
geiineuville 0:3c32eeb9292a 50 int i = sndbuf();
geiineuville 0:3c32eeb9292a 51 if(!request_incomplete&&i) {
geiineuville 0:3c32eeb9292a 52 switch(request_handler->send(this, i)) {
geiineuville 0:3c32eeb9292a 53 case HTTP_SuccessEnded:
geiineuville 0:3c32eeb9292a 54 case HTTP_Failed: {
geiineuville 0:3c32eeb9292a 55 deleteRequest();
geiineuville 0:3c32eeb9292a 56 release_callbacks();
geiineuville 0:3c32eeb9292a 57 NetServer::get()->free(this);
geiineuville 0:3c32eeb9292a 58 close();
geiineuville 0:3c32eeb9292a 59 } break;
geiineuville 0:3c32eeb9292a 60 default:
geiineuville 0:3c32eeb9292a 61 emptypolls = NetServer::time();
geiineuville 0:3c32eeb9292a 62 break;
geiineuville 0:3c32eeb9292a 63 }
geiineuville 0:3c32eeb9292a 64 } else {
geiineuville 0:3c32eeb9292a 65 if(NetServer::time() - emptypolls > _timeout_max) {
geiineuville 0:3c32eeb9292a 66 release_callbacks();
geiineuville 0:3c32eeb9292a 67 NetServer::get()->free(this);
geiineuville 0:3c32eeb9292a 68 close();
geiineuville 0:3c32eeb9292a 69 }
geiineuville 0:3c32eeb9292a 70 }
geiineuville 0:3c32eeb9292a 71 }
geiineuville 0:3c32eeb9292a 72
geiineuville 0:3c32eeb9292a 73 void HTTPConnection::store(void *d, struct pbuf *p) {
geiineuville 0:3c32eeb9292a 74 int len = p->len-(((int)d)-((int)p->payload));
geiineuville 0:3c32eeb9292a 75 do {
geiineuville 0:3c32eeb9292a 76 switch(request_handler->data(this, d, len)) {
geiineuville 0:3c32eeb9292a 77 case HTTP_SuccessEnded:
geiineuville 0:3c32eeb9292a 78 case HTTP_Failed: {
geiineuville 0:3c32eeb9292a 79 deleteRequest();
geiineuville 0:3c32eeb9292a 80 release_callbacks();
geiineuville 0:3c32eeb9292a 81 NetServer::get()->free(this);
geiineuville 0:3c32eeb9292a 82 close();
geiineuville 0:3c32eeb9292a 83 } break;
geiineuville 0:3c32eeb9292a 84 default:
geiineuville 0:3c32eeb9292a 85 break;
geiineuville 0:3c32eeb9292a 86 }
geiineuville 0:3c32eeb9292a 87 p = p->next;
geiineuville 0:3c32eeb9292a 88 if(p) {
geiineuville 0:3c32eeb9292a 89 len = p->len;
geiineuville 0:3c32eeb9292a 90 d = static_cast<char *>(p->payload);
geiineuville 0:3c32eeb9292a 91 }
geiineuville 0:3c32eeb9292a 92 } while(_request_type&&p);
geiineuville 0:3c32eeb9292a 93 }
geiineuville 0:3c32eeb9292a 94
geiineuville 0:3c32eeb9292a 95 void HTTPConnection::err(err_t err) {
geiineuville 0:3c32eeb9292a 96 printf("Error\n");
geiineuville 0:3c32eeb9292a 97 release_callbacks();
geiineuville 0:3c32eeb9292a 98 NetServer::get()->free(this);
geiineuville 0:3c32eeb9292a 99 }
geiineuville 0:3c32eeb9292a 100
geiineuville 0:3c32eeb9292a 101 err_t HTTPConnection::poll() {
geiineuville 0:3c32eeb9292a 102 send();
geiineuville 0:3c32eeb9292a 103 return ERR_OK;
geiineuville 0:3c32eeb9292a 104 }
geiineuville 0:3c32eeb9292a 105
geiineuville 0:3c32eeb9292a 106 err_t HTTPConnection::sent(u16_t len) {
geiineuville 0:3c32eeb9292a 107 return poll();
geiineuville 0:3c32eeb9292a 108 }
geiineuville 0:3c32eeb9292a 109
geiineuville 0:3c32eeb9292a 110 err_t HTTPConnection::recv(struct pbuf *q, err_t err) {
geiineuville 0:3c32eeb9292a 111 struct pbuf *p = q;
geiineuville 0:3c32eeb9292a 112 int i;
geiineuville 0:3c32eeb9292a 113 char *data;
geiineuville 0:3c32eeb9292a 114 if (gDebug>1) printf("DEBUG: HTTPConnection::recv(%s, %d) :1\r\n", p ? "<some data>" : "NULL", (int)err);
geiineuville 0:3c32eeb9292a 115 if(err == ERR_OK && p != NULL) {
geiineuville 0:3c32eeb9292a 116 /* Inform TCP that we have taken the data. */
geiineuville 0:3c32eeb9292a 117 recved(p->tot_len);
geiineuville 0:3c32eeb9292a 118 data = static_cast<char *>(p->payload);
geiineuville 0:3c32eeb9292a 119
geiineuville 0:3c32eeb9292a 120 // :1
geiineuville 0:3c32eeb9292a 121 // Looking if it's GET, POST,
geiineuville 0:3c32eeb9292a 122 // Followup from an incomplete request Header,
geiineuville 0:3c32eeb9292a 123 // POST data or just crap (DEL, HEAD ...).
geiineuville 0:3c32eeb9292a 124 if(!_request_type&&(strncmp(data, "GET ", 4) == 0)) {
geiineuville 0:3c32eeb9292a 125 _request_type = GET; // Need :2
geiineuville 0:3c32eeb9292a 126 } else if(!_request_type&&(strncmp(data, "POST ", 5) == 0)) {
geiineuville 0:3c32eeb9292a 127 _request_type = POST; // Need :2
geiineuville 0:3c32eeb9292a 128 } else if(_request_type&&request_incomplete) {
geiineuville 0:3c32eeb9292a 129 getFields(&p, &data); // Need :3
geiineuville 0:3c32eeb9292a 130 } else if(_request_type == POST) {
geiineuville 0:3c32eeb9292a 131 // Followup (Data) // Exits
geiineuville 0:3c32eeb9292a 132 data = static_cast<char *>(p->payload); // [iva2k] Redundand
geiineuville 0:3c32eeb9292a 133 store(data, p);
geiineuville 0:3c32eeb9292a 134 emptypolls = NetServer::time();
geiineuville 0:3c32eeb9292a 135 pbuf_free(q);
geiineuville 0:3c32eeb9292a 136 data = NULL; // [iva2k] Unnecessary
geiineuville 0:3c32eeb9292a 137 return ERR_OK;
geiineuville 0:3c32eeb9292a 138 } else {
geiineuville 0:3c32eeb9292a 139 pbuf_free(q); // Exits
geiineuville 0:3c32eeb9292a 140 data = NULL; // [iva2k] Unnecessary
geiineuville 0:3c32eeb9292a 141 return ERR_OK;
geiineuville 0:3c32eeb9292a 142 }
geiineuville 0:3c32eeb9292a 143
geiineuville 0:3c32eeb9292a 144 if (gDebug>1) printf(" : HTTPConnection::recv() :2 _request_type=%d, _request_url=%s\r\n", (int)_request_type, _request_url?_request_url:"NULL");
geiineuville 0:3c32eeb9292a 145 // :2
geiineuville 0:3c32eeb9292a 146 // Processing first POST or GET Packet
geiineuville 0:3c32eeb9292a 147 // need :3 v--- If its 0 we have followup header data.
geiineuville 0:3c32eeb9292a 148 if(_request_type&&!_request_url) {
geiineuville 0:3c32eeb9292a 149 char *pagename = (char *)(data + _request_type);
geiineuville 0:3c32eeb9292a 150 for(i = _request_type; i < p->len; i++) {
geiineuville 0:3c32eeb9292a 151 if((data[i] == ' ') || (data[i] == '\r') || (data[i] == '\n')) {
geiineuville 0:3c32eeb9292a 152 data[i] = 0;
geiineuville 0:3c32eeb9292a 153 data = &data[i+1];
geiineuville 0:3c32eeb9292a 154 break;
geiineuville 0:3c32eeb9292a 155 }
geiineuville 0:3c32eeb9292a 156 }
geiineuville 0:3c32eeb9292a 157 emptypolls = NetServer::time();
geiineuville 0:3c32eeb9292a 158
geiineuville 0:3c32eeb9292a 159 if((pagename[0] == '/') && (pagename[1] == 0))
geiineuville 0:3c32eeb9292a 160 { pagename = "/index.htm";}
geiineuville 0:3c32eeb9292a 161
geiineuville 0:3c32eeb9292a 162 i = strlen(pagename);
geiineuville 0:3c32eeb9292a 163 _request_url = new char[i+1];
geiineuville 0:3c32eeb9292a 164 memcpy(_request_url, pagename, i); // [iva2k] memcpy(_request_url, pagename, i+1); would not need next line
geiineuville 0:3c32eeb9292a 165 _request_url[i] = '\0';
geiineuville 0:3c32eeb9292a 166 getFields(&p, &data);
geiineuville 0:3c32eeb9292a 167 }
geiineuville 0:3c32eeb9292a 168
geiineuville 0:3c32eeb9292a 169 if (gDebug>1) printf(" : HTTPConnection::recv() :3 _request_url=%s request_incomplete=%d, request_status=%d\r\n", _request_url, (int)request_incomplete, (int)request_status);
geiineuville 0:3c32eeb9292a 170 // :3
geiineuville 0:3c32eeb9292a 171 // Send or store the first amoungh of data.
geiineuville 0:3c32eeb9292a 172 // Only when the message is complete.
geiineuville 0:3c32eeb9292a 173 if(!request_incomplete) {
geiineuville 0:3c32eeb9292a 174 emptypolls = NetServer::time();
geiineuville 0:3c32eeb9292a 175 // Find the right handler
geiineuville 0:3c32eeb9292a 176 if(!request_handler) {
geiineuville 0:3c32eeb9292a 177 request_handler = parent->handle(this);
geiineuville 0:3c32eeb9292a 178 request_status = request_handler->init(this);
geiineuville 0:3c32eeb9292a 179 if (gDebug>1) printf(" : ... request_status=%d\r\n", (int)request_status);
geiineuville 0:3c32eeb9292a 180 }
geiineuville 0:3c32eeb9292a 181 i = strlen(_request_headerfields) + 120;
geiineuville 0:3c32eeb9292a 182 char *buf = new char[i];
geiineuville 0:3c32eeb9292a 183 sprintf(buf, "HTTP/1.1 %d OK\r\nServer:mbed embedded%s%d%s\r\nConnection: Close\r\n\r\n", request_status,
geiineuville 0:3c32eeb9292a 184 (_request_length?"\r\nContent-Length: ":""),_request_length,
geiineuville 0:3c32eeb9292a 185 getHeaderFields());
geiineuville 0:3c32eeb9292a 186 i = strlen(buf); // [iva2k] sprintf returns just that, use i=sprintf(...) above instead.
geiineuville 0:3c32eeb9292a 187 if(sndbuf()>i) {
geiineuville 0:3c32eeb9292a 188 if(request_status==HTTP_NotFound) {
geiineuville 0:3c32eeb9292a 189 const char *msg ={
geiineuville 0:3c32eeb9292a 190 "<html>\r\n"
geiineuville 0:3c32eeb9292a 191 "<head>\r\n"
geiineuville 0:3c32eeb9292a 192 "<title>Redirection htm</title>\r\n"
geiineuville 0:3c32eeb9292a 193 "<meta http-equiv=\"refresh\" content=\"0; URL=http://192.168.1.77/testbed.htm\" >\r\n"
geiineuville 0:3c32eeb9292a 194 "</head>\r\n"
geiineuville 0:3c32eeb9292a 195 "<body>\r\n"
geiineuville 0:3c32eeb9292a 196 "</body>\r\n"
geiineuville 0:3c32eeb9292a 197 "</html>\r\n"
geiineuville 0:3c32eeb9292a 198 };
geiineuville 0:3c32eeb9292a 199
geiineuville 0:3c32eeb9292a 200 if (gDebug) printf("HTTP : %s NOT FOUND\r\n", p ? _request_url : "NULL");
geiineuville 0:3c32eeb9292a 201 write((void *)msg, strlen(msg), 0);
geiineuville 0:3c32eeb9292a 202 deleteRequest();
geiineuville 0:3c32eeb9292a 203 }
geiineuville 0:3c32eeb9292a 204 else
geiineuville 0:3c32eeb9292a 205 {
geiineuville 0:3c32eeb9292a 206 if (gDebug){ printf("HTTP : %s \r\n", p ? _request_url : "NULL"); //**************
geiineuville 0:3c32eeb9292a 207 #include "testbed.h" // mes options de test carte mebed
geiineuville 0:3c32eeb9292a 208 }
geiineuville 0:3c32eeb9292a 209 write(buf, i, (TCP_WRITE_FLAG_COPY | TCP_WRITE_FLAG_MORE));
geiineuville 0:3c32eeb9292a 210 if(_request_type == POST) {
geiineuville 0:3c32eeb9292a 211 store(data, p); }
geiineuville 0:3c32eeb9292a 212 else { send();}//*********************************************************
geiineuville 0:3c32eeb9292a 213 // var = 1;
geiineuville 0:3c32eeb9292a 214 // url = _request_url; // pour recuperer l'url demand&#65533;e dans la boucle poll du main
geiineuville 0:3c32eeb9292a 215
geiineuville 0:3c32eeb9292a 216 }
geiineuville 0:3c32eeb9292a 217 }
geiineuville 0:3c32eeb9292a 218 delete buf;
geiineuville 0:3c32eeb9292a 219 }
geiineuville 0:3c32eeb9292a 220
geiineuville 0:3c32eeb9292a 221 // Exits
geiineuville 0:3c32eeb9292a 222 pbuf_free(q);
geiineuville 0:3c32eeb9292a 223 data = NULL;
geiineuville 0:3c32eeb9292a 224 } else {
geiineuville 0:3c32eeb9292a 225 release_callbacks();
geiineuville 0:3c32eeb9292a 226 NetServer::get()->free(this);
geiineuville 0:3c32eeb9292a 227 close();
geiineuville 0:3c32eeb9292a 228 }
geiineuville 0:3c32eeb9292a 229 return ERR_OK;
geiineuville 0:3c32eeb9292a 230 }
geiineuville 0:3c32eeb9292a 231
geiineuville 0:3c32eeb9292a 232 void HTTPConnection::getFields(struct pbuf **q, char **d) {
geiineuville 0:3c32eeb9292a 233 if(parent->fields.empty()) {
geiineuville 0:3c32eeb9292a 234 while((*q)&&request_incomplete) {
geiineuville 0:3c32eeb9292a 235 unsigned int end = ((unsigned int)((*q)->payload)+(unsigned int)((*q)->len));
geiineuville 0:3c32eeb9292a 236 for(; request_incomplete && ((unsigned int)(*d) < end); (*d)++) {
geiineuville 0:3c32eeb9292a 237 if((*((char *)((*d)-0))=='\n')&&(*((char *)((*d)-1))=='\r')&&
geiineuville 0:3c32eeb9292a 238 (*((char *)((*d)-2))=='\n')&&(*((char *)((*d)-3))=='\r')) {
geiineuville 0:3c32eeb9292a 239 request_incomplete = false;
geiineuville 0:3c32eeb9292a 240 (*d) += 1;
geiineuville 0:3c32eeb9292a 241 break;
geiineuville 0:3c32eeb9292a 242 }
geiineuville 0:3c32eeb9292a 243 }
geiineuville 0:3c32eeb9292a 244 if(request_incomplete) {
geiineuville 0:3c32eeb9292a 245 (*q) = (*q)->next;
geiineuville 0:3c32eeb9292a 246 if((*q)) {
geiineuville 0:3c32eeb9292a 247 (*d) = static_cast<char *>((*q)->payload);
geiineuville 0:3c32eeb9292a 248 }
geiineuville 0:3c32eeb9292a 249 }
geiineuville 0:3c32eeb9292a 250 }
geiineuville 0:3c32eeb9292a 251 } else {
geiineuville 0:3c32eeb9292a 252 char *kb = *d, *ke = NULL, *vb = *d, *ve = NULL;
geiineuville 0:3c32eeb9292a 253 while((*q)&&request_incomplete) {
geiineuville 0:3c32eeb9292a 254 unsigned int end = ((unsigned int)((*q)->payload)+(unsigned int)((*q)->len));
geiineuville 0:3c32eeb9292a 255 for(; request_incomplete && ((unsigned int)(*d) < end); (*d)++) {
geiineuville 0:3c32eeb9292a 256 switch(**d) {
geiineuville 0:3c32eeb9292a 257 case ' ': switch(_request_arg_state) {
geiineuville 0:3c32eeb9292a 258 case 1: case 2: _request_arg_state = 2; break;
geiineuville 0:3c32eeb9292a 259 case 3: _request_arg_state = 3; break;
geiineuville 0:3c32eeb9292a 260 default: _request_arg_state = 0; break;
geiineuville 0:3c32eeb9292a 261 } break;
geiineuville 0:3c32eeb9292a 262 case ':': switch(_request_arg_state) {
geiineuville 0:3c32eeb9292a 263 default: _request_arg_state = 2; break;
geiineuville 0:3c32eeb9292a 264 case 3: _request_arg_state = 3; break;
geiineuville 0:3c32eeb9292a 265 } break;
geiineuville 0:3c32eeb9292a 266 case '\r': switch(_request_arg_state) {
geiineuville 0:3c32eeb9292a 267 default: _request_arg_state = 4; break;
geiineuville 0:3c32eeb9292a 268 case 5: case 6: _request_arg_state = 6; break;
geiineuville 0:3c32eeb9292a 269 } break;
geiineuville 0:3c32eeb9292a 270 case '\n': switch(_request_arg_state) {
geiineuville 0:3c32eeb9292a 271 default: _request_arg_state = 4; break;
geiineuville 0:3c32eeb9292a 272 case 4: case 5: _request_arg_state = 5; break;
geiineuville 0:3c32eeb9292a 273 case 6: _request_arg_state = 7; break;
geiineuville 0:3c32eeb9292a 274 } break;
geiineuville 0:3c32eeb9292a 275 default: switch(_request_arg_state) {
geiineuville 0:3c32eeb9292a 276 default: _request_arg_state = 1; break;
geiineuville 0:3c32eeb9292a 277 case 2: case 3: _request_arg_state = 3; break;
geiineuville 0:3c32eeb9292a 278 } break;
geiineuville 0:3c32eeb9292a 279 }
geiineuville 0:3c32eeb9292a 280 switch(_request_arg_state) {
geiineuville 0:3c32eeb9292a 281 case 0: kb = (*d)+1; break; //PreKey
geiineuville 0:3c32eeb9292a 282 case 1: ke = (*d); break; //Key
geiineuville 0:3c32eeb9292a 283 case 2: vb = (*d)+1; break; //PreValue
geiineuville 0:3c32eeb9292a 284 case 3: ve = (*d); break; //Value
geiineuville 0:3c32eeb9292a 285 default: break;
geiineuville 0:3c32eeb9292a 286 case 7: request_incomplete = false; break;
geiineuville 0:3c32eeb9292a 287 case 5: {
geiineuville 0:3c32eeb9292a 288 int oldkey = (_request_arg_key)?strlen(_request_arg_key):0;
geiineuville 0:3c32eeb9292a 289 int oldval = (_request_arg_value)?strlen(_request_arg_value):0;
geiineuville 0:3c32eeb9292a 290 int keylen =(ke&&kb)?ke-kb+1:0;
geiineuville 0:3c32eeb9292a 291 int vallen = (ve&&vb)?ve-vb+1:0;
geiineuville 0:3c32eeb9292a 292 char *key = new char[oldkey+keylen];
geiineuville 0:3c32eeb9292a 293 char *val = new char[oldval+vallen];
geiineuville 0:3c32eeb9292a 294 if(_request_arg_key&&oldkey) {
geiineuville 0:3c32eeb9292a 295 strncpy(key, _request_arg_key, oldkey);
geiineuville 0:3c32eeb9292a 296 }
geiineuville 0:3c32eeb9292a 297 if(_request_arg_value&&oldval) {
geiineuville 0:3c32eeb9292a 298 strncpy(val, _request_arg_value, oldval);
geiineuville 0:3c32eeb9292a 299 }
geiineuville 0:3c32eeb9292a 300 if(kb&&keylen) {
geiineuville 0:3c32eeb9292a 301 strncpy(&key[oldkey], kb, keylen);
geiineuville 0:3c32eeb9292a 302 }
geiineuville 0:3c32eeb9292a 303 if(vb&&vallen) {
geiineuville 0:3c32eeb9292a 304 strncpy(&val[oldval], vb, vallen);
geiineuville 0:3c32eeb9292a 305 }
geiineuville 0:3c32eeb9292a 306 key[oldkey+keylen] = 0;
geiineuville 0:3c32eeb9292a 307 val[oldval+vallen] = 0;
geiineuville 0:3c32eeb9292a 308 // printf("'%s':='%s'\n", key, val);
geiineuville 0:3c32eeb9292a 309 addField(key, val);
geiineuville 0:3c32eeb9292a 310 kb = vb = (*d)+1;
geiineuville 0:3c32eeb9292a 311 ke = ve = NULL;
geiineuville 0:3c32eeb9292a 312 if(_request_arg_key) {
geiineuville 0:3c32eeb9292a 313 delete _request_arg_key;
geiineuville 0:3c32eeb9292a 314 _request_arg_key = NULL;
geiineuville 0:3c32eeb9292a 315 }
geiineuville 0:3c32eeb9292a 316 if(_request_arg_value) {
geiineuville 0:3c32eeb9292a 317 delete _request_arg_value;
geiineuville 0:3c32eeb9292a 318 _request_arg_value = NULL;
geiineuville 0:3c32eeb9292a 319 }
geiineuville 0:3c32eeb9292a 320 delete key;
geiineuville 0:3c32eeb9292a 321 } break;
geiineuville 0:3c32eeb9292a 322 }
geiineuville 0:3c32eeb9292a 323 }
geiineuville 0:3c32eeb9292a 324 }
geiineuville 0:3c32eeb9292a 325 switch(_request_arg_state) {
geiineuville 0:3c32eeb9292a 326 case 0: break; // PreKey
geiineuville 0:3c32eeb9292a 327 case 5: break; // n-rec
geiineuville 0:3c32eeb9292a 328 case 6: break; // 2r-rec
geiineuville 0:3c32eeb9292a 329 default: break;
geiineuville 0:3c32eeb9292a 330 case 1: case 2: { // Key // PreValue
geiineuville 0:3c32eeb9292a 331 int keylen =(kb)?(*d)-kb+1:0;
geiineuville 0:3c32eeb9292a 332 _request_arg_key = new char[keylen];
geiineuville 0:3c32eeb9292a 333 strncpy(_request_arg_key, kb, keylen+1);
geiineuville 0:3c32eeb9292a 334 _request_arg_key[keylen] = 0;
geiineuville 0:3c32eeb9292a 335 } break;
geiineuville 0:3c32eeb9292a 336 case 3: case 4: { // Value // r-rec
geiineuville 0:3c32eeb9292a 337 int keylen =(ke&&kb)?ke-kb+1:0;
geiineuville 0:3c32eeb9292a 338 int vallen = (vb)?(*d)-vb+1:0;
geiineuville 0:3c32eeb9292a 339 _request_arg_key = new char[keylen];
geiineuville 0:3c32eeb9292a 340 _request_arg_value = new char[vallen];
geiineuville 0:3c32eeb9292a 341 strncpy(_request_arg_key, kb, keylen+1);
geiineuville 0:3c32eeb9292a 342 strncpy(_request_arg_value, vb, vallen+1);
geiineuville 0:3c32eeb9292a 343 _request_arg_key[keylen] = 0;
geiineuville 0:3c32eeb9292a 344 _request_arg_value[vallen] = 0;
geiineuville 0:3c32eeb9292a 345 } break;
geiineuville 0:3c32eeb9292a 346 }
geiineuville 0:3c32eeb9292a 347 if(request_incomplete) {
geiineuville 0:3c32eeb9292a 348 (*q) = (*q)->next;
geiineuville 0:3c32eeb9292a 349 if((*q)) {
geiineuville 0:3c32eeb9292a 350 (*d) = static_cast<char *>((*q)->payload);
geiineuville 0:3c32eeb9292a 351 }
geiineuville 0:3c32eeb9292a 352 }
geiineuville 0:3c32eeb9292a 353 }
geiineuville 0:3c32eeb9292a 354 }
geiineuville 0:3c32eeb9292a 355
geiineuville 0:3c32eeb9292a 356 HTTPServer::HTTPServer(unsigned short port)
geiineuville 0:3c32eeb9292a 357 : TCPListener(port), _timeout_max(60000) {
geiineuville 0:3c32eeb9292a 358 }
geiineuville 0:3c32eeb9292a 359
geiineuville 0:3c32eeb9292a 360 HTTPServer::HTTPServer(const char *hostname, struct ip_addr ip, struct ip_addr nm, struct ip_addr gw, struct ip_addr dns, unsigned short port)
geiineuville 0:3c32eeb9292a 361 : TCPListener(port), _timeout_max(60000) {
geiineuville 0:3c32eeb9292a 362 NetServer *net = NULL;
geiineuville 0:3c32eeb9292a 363 if(ip.addr != ip_addr_any.addr && nm.addr != ip_addr_any.addr && gw.addr != ip_addr_any.addr) {
geiineuville 0:3c32eeb9292a 364 net = NetServer::create(ip, nm, gw);
geiineuville 0:3c32eeb9292a 365 if(dns.addr != ip_addr_any.addr) {
geiineuville 0:3c32eeb9292a 366 net->setDNS1(dns);
geiineuville 0:3c32eeb9292a 367 }
geiineuville 0:3c32eeb9292a 368 } else if(hostname) {
geiineuville 0:3c32eeb9292a 369 net = NetServer::create();
geiineuville 0:3c32eeb9292a 370 }
geiineuville 0:3c32eeb9292a 371 if(hostname) {
geiineuville 0:3c32eeb9292a 372 net->setHostname(hostname);
geiineuville 0:3c32eeb9292a 373 }
geiineuville 0:3c32eeb9292a 374 }
geiineuville 0:3c32eeb9292a 375
geiineuville 0:3c32eeb9292a 376 void HTTPConnection::deleteRequest() {
geiineuville 0:3c32eeb9292a 377 for(map<unsigned int, char *>::iterator iter = _request_fields.begin();
geiineuville 0:3c32eeb9292a 378 iter!=_request_fields.end();iter++) {
geiineuville 0:3c32eeb9292a 379 delete iter->second;
geiineuville 0:3c32eeb9292a 380 }
geiineuville 0:3c32eeb9292a 381 _request_fields.clear();
geiineuville 0:3c32eeb9292a 382 if(data) {delete data; data = NULL; };
geiineuville 0:3c32eeb9292a 383
geiineuville 0:3c32eeb9292a 384 if(_request_type) {
geiineuville 0:3c32eeb9292a 385 delete _request_headerfields;
geiineuville 0:3c32eeb9292a 386 delete _request_arg_key;
geiineuville 0:3c32eeb9292a 387 delete _request_arg_value;
geiineuville 0:3c32eeb9292a 388 if(_request_url) {
geiineuville 0:3c32eeb9292a 389 delete _request_url;
geiineuville 0:3c32eeb9292a 390 _request_url = NULL;
geiineuville 0:3c32eeb9292a 391 }
geiineuville 0:3c32eeb9292a 392 }
geiineuville 0:3c32eeb9292a 393 _request_type = 0;
geiineuville 0:3c32eeb9292a 394 request_incomplete = true;
geiineuville 0:3c32eeb9292a 395 }
geiineuville 0:3c32eeb9292a 396