客户端通过URI,Content-Type等请求头的内容访问服务端的特定实体,今天主要学习这部分内容。
(一)C++文件I/O
服务端收到HTTP请求后,需要对请求头进行解析,之后获取响应资源,最后返回。
本文使用C++ file stream的方式读取文件后返回。
C++ file stream提供3个接口:
1.ofstream: Stream class to write on files
2.ifstream: Stream class to read from files
3.fstream: Stream class to both read and write from/to files.
1.1 ofstream
将内容输出到文件,用法跟标准的I/O函数类似:
#include <iostream>
#include <fstream>
using namespace std;
int main () {
ofstream myfile;
myfile.open ("example.txt");
if(myfile.is_open())
{
myfile << "Writing this to a file.\n";
myfile.close();
}
return 0;
}
执行之后,当前目录的example.txt文件中将有”Writing this to a file.”输出。
1.2 ifstream
从文件输入内容到程序,跟标准I/O函数用法类似。
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{
string content;
string line;
ifstream myfile ("index.html");
if(myfile.is_open())
{
while(getline(myfile,line))
{
content+=line;
}
myfile.close();
}
cout<< content<<endl;
return 0;
}
(二)获取uri
我们直到HTTP请求第一行是请求行,接下来是请求头,再接下来是请求报文。
一个请求行示例如下:
GET /index.html HTTP/1.1<CR><LF>
分别是请求方法(GET)、请求URI(根目录下的index.html)、HTTP协议版本(HTTP/1.1)。
<CR><LF>
分别是\r\n
换行和回车。
使用string流的方式对请求进行解析:
stringstream ss;
ss<<buffer;
string method;
ss>>method;
string uri;
ss>>uri;
string version;
ss>>version;
(三)mime-type
互联网媒体类型(Internet media type,也称为MIME类型(MIME type)或内容类型(content type))是给互联网上传输的内容赋予的分类类型。一份内容的互联网媒体类型是由其文件格式与内容决定的。互联网媒体类型与文件拓展名相对应,因此计算机系统常常通过拓展名来确定一个文件的媒体类型并决定与其相关联的软件。互联网媒体类型的分类标准由互联网号码分配局(IANA)发布。1996年十一月,媒体类型在RFC 2045中被最初定义,当时仅被使用在SMTP协议的电子邮件中。现在其他的协议(比如HTTP或者SIP)也都常使用MIME类型。 一个MIME类型至少包括两个部分:一个类型(type)和一个子类型(subtype)。此外,它还可能包括一个或多个可选参数(optional parameter)。比如,HTML文件的互联网媒体类型可能是
text/html; charset = UTF-8
在这个例子中,文件类型为text,子类型为html,而charset是一个可选参数,其值为UTF-8。
例如在nginx的安装目录下的conf文件夹下有mime.types将扩展名和媒体类型对应,这样就可以通过不同的文件扩展名去规定响应的Content-Type
types {
text/html html htm shtml;
text/css css;
text/xml