1. 程式人生 > >mochiweb原始碼分析(六)

mochiweb原始碼分析(六)

1.說下call_body這函式

這裡的Body就是之前說的處理http請求的方法,如下圖

容易看出呼叫的是call_body/2的第三個分支,然後再看看我們寫的簡單的helloweb模組的開啟伺服器部分

這實際上是一個閉包的用法,即呼叫的是helloweb:loop(Req, DocRoot),DocRoot我自己寫的是存放html檔案的路徑,方便下面處理http請求時用到,?MODULE是指當前的模組名

2.下面說一下helloweb:loop(Req, DocRoot)

這個方法一般是使用者自己寫的,實際上是將mochiweb各模組提供的API進行組裝,得到想要的處理http請求的邏輯。

說一個特殊的地方,比如

Req:get(method) 

一般我們用指定的模組名和函式名確定呼叫哪個API,但這裡Req是一個元祖,可參考erlang程式設計第二版的第二十四章的有狀態的模組,這裡我截圖了書上的解釋

比如說,

{?MODULE, [Socket, Opts, Method, RawPath, Version, Headers]}:get(method)相當於
?MODULE:get(method, [Socket, Opts, Method, RawPath, Version, Headers]).

3.

說一下怎樣將訊息體傳送給瀏覽器,我自己寫的一個邏輯是找到路徑下的html檔案,將寫好的html檔案傳送給瀏覽器,瀏覽器會根據html檔案的內容呈現靜態頁面。

這裡是呼叫Req:serve_file/2這個函式,這個Req物件在mochiweb_request:new/6這個函式生成的

第一個元素就是模組名,即mochiweb_request,所以Req:serve_file/2就是mochiweb_request:serve_file/3,serve_file/3函式如下所示:

第一行程式碼會呼叫mochiweb_util:safe_relative_path/2,看這個函式的解釋如下:

即檢測相對路徑是否是安全或未定義的,不安全和未定義的都會返回undefined。

如果是正確的相對路徑,則會呼叫第二個分支,filename:join/2是路徑名的拼接,然後用filelib:is_dir檢查路徑是否是一個目錄,

如果是目錄,則執行true流程,如果不是目錄,則執行false流程