该项目作为42个核心课程的一部分完成。它是用Alouane04完成的
该项目的目的是从头开始构建C ++ 98兼容的HTTP Web服务器。 Web服务器可以处理HTTP获取,头部,发布,放置和删除请求,并可以使用CGI从指定的根目录或动态内容提供静态文件。它还能够在Select()的帮助下同时处理多个客户端连接。
用法
介绍
Web服务器的一部分
make
./webserv [Config File] # # leave empty to use the default configuration.HTTP(超文本传输协议)是用于通过Internet发送和接收信息的协议。它是万维网的基础,由网络浏览器和网络服务器使用来相互通信。
HTTP Web服务器是一种软件应用程序,可听取并响应客户端的HTTP请求(例如Web浏览器)。 Web服务器的主要目的是托管Web内容,并通过Internet向用户提供它。
HTTP由请求和响应组成。当客户端(例如Web浏览器)想要从服务器检索网页时,它将HTTP请求发送到服务器。然后,服务器处理请求并发送回HTTP响应。
HTTP消息格式
start-line CRLF
Headers CRLF
CRLF(end of headers)
[message-body]
CRLF are Carriage Return and Line Feed (rn), which is just a new line.
HTTP消息可以是请求或响应。
HTTP请求
HTTP请求由请求行,标题和可选消息主体组成。这是HTTP请求的示例:
GET /index.html HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
请求行包括三个部分:方法,路径和HTTP版本。该方法指定了客户端要执行的操作,例如获取(检索资源)或发布(将数据提交到服务器)。路径或URI指定服务器上资源的位置。 HTTP版本指示正在使用的HTTP协议的版本。
标题包含有关请求的其他信息,例如服务器的主机名和所使用的浏览器类型。
在上面的示例中,没有消息主体,因为获取方法通常不包括任何主体。
HTTP响应
HTTP响应还包括状态线,标题和可选消息主体。这是HTTP响应的示例:
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1234
<Message Body>
状态行包括三个部分:HTTP版本,状态代码和原因短语。状态代码指示请求的结果,例如未找到200个OK(成功)或404(找不到资源)。短语的原因是对状态代码的简短描述。以下是状态代码表示的非常简短的摘要:
1xx仅表示信息信息
2xx表示某种成功
3xx将客户端重定向到另一个URL
4xx表示客户端的错误
5xx表示服务器部分上的错误
标题包含有关响应的其他信息,例如要返回的内容的类型和大小。消息主体包含响应的实际内容,例如网页的HTML代码。
HTTP方法
| 方法 | 描述 | 可能的身体 |
|---|---|---|
GET | 检索特定资源或资源集合,不应影响数据/资源 | 不 |
POST | 在请求内容上执行特定资源的处理 | 是的 |
DELETE | 删除URI给出的目标资源 | 是的 |
PUT | 创建一个带有消息主体数据的新资源,如果资源已经存在,请使用主体中的数据进行更新 | 是的 |
HEAD | 与get相同,但不要传输响应内容 | 不 |
得到
HTTP GET方法用于读取(或检索)资源的表示。如果成功(或非错误),请在响应主体和HTTP响应状态代码200(OK)中获得返回资源的表示形式。在错误情况下,它通常返回404(未找到)或400(不良请求)。
邮政
HTTP POST方法最常用于创建新资源。在成功创建时,返回了HTTP响应代码201(创建)。
删除
http删除是前进的。它删除了URI中指定的资源。在成功的删除时,它返回HTTP响应状态代码204(无内容)。
阅读有关HTTP方法RFC9110#9.1的更多信息
基本的HTTP Web服务器由几个组件组成,这些组件共同接收和处理客户端的HTTP请求并回复响应。以下是我们网络服务器的主要部分。
Web服务器的网络部分处理TCP连接并执行任务,例如聆听传入请求并寄回响应。它负责Web服务器的低级网络任务,例如创建和管理插座,处理输入和输出流以及管理服务器和客户端之间的数据流。
在编写Web服务器之前,我建议阅读有关在C中构建简单TCP客户端/服务器的出色指南,因为它将帮助您很好地了解TCP在C/C ++中的工作方式。另外,您还需要了解I/O倍增,该视频将帮助您掌握Select()的主要思想。
在下面的流程图中总结了我们的Web服务器中的I/O多路复用过程。 (CGI不包括在流程图中,但将来可能会添加)
Web服务器的解析部分是指负责解释和从HTTP请求中解释和提取信息的过程。在此Web服务器中,请求的解析由HTTPRequest类执行。 httprequest对象会收到传入的请求,解析并提取相关信息,例如方法,路径,标题和消息主体(如果存在)。如果在解析过程中的请求中发现了任何语法错误,则设置错误标志并解析停止。可以通过方法feed()完全或部分地将请求送入对象,这是可能的,因为解析器一次扫描请求字节并在需要时更新解析状态。 NGINX和NODEJS请求解析使用使用相同的解析方式。
以下是解析器的工作方式的概述。
响应构建器负责构建和格式化HTTP响应,这些响应将响应其请求发送给客户。在此Web服务器中,响应类负责构建和存储HTTP响应,包括状态线,标题和消息主体。响应构建器还可以根据请求的结果执行任务,例如设置适当的状态代码和原因短语,将标头添加到响应中以提供有关内容或服务器的其他信息,并根据内容类型和响应的编码来格式化消息主体。例如,如果服务器从客户端收到网页请求,服务器将解析请求并将其传递给响应对象,该对象将获取网页的内容,并使用消息主体中的HTML内容和适当的标头构建HTTP响应,例如内容型型和内容长度长的headers。
配置文件是一个文本文件,其中包含各种设置和指令,这些设置和指令决定了Web服务器应如何运行。这些设置可以包含Web服务器应收听的端口号,Web服务器的根目录的位置以及许多其他设置。
这是一个显示配置文件格式和支持指令的示例fie。
server {
listen 8001 ; # listening port, mandatory parameter
host 127.0.0.1; # host or 127.0.0.1 by default
server_name test; # specify server_name, need to be added into /etc/hosts to work
error_page 404 /error/404.html; # default error page
client_max_body_size 1024 ; # max request body size in bytes
root docs/fusion_web/; # root folder of site directory, full or relative path, mandatory parameter
index index.html; # default page when requesting a directory, index.html by default
location /tours {
root docs/fusion_web; # root folder of the location, if not specified, taken from the server.
# EX: - URI /tours --> docs/fusion_web/tours
# - URI /tours/page.html --> docs/fusion_web/tours/page.html
autoindex on ; # turn on/off directory listing
allow_methods POST GET; # allowed methods in location, GET only by default
index index.html; # default page when requesting a directory, copies root index by default
return abc/index1.html; # redirection
alias docs/fusion_web; # replaces location part of URI.
# EX: - URI /tours --> docs/fusion_web
# - URI /tours/page.html --> docs/fusion_web/page.html
}
location cgi-bin {
root ./; # cgi-bin location, mandatory parameter
cgi_path /usr/bin/python3 /bin/bash; # location of interpreters installed on the current system, mandatory parameter
cgi_ext .py .sh; # extensions for executable files, mandatory parameter
}
}CGI是从Web服务器运行外部程序的标准。当用户请求应由CGI程序处理的网页时,Web服务器将执行程序并将输出返回到用户的Web浏览器中。
CGI程序只是可以用任何编程语言编写的脚本,例如Perl,Python或Bash,通常用于处理用户通过Web浏览器提交的数据,或在网页上生成动态内容。