Exemple #1
0
void DeleteDictionary(treeNode* root)
{
	if(root != NULL)
	{
		DeleteDictionary(root->getLeft());
		DeleteDictionary(root->getRight());
		delete root;
	}
}
int HandleClientHTTPRequest(char* szHttpRequest, int nRequestSize, SOCKET scClientSocket)
{
	int nReturnValue = 0;
	Dictionary *dictHttpReq = 0;
	
	LogMessage(LOG_DEBUG, "Started handling client http request");

	if (nRequestSize <= 0 || szHttpRequest == 0)
	{
		LogMessage(LOG_ERROR, "Invalid http request");
		return ERR_INVALID_PARAMETERS;
	}

	LogMessage(LOG_DEBUG, "Creating the dictionary for http request");
	dictHttpReq = CreateDictionary(10);
	if (dictHttpReq == 0)
	{
		LogMessage(LOG_ERROR, "Failed to create dictionary, returning");
		return ERR_INVALID_MEMORY_OPERATION;
	}

	LogMessage(LOG_DEBUG, "Populate the dictionary from http request");
	nReturnValue = GenerateHttpRequestDictionary(szHttpRequest, nRequestSize, dictHttpReq);
	if (nReturnValue != 0)
	{
		//Error has occured while adding elements to dictHttpReq
		LogMessage(LOG_ERROR, "Failed to add elements to the http request dictionary");
		return nReturnValue;
	}

	//Handle Method
	LogMessage(LOG_DEBUG, "Get the type of http request method");
	nReturnValue = GetTypeOfMethod(GetValueFromDictionary(dictHttpReq, "METHOD"));
	switch (nReturnValue)
	{
		case METHOD_OPTIONS:
		{
			//Handle Options
			nReturnValue = Handle_Options(szHttpRequest, nRequestSize, scClientSocket);
			break;
		}
		case METHOD_GET:
		{
			//Handle Get
			//printf_s("BHS:INFO:Got GET method\n");
			nReturnValue = Handle_Get(dictHttpReq, scClientSocket);
			break;
		}
		case METHOD_HEAD:
		{
			//Handle Head
			nReturnValue = Handle_Head(dictHttpReq, scClientSocket);
			break;
		}
		case METHOD_POST:
		{
			//Handle Post
			nReturnValue = Handle_Post(szHttpRequest, nRequestSize, scClientSocket);
			break;
		}
		case METHOD_PUT:
		{
			//Handle Put
			nReturnValue = Handle_Put(szHttpRequest, nRequestSize, scClientSocket);
			break;
		}
		case METHOD_DELETE:
		{
			//Handle Delete
			nReturnValue = Handle_Delete(dictHttpReq, scClientSocket);
			break;
		}
		case METHOD_TRACE:
		{
			//Handle Trace
			nReturnValue = Handle_Trace(szHttpRequest, nRequestSize, scClientSocket);
			break;
		}
		case METHOD_CONNECT:
		{
			//Handle Connect
			nReturnValue = Handle_Connect(szHttpRequest, nRequestSize, scClientSocket);
			break;
		}
		case METHOD_EXTEND_METHODS:
		{
			//Handle extended-methods
			nReturnValue = Handle_ExtMethods(szHttpRequest, nRequestSize, scClientSocket);
			break;
		}
		default:
		{
			LogMessage(LOG_ERROR, "Invalid type of method");
			//Handle the error
			break;
		}
	}
	

	/*nReturnValue = send(scClientSocket, sTestMessage, 35, 0);
	if (nReturnValue == SOCKET_ERROR)
	{
		printf_s("BHS:ERROR:send to client failed %d\n", WSAGetLastError());
		nReturnValue = ERR_SENDTOCLIENTFAILED;
		closesocket(scClientSocket);
		scClientSocket = INVALID_SOCKET;
		WSACleanup();
		return nReturnValue;
	}*/
	//closesocket(scClientSocket);
	//WSACleanup();

	LogMessage(LOG_DEBUG, "Delete the created http request dictionary");
	DeleteDictionary(dictHttpReq);
	dictHttpReq = 0;

	LogMessage(LOG_DEBUG, "Returning after handling client http request");
	return nReturnValue;
}