Esempio n. 1
0
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);
	}
}
Esempio n. 2
0
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);
}