LRSD stephane / Mbed 2 deprecated WEBserver0-lrsd

Dependencies:   mbed

Committer:
geiineuville
Date:
Fri Sep 02 08:36:24 2011 +0000
Revision:
0:441400ffd086
V0

Who changed what in which revision?

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