基於CGI協議的HTTP服務器

本項目主要實現一個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服務器的主要流程:
在這裏插入圖片描述項目源碼:

https://github.com/hansionz/HttpServer

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章