LRSD stephane / Mbed 2 deprecated WEBserverv3

Dependencies:   mbed

Committer:
geiineuville
Date:
Thu Sep 08 08:57:21 2011 +0000
Revision:
0:9cf1d79ebe04
v0 v1 v2   \"v3\"

Who changed what in which revision?

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