📄 http.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 + -