void DH_Pool_RequestResponse(ILibThreadPool sender, void *obj) { struct DHC_Data *data = (struct DHC_Data*)obj; int okToFree = 0; if(data->bufferLength>0) { fwrite(data->buffer,sizeof(char),data->bufferLength,data->f); } sem_wait(&(data->TransferStatus->syncLock)); data->TransferStatus->ActualBytesReceived += data->bufferLength; sem_post(&(data->TransferStatus->syncLock)); if(data->GotContinue) { fclose(data->f); if(data->Callback!=NULL) { data->Callback(data->TransferStatus, DHC_ERRORS_NONE, 200, "OK",data->user); } okToFree = 1; } if(!okToFree) { sem_wait(&(data->TransferStatus->syncLock)); if(data->TransferStatus->Reserved1!=0) { data->TransferStatus->Reserved2 = 1; } else { ILibWebClient_Resume(data->webState); } sem_post(&(data->TransferStatus->syncLock)); } else { ILibWebClient_Resume(data->webState); DH_DestroyTransferStatus(data->TransferStatus); free(data); } }
void DHC_Resume(DH_TransferStatus tstatus) { int paused = 0; int ok = 0; struct DHC_Data* data = NULL; void *token = NULL; ILibWebClient_StateObject WebState=NULL; sem_wait(&(tstatus->syncLock)); paused = tstatus->Reserved2; tstatus->Reserved2 = 0; tstatus->Reserved1 = 0; token = tstatus->RequestToken; data = (struct DHC_Data*)tstatus->Reserved3; if(data!=NULL && data->f!=NULL && data->GotContinue!=0) { ok = 1; } if(data==NULL) { ok = 1; } sem_post(&(tstatus->syncLock)); if(paused) { if(ok && data!=NULL) { ILibThreadPool_QueueUserWorkItem(data->pool,data,&DHC_Pool); } else if(ok && data==NULL) { WebState = ILibWebClient_GetStateObjectFromRequestToken(token); ILibWebClient_Resume(WebState); } } }
int ILibWebServer_RequestAnswered(struct ILibWebServer_Session *session) { struct packetheader *hdr = ILibWebClient_GetHeaderFromDataObject(session->Reserved3); struct packetheader_field_node *f; int PersistentConnection = 0; session->Reserved7 = NULL; if(session->Reserved8!=0) { return(0); } else { session->Reserved8 = 1; f = hdr->FirstField; } if(session->Reserved6==0) { if(hdr->VersionLength==3 && memcmp(hdr->Version,"1.0",3)==0) { // HTTP 1.0 , Check for Keep-Alive token while(f!=NULL) { if(f->FieldLength==9 && strncasecmp(f->Field,"CONNECTION",9)==0) { if(f->FieldDataLength==10 && strncasecmp(f->FieldData,"KEEP-ALIVE",10)==0) { PersistentConnection = 1; break; } } f = f->NextField; } } else { // HTTP 1.1+ , Check for CLOSE token PersistentConnection = 1; while(f!=NULL) { if(f->FieldLength==9 && strncasecmp(f->Field,"CONNECTION",9)==0) { if(f->FieldDataLength==5 && strncasecmp(f->FieldData,"CLOSE",5)==0) { PersistentConnection = 0; break; } } f = f->NextField; } } } if(PersistentConnection==0) { ILibAsyncServerSocket_Disconnect(session->Reserved1,session->Reserved2); } else { // Add timeout to close socket ILibLifeTime_Add(((struct ILibWebServer_StateModule*)session->Parent)->LifeTime,session,HTTP_SESSION_IDLE_TIMEOUT,&ILibWebServer_IdleSink,NULL); ILibWebClient_FinishedResponse_Server(session->Reserved3); ILibWebClient_Resume(session->Reserved3); } return(PersistentConnection==0?ILibWebServer_SEND_RESULTED_IN_DISCONNECT:0); }