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

📄 httpresponsemessage.cpp.bak

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

HTTPResponseMessage::HTTPResponseMessage(void)
{
	iBody=NULL;
	iStatusDesc=NULL;
}

HTTPResponseMessage::~HTTPResponseMessage(void)
{
	delete[] iBody;
	delete[] iStatusDesc;
}

void HTTPResponseMessage::Parse( const char* aContent,int length )
{
	int posHeader=ParseStatus(aContent,length);
	int posBody=ParseHeader(aContent+posHeader,length-posHeader);
	ParseBody(aContent+posBody+posHeader,length-posBody-posHeader);
}

int HTTPResponseMessage::Status()
{
	return iStatus;
}

int HTTPResponseMessage::ParseStatus(const char* aContent,int length)
{
	//解析状态码
	int posStatus=StringTool::Find(aContent,' ')+1;
	int posDesc=StringTool::Find(aContent,' ',2)+1;
	int statusLength=posDesc-posStatus;

	//版本
	strncpy(iHttpVersion,aContent,posStatus);
	iHttpVersion[posStatus]='\0';

	//状态码
	char* status=new char[statusLength+1];
	StringTool::Mid(aContent,status,posStatus,statusLength);
	iStatus=StringTool::Str2Num(status);
	delete[] status;

	//下一行的索引
	int posHeader=StringTool::Find(aContent,"\r\n")+2;//2==strlen("\r\n");

	//状态描述
	int statusDescLength=posHeader-2-posDesc;
	delete[] iStatusDesc;
	iStatusDesc=new char[statusDescLength+1];
	strncpy(iStatusDesc,aContent+posDesc,statusDescLength);
	iStatusDesc[statusDescLength]='\0';

	return posHeader;
}

int HTTPResponseMessage::ParseHeader( const char* pContent,int length )
{
	int lenColon=strlen(": ");
	int lenRN=strlen("\r\n");

	int pos=0;
	int posNextHeader=0;

	char ch=pContent[posNextHeader];

	while (pos<length && ch!='\r')
	{
		pContent+=posNextHeader;

		posNextHeader=StringTool::Find(pContent,"\r\n")+lenRN;

		int posColon=StringTool::Find(pContent,": ");//冒号

		//报头名
		string name;
		name.append(pContent,posColon);

		//报头值
		int valueLength=posNextHeader-(posColon+lenColon+lenRN);
		string value;
		value.append(pContent+posColon+lenColon,valueLength);

		iHeaderMap.insert(ResponseHeaderPair(name,value));

		pos+=posNextHeader;

		ch=pContent[posNextHeader];
	}

	return pos+2;
}

void HTTPResponseMessage::ParseBody( const char* aContent,int length )
{
	delete[] iBody;
	iBody=new char[length+1];
	strncpy(iBody,aContent,length);
	iBody[length]='\0';
}

const char* HTTPResponseMessage::Body() const
{
	return iBody;
}

const string& HTTPResponseMessage::Header( THTTP aHeader )
{
	const char* pHeader=HTTPMessage::GetHeadName(aHeader);
	if (pHeader)
	{
		return iHeaderMap[pHeader];
	}

	return "";
}

void HTTPResponseMessage::HeaderStr( string& msg )
{
	ResponseHeaderIterator it;
	for (it = iHeaderMap.begin();
		it != iHeaderMap.end();)
	{
		msg+=(it->first);
		msg+=": ";
		msg+=(it->second);

		it++;
		if (it != iHeaderMap.end())
		{
			msg+="\n";
		}
	}
}

const char* HTTPResponseMessage::HttpVersion() const
{
	return iHttpVersion;
}

const char* HTTPResponseMessage::StatusDesc() const
{
	return *iStatusDesc;
}

⌨️ 快捷键说明

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