⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 httpmessage.cpp

📁 一个HTTP协议的封装类
💻 CPP
字号:
#include "StdAfx.h"
#include "HTTPMessage.h"

HTTPMessage::HTTPMessage(void)
{
	iContentLength=0;
	iContentStr=NULL;
	iHost=NULL;
	iUri=NULL;
	iHttpVersion=EHTTP11;
	iMethod=EGET;
	iHeaderMap.insert(HeaderPair(EConnection,GetHeadName(EClose)));
}

HTTPMessage::~HTTPMessage(void)
{
	delete[] iHost;
	delete[] iUri;
	delete[] iContentStr;
}

void HTTPMessage::Ptr(string& msg)
{
	//Method
	msg=GetHeadName(iMethod);
	msg+=" ";

	//Uri
	msg+=iUri;

	//GET在Uri后面加请求正文
	if (iMethod==EGET)
	{
		msg+="?";
		addContent( msg );
	}
	msg+=" ";

	//HTTP Version
	msg+=GetHeadName(iHttpVersion);
	msg+="\r\n";

	//Host
	msg+="Host: ";
	msg+=iHost;
	msg+="\r\n";

	//添加Header
	addHeaders(msg);

	//空行分隔
	msg+="\r\n";

	//POST加请求正文
	if (iMethod==EPOST)
	{
		addContent( msg );
	}
}

const char*  HTTPMessage::GetHeadName( THTTP aHead )
{
	switch(aHead)
	{
	case EGET:
		return "GET";
	case EPOST:
		return "POST";
	case EHEAD:
	    return "HEAD";
	case EHTTP11:
	    return "HTTP/1.1";
	case EHTTP10:
		return "HTTP/1.0";
	case EConnection:
		return "Connection";
	case EKeep_Alive:
		return "Keep-Alive";
	case EClose:
		return "Close";
	case EContent_Type:
		return "Content-Type";
	case EContent_Length:
		return "Content-Length";
	default:
	   return NULL;
	}
}

void HTTPMessage::SetMethod( THTTP aMethod )
{
	iMethod=aMethod;

	if (iMethod==EPOST)
	{
		iHeaderMap.insert(HeaderPair(EContent_Type,"application/x-www-form-urlencoded"));//;charset=UTF-8
	}
}

void HTTPMessage::SetHttpVersion( THTTP aHttpVersion )
{
	iHttpVersion=aHttpVersion;
}

void HTTPMessage::SetUri( const char* aUri )
{
	if (!aUri)
	{
		aUri="/index.html";
	}

	int length=strlen(aUri);
	delete[] iUri;
	iUri=new char[length+1];
	strcpy(iUri,aUri);
}

void HTTPMessage::SetHost( const char* aHost )
{
	int length=strlen(aHost);
	delete[] iHost;
	iHost=new char[length+1];
	strcpy(iHost,aHost);
}

void HTTPMessage::AddHeader( THTTP aHeader,const char* aValue )
{
	string value=aValue;
	iHeaderMap.erase(aHeader);
	iHeaderMap.insert(HeaderPair(aHeader,value));
}

void HTTPMessage::AddHeader( THTTP aHeader,THTTP aValue )
{
	string value=GetHeadName(aValue);
	iHeaderMap.erase(aHeader);
	iHeaderMap.insert(HeaderPair(aHeader,value));
}
void HTTPMessage::AddField( const char* aFieldName,const char* aValue )
{
	string field=aFieldName;
	string value=aValue;
	iContentMap.insert(FieldPair(field,value));

	if (iContentLength>0)
	{
		iContentLength+=1;//加上&
	}

	iContentLength+=field.size();
	iContentLength+=value.size();
	iContentLength+=1;//=号
}

void HTTPMessage::addContent( string& msg )
{
	FieldIterator it;
	for (it = iContentMap.begin(); 
		it != iContentMap.end();)
	{
		msg+=(it->first);
		msg+="=";
		msg+=(it->second);

		it++;
		if (it != iContentMap.end())
		{
			msg+="&";
		}
	}

	if (iContentStr)
	{
		if (iContentMap.size()>0)
		{
			msg+="&";
		}
		msg+=iContentStr;
	}
}

void HTTPMessage::AddContent( const char* aContent )
{
	if (!aContent)
	{
		return;
	}

	int newLength=strlen(aContent);
	int oldLength=0;

	if (iContentStr)
	{
		oldLength=strlen(iContentStr);
		char* temp=new char[oldLength+newLength+2];
		strcpy(temp,iContentStr);
		delete[] iContentStr;
		iContentStr=temp;
		strcpy(iContentStr+oldLength,"&");
		oldLength++;
	}
	else
	{
		delete[] iContentStr;
		iContentStr=new char[oldLength+newLength+1];
	}

	strcpy(iContentStr+oldLength,aContent);
	iContentStr[oldLength+newLength]='\0';

	if (iContentLength>0)
	{
		iContentLength+=1;//加上&
	}

	iContentLength+=newLength;
}

void HTTPMessage::addHeaders( string& msg )
{
	if (iMethod==EPOST)
	{
		char buf[10];
		_itoa_s(iContentLength,buf,10);

		iHeaderMap.insert(HeaderPair(EContent_Length,buf));
	}

	HeaderIterator it;
	for (it = iHeaderMap.begin(); 
		it != iHeaderMap.end();it++)
	{
		msg+=(GetHeadName(it->first));
		msg+=": ";
		msg+=(it->second);
		msg+="\r\n";
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -