void localConfig_thread(void *inFd) { OSStatus err; int clientFd = *(int *)inFd; int clientFdIsSet; fd_set readfds; struct timeval_t t; HTTPHeader_t *httpHeader = NULL; configContext_t httpContext = {0, false}; config_log_trace(); httpHeader = HTTPHeaderCreateWithCallback(onReceivedData, onClearHTTPHeader, &httpContext); require_action( httpHeader, exit, err = kNoMemoryErr ); HTTPHeaderClear( httpHeader ); t.tv_sec = 60; t.tv_usec = 0; config_log("Free memory %d bytes", MicoGetMemoryInfo()->free_memory) ; while(1){ FD_ZERO(&readfds); FD_SET(clientFd, &readfds); clientFdIsSet = 0; if(httpHeader->len == 0){ require(select(1, &readfds, NULL, NULL, &t) >= 0, exit); clientFdIsSet = FD_ISSET(clientFd, &readfds); } if(clientFdIsSet||httpHeader->len){ err = SocketReadHTTPHeader( clientFd, httpHeader ); switch ( err ) { case kNoErr: // Read the rest of the HTTP body if necessary //do{ err = SocketReadHTTPBody( clientFd, httpHeader ); if(httpHeader->dataEndedbyClose == true){ err = _LocalConfigRespondInComingMessage( clientFd, httpHeader, Context ); require_noerr(err, exit); err = kConnectionErr; goto exit; }else{ require_noerr(err, exit); err = _LocalConfigRespondInComingMessage( clientFd, httpHeader, Context ); require_noerr(err, exit); } // if(httpHeader->contentLength == 0) // break; //} while( httpHeader->chunkedData == true || httpHeader->dataEndedbyClose == true); // Call the HTTPServer owner back with the acquired HTTP header //err = _LocalConfigRespondInComingMessage( clientFd, httpHeader, Context ); // //Exit if connection is closed //require_noerr(err, exit); // Reuse HTTPHeader HTTPHeaderClear( httpHeader ); break; case EWOULDBLOCK: // NO-OP, keep reading break; case kNoSpaceErr: config_log("ERROR: Cannot fit HTTPHeader."); goto exit; case kConnectionErr: // NOTE: kConnectionErr from SocketReadHTTPHeader means it's closed config_log("ERROR: Connection closed."); goto exit; default: config_log("ERROR: HTTP Header parse internal error: %d", err); goto exit; } } } exit: config_log("Exit: Client exit with err = %d", err); SocketClose(&clientFd); if(httpHeader) { HTTPHeaderClear( httpHeader ); free(httpHeader); } mico_rtos_delete_thread(NULL); return; }
HTTPHeader_t * HTTPHeaderCreate( size_t bufLen ) { return HTTPHeaderCreateWithCallback( bufLen, NULL, NULL, NULL ); }