从零开始学写HTTP服务器(三)请求资源

客户端通过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     
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值