c++怎么访问nodejs express搭建的http服务器
1个回答
展开全部
// 已经完整接收到了一个请求头,处理之
// 目的: 通过分析Request对象,准备好Response对象,并在可能的情况下生成一个Content对象并关联到Response对象中.
void CHTTPServer::OnRequest(PCLIENTINF pSockInf)
{
ASSERT(pSockInf);
ASSERT(pSockInf->pRequest);
ASSERT(pSockInf->pResponse);
std::wstring strUrlObject(L"");
std::wstring strServerFilePath(L"");
// 是否是有效的请求头
if(!pSockInf->pRequest->Verify())
{
// 请求头格式不正确,返回HTTP 400和一段关于400的预定义说明文本
pSockInf->pResponse->SetServerCode(SC_BADREQUEST); // HTTP 400
CHTTPContent *pContent = new CHTTPContent;
pContent->OpenText(g_HTTP_Bad_Request, strlen(g_HTTP_Bad_Request));
pSockInf->pResponse->AttachContent(pContent);
goto exit;
}
// 请求的方法是否是 GET 或者 HEAD
HTTP_METHOD method = pSockInf->pRequest->GetMethod();
pSockInf->pResponse->SetMethod(method);
if(method != METHOD_GET && method != METHOD_HEAD)
{
// 目前只支持两种HTTP方法
pSockInf->pResponse->SetServerCode(SC_BADMETHOD); // HTTP 405
CHTTPContent *pContent = new CHTTPContent;
pContent->OpenText(g_HTTP_Bad_Method, strlen(g_HTTP_Bad_Method));
pSockInf->pResponse->AttachContent(pContent);
goto exit;
}
// 获取客户端请求的对象
strUrlObject = pSockInf->pRequest->GetUrlObject();
if(strUrlObject.size() <= 0)
{
// URL Object 为空,说明客户端的请求有问题.
pSockInf->pResponse->SetServerCode(SC_BADREQUEST); // 请求头格式错误 HTTP 400
CHTTPContent *pContent = new CHTTPContent;
pContent->OpenText(g_HTTP_Bad_Request, strlen(g_HTTP_Bad_Request));
pSockInf->pResponse->AttachContent(pContent);
goto exit;
}
// 映射为服务器文件名.
MapServerFile(strUrlObject, strServerFilePath);
// 如果 URL 的最后一个字符是 '/' 说明请求文件列表,否则是请求一个具体的文件.
if(strUrlObject.back() == L'/')
{
// 浏览目录创建目录列表的内容对象,并关联给Response对象
CHTTPContent *pContent = new CHTTPContent;
if(m_bNavDir)
{
if(pContent->OpenDir(strUrlObject, strServerFilePath))
{
pSockInf->pResponse->SetServerCode(SC_OK); // HTTP 200
}
else
{
// 无法列出目录的文件列表.
pContent->OpenText(g_HTTP_Server_Error, strlen(g_HTTP_Server_Error));
pSockInf->pResponse->SetServerCode(SC_SERVERERROR); // HTTP 500
}
}
else
{
// 禁止浏览目录
pContent->OpenText(g_HTTP_Forbidden, strlen(g_HTTP_Forbidden));
pSockInf->pResponse->SetServerCode(SC_FORBIDDEN); // HTTP 403
}
pSockInf->pResponse->AttachContent(pContent);
}
else
{
// 客户端请求了服务器上的一个文件
// 1.客户端是否请求了断点续传的内容
// 2.创建文件内容对象并关联给Response对象
__int64 lFrom = 0;
__int64 lTo = -1;
if(pSockInf->pRequest->GetRange(lFrom, lTo))
{
pSockInf->pResponse->SetServerCode(SC_PARTIAL); //HTTP 206
}
else
{
pSockInf->pResponse->SetServerCode(SC_OK); // HTTP 200
}
CHTTPContent *pContent = new CHTTPContent;
if(pContent->OpenFile(WtoA(strServerFilePath.c_str()).c_str(), lFrom, lTo))
{
// 文件打开成功.
}
else
{
// 文件不存在或者其它什么原因,打开失败.
pContent->OpenHtml(g_HTTP_Content_NotFound, strlen(g_HTTP_Content_NotFound));
pSockInf->pResponse->SetServerCode(SC_NOTFOUND); // HTTP 404
}
pSockInf->pResponse->AttachContent(pContent);
}
exit:
/////////// 准备响应头
pSockInf->pResponse->CookResponse(); // 把上面设置的参数输出为一段符合HTTP协议的文本.
// 写日志.
LOGGER_CINFO(theLogger, _T("连接[%s:%d]请求资源[%s],回应[HTTP %d].\r\n"),
AtoW(pSockInf->pRequest->GetIP().c_str()).c_str(), pSockInf->pRequest->GetPort(),
strUrlObject.c_str(),
pSockInf->pResponse->GetServerCode());
return;
}
// 目的: 通过分析Request对象,准备好Response对象,并在可能的情况下生成一个Content对象并关联到Response对象中.
void CHTTPServer::OnRequest(PCLIENTINF pSockInf)
{
ASSERT(pSockInf);
ASSERT(pSockInf->pRequest);
ASSERT(pSockInf->pResponse);
std::wstring strUrlObject(L"");
std::wstring strServerFilePath(L"");
// 是否是有效的请求头
if(!pSockInf->pRequest->Verify())
{
// 请求头格式不正确,返回HTTP 400和一段关于400的预定义说明文本
pSockInf->pResponse->SetServerCode(SC_BADREQUEST); // HTTP 400
CHTTPContent *pContent = new CHTTPContent;
pContent->OpenText(g_HTTP_Bad_Request, strlen(g_HTTP_Bad_Request));
pSockInf->pResponse->AttachContent(pContent);
goto exit;
}
// 请求的方法是否是 GET 或者 HEAD
HTTP_METHOD method = pSockInf->pRequest->GetMethod();
pSockInf->pResponse->SetMethod(method);
if(method != METHOD_GET && method != METHOD_HEAD)
{
// 目前只支持两种HTTP方法
pSockInf->pResponse->SetServerCode(SC_BADMETHOD); // HTTP 405
CHTTPContent *pContent = new CHTTPContent;
pContent->OpenText(g_HTTP_Bad_Method, strlen(g_HTTP_Bad_Method));
pSockInf->pResponse->AttachContent(pContent);
goto exit;
}
// 获取客户端请求的对象
strUrlObject = pSockInf->pRequest->GetUrlObject();
if(strUrlObject.size() <= 0)
{
// URL Object 为空,说明客户端的请求有问题.
pSockInf->pResponse->SetServerCode(SC_BADREQUEST); // 请求头格式错误 HTTP 400
CHTTPContent *pContent = new CHTTPContent;
pContent->OpenText(g_HTTP_Bad_Request, strlen(g_HTTP_Bad_Request));
pSockInf->pResponse->AttachContent(pContent);
goto exit;
}
// 映射为服务器文件名.
MapServerFile(strUrlObject, strServerFilePath);
// 如果 URL 的最后一个字符是 '/' 说明请求文件列表,否则是请求一个具体的文件.
if(strUrlObject.back() == L'/')
{
// 浏览目录创建目录列表的内容对象,并关联给Response对象
CHTTPContent *pContent = new CHTTPContent;
if(m_bNavDir)
{
if(pContent->OpenDir(strUrlObject, strServerFilePath))
{
pSockInf->pResponse->SetServerCode(SC_OK); // HTTP 200
}
else
{
// 无法列出目录的文件列表.
pContent->OpenText(g_HTTP_Server_Error, strlen(g_HTTP_Server_Error));
pSockInf->pResponse->SetServerCode(SC_SERVERERROR); // HTTP 500
}
}
else
{
// 禁止浏览目录
pContent->OpenText(g_HTTP_Forbidden, strlen(g_HTTP_Forbidden));
pSockInf->pResponse->SetServerCode(SC_FORBIDDEN); // HTTP 403
}
pSockInf->pResponse->AttachContent(pContent);
}
else
{
// 客户端请求了服务器上的一个文件
// 1.客户端是否请求了断点续传的内容
// 2.创建文件内容对象并关联给Response对象
__int64 lFrom = 0;
__int64 lTo = -1;
if(pSockInf->pRequest->GetRange(lFrom, lTo))
{
pSockInf->pResponse->SetServerCode(SC_PARTIAL); //HTTP 206
}
else
{
pSockInf->pResponse->SetServerCode(SC_OK); // HTTP 200
}
CHTTPContent *pContent = new CHTTPContent;
if(pContent->OpenFile(WtoA(strServerFilePath.c_str()).c_str(), lFrom, lTo))
{
// 文件打开成功.
}
else
{
// 文件不存在或者其它什么原因,打开失败.
pContent->OpenHtml(g_HTTP_Content_NotFound, strlen(g_HTTP_Content_NotFound));
pSockInf->pResponse->SetServerCode(SC_NOTFOUND); // HTTP 404
}
pSockInf->pResponse->AttachContent(pContent);
}
exit:
/////////// 准备响应头
pSockInf->pResponse->CookResponse(); // 把上面设置的参数输出为一段符合HTTP协议的文本.
// 写日志.
LOGGER_CINFO(theLogger, _T("连接[%s:%d]请求资源[%s],回应[HTTP %d].\r\n"),
AtoW(pSockInf->pRequest->GetIP().c_str()).c_str(), pSockInf->pRequest->GetPort(),
strUrlObject.c_str(),
pSockInf->pResponse->GetServerCode());
return;
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询