我正在使用boost工作在HTTP服务器上,我有一些关于形成HTTP响应的问题,特别是标题。
这是组装GET响应的代码:
std::string h = statusCodes[200]; // The status code is already finished with a '\r\n'
std::string t = "Date: " + daytime_() + "\r\n";
std::string s = "Server: Muffin 1.0\r\n";
std::string content = search->second();
std::string type = "Content-Type: text/html\r\n";
std::string length = "Content-Length: " + std::to_string(content.size()) + "\r\n";
res = h + t + s + length + type + "\r\n" + content + "\r\n";
正如他们在website上所说的那样,标题为:
请求和响应消息的格式类似,并且 英语为主。这两种消息都包括:
- 初始行,零个或多个标题行
- 空行(即CRLF本身),
- 和可选的邮件正文(例如文件,查询数据或查询输出)。
但是当我在服务器上发出请求时,只有日期在标题中,其余的直接在内容中
HTTP/1.1 200 OK // Header
Date: Tue May 24 10:28:58 2016 // Header
Server: Muffin 1.0 // Content
Content-Length: 31
Content-Type: text/html
This is supposed to be an ID
我不知道这是错误的,这是我第一次处理HTTP响应。
感谢您的帮助
答案 0 :(得分:2)
我终于找到了这个错误。
我的日间函数返回一个带换行符的字符串。
这是原始函数,它使用depreciated ctime
std::string
Response::daytime_()
{
std::time_t now = std::time(0);
return std::ctime(&now);
}
现在是strftime
的新功能std::string
Response::daytime_()
{
time_t rawtime;
struct tm * timeinfo;
char buffer[80];
time (&rawtime);
timeinfo = localtime(&rawtime);
strftime(buffer,80,"%a %b %d %H:%M:%S %Y",timeinfo);
std::string time(buffer);
return time;
}
使用'\ n'
形成回复的新方法std::string res = "";
std::string h = statusCodes[200];
std::string t = "Date: " + daytime_() + "\r\n";
std::string s = "Server: Muffin 1.0\r\n";
std::string content = search->second();
std::string type = "Content-Type: text/html\r\n";
std::string length = "Content-Length: " + std::to_string(content.size()) + "\r\n";
res = h + t + s + length + type + "\n" + content + "\r\n";