本項目主要實現一個HTTP服務器的框架結構,爲了瞭解HTTP服務器的工作流程,下面實現一個多線程版本的HTTP服務器框架,採用CGI協議來進行程序替換完成主要業務,主要支持GET和POST方法。
關於HTTP協議:
https://blog.csdn.net/hansionz/article/details/86137260
關於CGI協議:
如果使用非CGI
協議處理瀏覽器的請求的話很簡單,服務器直接將瀏覽器請求的資源返回即可。但是使用CGI協議方式爲瀏覽器服務的框架原理如下:
HTTP服務器的工作原理:
- 搭建的是一個多線程服務器,並且使用短連接。
- 所以每當建立一個連接之後,就創建一個線程去處理這個請求,並將這個線程設置成分離狀態,然後主線程繼續處於監聽狀態。
- 當線程處理完這個請求之後,然後斷開連接。
- 實現支持GET和POST方法的小型http服務器。
GET方法:如果GET方法只是簡單的請求一份資源,而不傳遞參數的話則由服務器直接將資源返回即可。如果GET方法的URL中帶有參數的話,則就要使用CGI程序進行響應計算。
POST方法:POST方法要使用CGI程序進行處理。POST的參數在消息正文中出現。
- 由於請求方法在http請求報文中的第一行,所以我們需要按行讀取第一行,然後判斷是那種方法,然後判斷是不是CGI程序。
- 當我們判斷出是GET請求時,並且url中沒有參數的時候,就是用非CGI模式。非CGI模式處理起來比較簡單,首先我們要解析出請求路徑,然後判斷請求的是不是合法資源,如果是的話,我們就直接返回這個資源即可。
- 當是CGI模式處理請求的時候,我們要要將
fork
一個子進程,對子進程exec
替換CGI程序。在這過程中,我們使用pipe
進行父子進程之間的通信。可以將參數設置爲環境變量,然後CGI程序可以根據環境變量獲得參數,從而構造響應結果。
HTTP服務器的主要流程:
項目源碼: