CarsonSlovoka / dovego

Build a simple server with go, and that helps you write the js easier.
MIT License
0 stars 0 forks source link

Router (urls) #5

Open CarsonSlovoka opened 2 years ago

CarsonSlovoka commented 2 years ago

待辦事項



CarsonSlovoka commented 2 years ago

07747f3

router的其中一環,當訪問某一個URL的時候,要怎麼樣取得Server的資源 (也就是訪問server的端的檔案)

他的最簡單的做法像這樣

但這樣做的缺點:

  1. 沒辦法讀取目錄中的index.html
  2. contentType要自己寫 (可以用 mime.TypeByExtension(".html") )

所以比較好的方式是建立一個比較正規的Fileserver來幫忙

fileserver要考量的有兩點,要可以支持embed和直接讀取檔案,所以我們會給他http.FileSystem來當作參數

https://github.com/CarsonSlovoka/dovego/blob/07747f31e7757b26d231778ef0b5317a8edb10bc/src/pkg/net/http/fs.go#L10

他的用法


前面都是在為Open和Read做鋪墊,在接下來因為http.Handler需要ServeHTTP的方法,所以要實作它

https://github.com/CarsonSlovoka/dovego/blob/07747f31e7757b26d231778ef0b5317a8edb10bc/src/pkg/net/http/file_handler.go#L19-L27

以上代碼只是最URL的路徑稍微調整一下罷了,

而serveFile主要做的就是考量訪問的是資料夾還是index.html之類的罷了,另外如果是資料夾會在地回呼叫自己(要確認是否有index.html存在),最後有個localRedirect 它可以在當前您的路徑回傳相對路徑給server

最後呼叫serveContent

這個東西其實不好寫,關於content-type有現成的東西用,另外有兩個東西很棘手

  1. content-type沒辦法從副檔名直接看出: 這時候就要去讀取檔案的bytes來判別其可能的content-type是什麼,這部份我暫時省略
  2. 如果是Handle Content-Range header,要分批擷取資料,這部份我也沒有做,我直接全部讀取,要做可以go/src/net/http/fs.go
CarsonSlovoka commented 2 years ago

5b215fb

修改網址其實只要改r.URL.Path即可讓使用者看到修改過的網址

https://github.com/CarsonSlovoka/dovego/blob/5b215fbf68018f1ea4223114905b30c6b4545316/src/app/urls/plugin.go#L29

其他注意事項

所有的url後面記得補上\

不然會跑到

https://github.com/CarsonSlovoka/dovego/blob/5b215fbf68018f1ea4223114905b30c6b4545316/src/pkg/net/http/file_handler.go#L54-L65

這段的代碼其實沒有測試過

目前已知如果刻意把最後的\移除,就會進入,然後相對路徑會導致結果不正確。

比較奇怪的是在結束程式之後,localhost的路徑可能不會還原,

例如輸入 localhost:8080/helloWorld/ 他可能會幫你導向 localhost:8080/helloWorld/hello-world

您需要把cookie和一些瀏覽紀錄刪除之後,連結的網址導向才會正確。

否則你的程式即便是對的,他也會導向其他的網址,造成你以為自己是錯的假象

CarsonSlovoka commented 2 years ago

942285d

如果要停用shutdownURL只需要給空白即可

https://github.com/CarsonSlovoka/dovego/blob/942285deb2eac63c76ced42fe23ab8c8d8e9f7ae/src/app/urls/sys.go#L14-L20

其他事項

由於有越來越多config要填寫,所以把config移到單獨的package去

還是有辦法讓app讀取到他,只需在app宣告他的變數,然後載入它即可。

https://github.com/CarsonSlovoka/dovego/blob/942285deb2eac63c76ced42fe23ab8c8d8e9f7ae/src/app/app.go#L5-L7

https://github.com/CarsonSlovoka/dovego/blob/942285deb2eac63c76ced42fe23ab8c8d8e9f7ae/src/main.go#L21