day17-WebServer(六)

                                          WebServer(六)

Readme:

~該版本改動:

       解決客戶端發送空請求的問題。HTTP協議允許客戶端發送一個空請求(不是按照標準的request格式發送,而是沒有內容)由於ClientHandler上來在解析request時我們讀取請求行內容後會拆分三部分,如果此時發送消息的是空請求則會出現數組下標越界的情況,導致後續操作無法進行。對於空請求,服務端的實際操作忽略即可。

       爲此我們做出如下改動:

  1. 在core包中定義一個自定義異常EmptyRequestException。
  2. 當解析請求時遇到空請求時,HttpRequest拋出該異常給ClientHandler。
  3. ClientHandler在捕獲了空請求後,直接與客戶端斷開連接即可。

       在頁面上支持對圖片的顯示工作,最終通過此版本更新使服務端支持對客戶端請求的任意資源進行正確響應。eg:①在webapps/myweb下添加一張圖片②在index.html中添加顯示該圖片的標籤<img ...>③在WebServer的start方法中循環接收客戶端連接的while循環解除註釋

       測試後發現,客戶端在顯示index頁面時,實際對服務端請求了兩次,第一次是請求我們在地址欄輸入的index頁面的內容,當瀏覽器解釋該頁面內容時發現<img>標籤後,會根據該標籤中指定的路徑再次發起連接請求獲取該圖片文件,雖然圖片可以正常顯示,但服務端在響應該圖片時在響應頭中描述該圖片的類型時,依然告知客戶端爲html代碼。(因爲HttpRequest中發送響應頭中的Content-Type是寫死的發送"text/html")這回導致將來客戶端在請求其他資源時不能正常理解該資源導致顯示出現異常。

       解決方法:

  1. 在HttpContent類中定義一個方法,可以根據資源名的後綴獲取其對應的Content-Type的值:
    ①在HttpContext中定義一個Map類型的靜態屬性MIME_MAPPING,其中key爲資源後綴名,value爲其對應的Content-Type的值。
    ②添加一個初始化該Map的方法:initMimeMapping。
    ③在HttpContext的靜態塊中調用初始化方法。
    ④定義靜態方法:getMimeType(String ext)用來根據指定的資源後綴獲取對應的Content-Type的值。
  2. 重構HttpResponse,在sendHeaders方法中,現在的做法是發送了兩個頭Content-Type與Content-Length。但實際上不是每個響應都必須包含這兩個頭,並且也可能會包含其他頭。爲此發送的響應頭應當也是可以進行設置的:
    ①在HttpResponse中添加一個Map類型的屬性:headers用於保存本次響應要發送給客戶端的響應頭內容,其中key爲響應頭的名字,value爲響應頭的值。
    ②提供一個putHeaders方法,允許外界向當前響應中設置要發送的響應頭內容。
    ③sendHanders方法改爲遍歷headers這個Map,將每個響應頭髮送至客戶端。

WebServer:

 

 

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