該項目作為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瀏覽器提交的數據,或在網頁上生成動態內容。