00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00067 #include<inet/datatypes.h>
00068 #include<inet/globalvariables.h>
00069 #include<inet/debug.h>
00070 #include<inet/system.h>
00071 #include<inet/tcp_ip.h>
00072 #include<inet/http/http_server.h>
00073
00074
00075 UINT8 https_enabled = 0;
00083 struct http_server_state https[NO_OF_HTTP_SESSIONS];
00084
00093 INT8 https_init(void)
00094 {
00095 UINT8 i;
00096 INT8 soch;
00097
00098
00099 for( i=0; i<NO_OF_HTTP_SESSIONS; i++)
00100 {
00101 https[i].state = HTTPS_STATE_FREE;
00102 https[i].ownersocket = 0;
00103 https[i].fstart = 0;
00104 https[i].fpoint = 0;
00105 https[i].flen = 0;
00106 https[i].funacked = 0;
00107
00108 soch = tcp_getsocket(TCP_TYPE_SERVER, TCP_TOS_NORMAL, TCP_DEF_TOUT, https_eventlistener);
00109
00110 if(soch < 0)
00111 {
00112 DEBUGOUT("HTTP Server uncapable of getting socket\r\n");
00113 RESET_SYSTEM();
00114
00115 }
00116
00117 https[i].ownersocket = soch;
00118
00119 kick_WD();
00120
00121 soch = tcp_listen(https[i].ownersocket, HTTPS_SERVERPORT);
00122
00123 if(soch < 0)
00124 {
00125 DEBUGOUT("HTTP Server uncapable of setting socket to listening mode\r\n");
00126 RESET_SYSTEM();
00127
00128 }
00129
00130
00131 }
00132
00133 https_enabled = 1;
00134
00135 return(i);
00136
00137 }
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153 void https_run (void)
00154 {
00155 UINT8 i;
00156 INT16 len;
00157 static UINT8 ses = 0;
00158
00159 if( https_enabled == 0)
00160 return;
00161
00162
00163
00164 for(i=0; i<NO_OF_HTTP_SESSIONS; i++)
00165 {
00166 kick_WD();
00167
00168 if(ses >= NO_OF_HTTP_SESSIONS)
00169 ses = 0;
00170
00171 if(https[ses].state != HTTPS_STATE_ACTIVE)
00172 {
00173 ses++;
00174 continue;
00175 }
00176
00177 if(https[ses].funacked != 0)
00178 {
00179 ses++;
00180 continue;
00181 }
00182
00183 if(https[ses].fstart == 0)
00184 {
00185 ses++;
00186 continue;
00187 }
00188
00189
00190
00191 if( https[ses].fpoint >= https[ses].flen)
00192 {
00193 tcp_close(https[ses].ownersocket);
00194 tcp_abort(https[ses].ownersocket);
00195 https_deletesession(ses);
00196
00197 ses++;
00198
00199 return;
00200
00201 }
00202
00203
00204
00205 len = https_loadbuffer(ses, &net_buf[TCP_APP_OFFSET], NETWORK_TX_BUFFER_SIZE - TCP_APP_OFFSET);
00206
00207 if(len<0)
00208 return;
00209
00210 len = tcp_send(https[ses].ownersocket, &net_buf[TCP_APP_OFFSET], NETWORK_TX_BUFFER_SIZE - TCP_APP_OFFSET, len);
00211
00212 if(len<0)
00213 {
00214 tcp_close(https[ses].ownersocket);
00215 https_deletesession(ses);
00216
00217 ses++;
00218
00219 return;
00220
00221 }
00222
00223 https[ses].funacked = len;
00224
00225
00226
00227
00228 ses++;
00229
00230 return;
00231
00232
00233 }
00234
00235
00236
00237
00238 }
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259 INT32 https_eventlistener (INT8 cbhandle, UINT8 event, UINT32 par1, UINT32 par2)
00260 {
00261
00262
00263 INT16 i;
00264 INT16 session;
00265
00266 if( https_enabled == 0)
00267 return(-1);
00268
00269 if(cbhandle < 0)
00270 return(-1);
00271
00272
00273
00274 session = https_searchsession(cbhandle);
00275
00276 switch( event )
00277 {
00278
00279 case TCP_EVENT_CONREQ:
00280
00281
00282
00283 if(session < 0)
00284 return(-1);
00285
00286
00287
00288
00289 session = https_bindsession(cbhandle);
00290
00291 if(session < 0)
00292 return(-1);
00293
00294
00295 return(1);
00296
00297 case TCP_EVENT_ABORT:
00298
00299 if(session < 0)
00300 return(1);
00301
00302 https_deletesession((UINT8)session);
00303
00304 return(1);
00305
00306 case TCP_EVENT_CONNECTED:
00307
00308 if(session < 0)
00309 return(-1);
00310
00311 https_activatesession((UINT8)session);
00312
00313 return(1);
00314
00315 case TCP_EVENT_CLOSE:
00316
00317 if(session < 0)
00318 return(-1);
00319
00320 https_deletesession((UINT8)session);
00321
00322 return(1);
00323
00324
00325 case TCP_EVENT_ACK:
00326
00327 if(session < 0)
00328 return(-1);
00329
00330 https[session].fpoint += https[session].funacked;
00331 https[session].funacked = 0;
00332
00333 return(1);
00334
00335 case TCP_EVENT_DATA:
00336
00337
00338
00339 if(session < 0)
00340 return(-1);
00341
00342 if(https[session].fstart == 0)
00343 {
00344 if(par1 <= 3)
00345 return(1);
00346
00347
00348
00349 if(RECEIVE_NETWORK_B() != 'G')
00350 return(1);
00351 if(RECEIVE_NETWORK_B() != 'E')
00352 return(1);
00353 if(RECEIVE_NETWORK_B() != 'T')
00354 return(1);
00355
00356 par1 -= 3;
00357
00358
00359
00360 for(i=0; i<par1; i++)
00361 {
00362 if(RECEIVE_NETWORK_B() == '/')
00363 {
00364 i++;
00365 break;
00366 }
00367 }
00368
00369 par1 -= i;
00370
00371
00372
00373 i = https_calculatehash(par1);
00374
00375 if(i < 0)
00376 {
00377
00378 return(1);
00379 }
00380
00381
00382
00383 i = https_findfile((UINT8)i, (UINT8)session);
00384
00385
00386 return(1);
00387
00388
00389 }
00390
00391
00392 return(1);
00393
00394
00395 case TCP_EVENT_REGENERATE:
00396
00397 if(session < 0)
00398 return(-1);
00399
00400 if(https[session].state != HTTPS_STATE_ACTIVE)
00401 return(-1);
00402
00403 i = https_loadbuffer(session, &net_buf[TCP_APP_OFFSET], (UINT16)par1);
00404
00405 if(i<0)
00406 return(-1);
00407
00408 tcp_send(https[session].ownersocket, &net_buf[TCP_APP_OFFSET], NETWORK_TX_BUFFER_SIZE - TCP_APP_OFFSET, i);
00409
00410 return(i);
00411
00412
00413 default:
00414 return(-1);
00415 }
00416
00417 }
00418
00419
00420 void https_deletesession (UINT8 ses)
00421 {
00422 https[ses].state = HTTPS_STATE_FREE;
00423 https[ses].fstart = 0;
00424 https[ses].fpoint = 0;
00425 https[ses].flen = 0;
00426 https[ses].funacked = 0;
00427
00428 }
00429
00430 INT16 https_searchsession (UINT8 soch)
00431 {
00432 UINT8 i;
00433
00434 for(i=0; i<NO_OF_HTTP_SESSIONS; i++)
00435 {
00436 if(https[i].ownersocket == soch)
00437 return(i);
00438
00439 }
00440
00441 return(-1);
00442
00443 }
00444
00445 INT16 https_bindsession (UINT8 soch)
00446 {
00447 UINT8 i;
00448
00449 for(i=0; i<NO_OF_HTTP_SESSIONS; i++)
00450 {
00451 if(https[i].ownersocket == soch)
00452 {
00453 if(https[i].state == HTTPS_STATE_FREE)
00454 {
00455 https[i].state = HTTPS_STATE_RESERVED;
00456 return(i);
00457 }
00458 }
00459
00460 }
00461
00462
00463 return(-1);
00464
00465 }
00466
00467 void https_activatesession (UINT8 ses)
00468 {
00469 https[ses].state = HTTPS_STATE_ACTIVE;
00470
00471 }
00472
00473 INT16 https_calculatehash (UINT32 len)
00474 {
00475 UINT8 hash=0;
00476 UINT8 ch;
00477 UINT8 i;
00478
00479
00480
00481
00482 if(len > 60)
00483 len = 60;
00484
00485 for( i=0; i<len; i++)
00486 {
00487 ch = RECEIVE_NETWORK_B();
00488
00489 if( ch ==' ')
00490 break;
00491
00492 hash *= 37;
00493 hash += ch;
00494
00495 }
00496
00497 if(i==len)
00498 return(-1);
00499
00500
00501
00502 if(hash == 0)
00503 {
00504
00505
00506 hash = 0x0B;
00507
00508 }
00509
00510
00511
00512 return( hash );
00513
00514 }
00515
00516