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

📄 http.cpp

📁 一个Symbian平台上的serverclient模型的简单示例
💻 CPP
字号:
// http.cpp
//

#include "http.h"

#include "filetransfer.h"

#include "httputils.h"

#include <bautils.h>

_LIT8(KCRLF, "\r\n");
_LIT8(KSpace, " ");
_LIT8(KFullStop, ".");
_LIT8(KHTTPPrefix, "HTTP/");
_LIT8(KColonSpace, ": ");


_LIT8(KHeadContentLength, "Content-Length");
_LIT8(KHeadContentType, "Content-Type");
_LIT8(KMimeTextPlain, "text/plain");

_LIT8(KMethodOptions, "OPTIONS");
_LIT8(KMethodGet, "GET");
_LIT8(KMethodHead, "HEAD");
_LIT8(KMethodPost, "POST");
_LIT8(KMethodPut, "PUT");
_LIT8(KMethodDelete, "DELETE");
_LIT8(KMethodTrace, "TRACE");
_LIT8(KMethodConnect, "CONNECT");



CHTTPProtocol* CHTTPProtocol::NewL()
	{
	CHTTPProtocol* object = new (ELeave) CHTTPProtocol();
	CleanupStack::PushL(object);
	object->ConstructL();
	CleanupStack::Pop();
	return object;
	}


CHTTPProtocol::CHTTPProtocol()
: CActive(CActive::EPriorityStandard)
, iSent(EFalse)
	{
	}

void CHTTPProtocol::ConstructL()
	{
	User::LeaveIfError(iFs.Connect());
	}



CHTTPProtocol::~CHTTPProtocol()
	{
	delete iFileTran;
	iSocket.Close();
	iFs.Close();
	}

RSocket& CHTTPProtocol::Socket(RSocketServ& aServer)
	{
	iSocket.Open(aServer);
	return iSocket;
	}


void CHTTPProtocol::ProcessRequest()
	{
    CActiveScheduler::Add(this); 
	iSocket.RecvOneOrMore(iBuffer, 0, iStatus, iLen);
	SetActive();
	}


void CHTTPProtocol::RunL()
	{
	if (iStatus.Int() == KErrNone)
		{
		if (iSent)
			{
			iSocket.Close();
			}
		else
			{
			ParseAndReturnRequestL();
			}
		}
	}

void CHTTPProtocol::DoCancel()
	{
	if (iSent)
		{
		iSocket.CancelWrite();
		}
	else
		{
		iSocket.CancelRecv();
		}
	}



class TLineParse8
	{
public:
	TLineParse8(const TDesC8& buffer);

	TPtrC8 NextLine();
private:

	TPtrC8 iCursor;
	};


TLineParse8::TLineParse8(const TDesC8& buffer)
//: iBuffer(buffer)
: iCursor(buffer)
	{
	}

TPtrC8 TLineParse8::NextLine()
	{
	TInt res = iCursor.FindF(KCRLF);
	if (res)
		{
		TPtrC8 result = iCursor.Left(res);
		iCursor.Set(iCursor.Right(iCursor.Length() - (res +2)));
		return result;
		}
	else
		{
		return TPtrC8();
		}
	}


//
// ParseAndReturnRequest
//
void CHTTPProtocol::ParseAndReturnRequestL() {
	
	TLineParse8 input1(iBuffer);
	TPtrC8 line1(input1.NextLine());
//	TPtrC8 line2(input1.NextLine());

	TLex8 input(line1);
	input.SkipSpace();
	TPtrC8 operation(input.NextToken());
	TPtrC8 uri(input.NextToken());
	TPtrC8 version(input.NextToken());

	iReturnBuffer.Zero();

	if (operation.Compare(KMethodGet) == 0)
		{
		ReturnGetRequestL(uri);
		}
	else if (operation.Compare(KMethodOptions) == 0)
		{
//		ReturnOptionsRequest(uri, iReturnBuffer);
		}
	else if (operation.Compare(KMethodHead) == 0)
		{
//		ReturnHeadRequest(uri, iReturnBuffer);
		}
	else if (operation.Compare(KMethodPost) == 0)
		{
//		ReturnPostRequest(uri, iReturnBuffer);
		}
	else if (operation.Compare(KMethodPut) == 0)
		{
//		ReturnPutRequest(uri, iReturnBuffer);
		}
	else if (operation.Compare(KMethodDelete) == 0)
		{
//		ReturnDeleteRequest(uri, iReturnBuffer);
		}
	else if (operation.Compare(KMethodTrace) == 0)
		{
//		ReturnTraceRequest(uri, iReturnBuffer);
		}
	else if (operation.Compare(KMethodConnect) == 0)
		{
//		ReturnConnectRequest(uri, iReturnBuffer);
		}
	else
		{
//		ReturnNoSuchMethod(uri, iReturnBuffer);
		}

	}



//
// CreateCannonicalVersionL
//
// First converts to the systems native character width (ie unicode)
// A more sophisticated version would examine escape characters in the
// URI, such as %20 and convert them to native characters.
HBufC* CHTTPProtocol::CreateCannonicalVersionL(const TDesC8& aURI)
	{
	HBufC* cannonical_uri = HBufC::NewL(aURI.Length());
	TPtr uri = cannonical_uri->Des();
	uri.Copy(aURI);

	return cannonical_uri;
	}


//
// MapToFileSystemL
//
// Convert the requested URI to a file on the local filesystem
// The file server will not interpret '..' in paths, so this is already
// has some basic security in it.
HBufC* CHTTPProtocol::MapToFileSystemL(const TDesC& aURI)
	{
	TFileName fname(_L("c:\\public\\"));
	fname.Append(aURI.Mid(1));

	return fname.AllocL();
	}

void CHTTPProtocol::ReturnGetRequestL(const TDesC8& aURI)
	{
	HBufC* cannonical_uri = CreateCannonicalVersionL(aURI);
	CleanupStack::PushL(cannonical_uri);

	HBufC* file_path = MapToFileSystemL(*cannonical_uri);
	CleanupStack::PushL(file_path);

	if (BaflUtils::FileExists(iFs, *file_path))
		{
		iFileTran = CFileTransfer::NewL(iSocket, *file_path);
		iFileTran->StartTransfer();
		}
	else
		{
		HTTP::WriteMessageL(iReturnBuffer, HTTP::E404NotFound);
		iReturnBuffer.Append(KCRLF);

		iSocket.Write(iReturnBuffer, iStatus);
		SetActive();
		iSent = ETrue;
		}	


	CleanupStack::PopAndDestroy(2);	
	}

⌨️ 快捷键说明

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