LRSD stephane / Mbed 2 deprecated WEBserverv1

Dependencies:   mbed

Committer:
geiineuville
Date:
Sat Sep 03 09:42:32 2011 +0000
Revision:
0:4570f87afab6
v1

Who changed what in which revision?

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