老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業提供網站建設、域名注冊、服務器等服務

caddy中怎么添加自定義插件

這期內容當中小編將會給大家帶來有關caddy中怎么添加自定義插件,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

目前創新互聯公司已為上千的企業提供了網站建設、域名、網絡空間、網站托管維護、企業網站設計、五峰網站維護等服務,公司將堅持客戶導向、應用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協力一起成長,共同發展。

創建一個 Go Package

首先為 caddy 創建一個 插件的 Go Package ,你可以新建一個文件夾達到這個效果。比如

├── caddy-plugin
│   ├── gizmo.go
│   └── setup.go

這里分為了兩個 Go 文件,接下來詳細講每一個 Go 文件的作用。

代碼????:注冊 caddy plugin

首先我們看到 setup.go

setup.go

創建 setup.go 文件并寫入以下信息

import "github.com/mholt/caddy"

func init() {
    caddy.RegisterPlugin("gizmo", caddy.Plugin{
        ServerType: "http",
        Action:     setup,
    })
}

這里是 建立了一個新插件,caddy 包來做到插件的注冊。

  1. 注意到 “gizmo” 這是 插件的名字,同時也是指令的名字,請為你的插件取一個獨一無二的名字吧。(注意:名字需要是單詞小寫哦。)

  2. 因為是針對 HTTP 服務器的插件,所以 ServerType 字段值是 “http”

  3. 另一個設置的字段是 setup ,實際上,我們接下來會填充這個函數的邏輯。它的作用就是將我們插件的處理邏輯安裝到 Caddy 中。

setup

現在我們來實現 setup 函數 

假如我們希望在Caddyfile中有一行這樣的行:

gizmo foobar


我們可以得到剛才所說的 c.Next() 第一個參數(“foobar”)的值,如下所示:

for c.Next() {              // skip the directive name
    if !c.NextArg() {       // expect at least one value
        return c.ArgErr()   // otherwise it's an error
    }
    value := c.Val()        // use the value
}

我們首先注意到, c.Next() 是真正我們讀取 caddyfile 邏輯的地方,caddyfile 就是配置服務器的配置文件的名字。我們注意到,這里的操作實際上是使用 caddy.Controller 來實現的。它的存在 讓編寫插件的開發者只需要關注如何使用它來執行你的命令,這是一項優秀的設計,有興趣可以看我的源碼閱讀部分關于 Plugin 的具體實現。

在 Caddy 解析了Caddyfile之后,它將迭代每個指令名(按照服務器類型規定的順序),并在每次遇到指令名時調用指令的setup函數。setup函數的職責是解析指令的標識并配置自己。

您可以通過遍歷c.Next()來解析為指令提供的標識,只要有更多的標識需要解析,那么c.Next()就會返回true。由于一個指令可能出現多次,你必須遍歷c.Next()以獲得所有出現的指令并使用第一個標識(即指令名)。
有關caddyfile包,請參閱godoc以了解如何更充分地使用分發器,并查看任何其他現有插件。

代碼 ????:Handler 實現

gizmo.go:

查看httpserver包的godoc。最重要的兩種類型是httpserver.Handler和httpserver.Middleware。

  1. Handler是一個處理HTTP請求的函數。

  2. Middleware是一種連接Handler的方式。

Caddy將負責為你設置HTTP服務器的所有簿記(bookkeeping)工作,但是你需要實現這兩種類型。

Struct

httpserver.Handler是一個幾乎和http.Handler完全一樣的接口,除了ServeHTTP方法返回(int, error)
這個方法簽名遵循Go語言博客中關于與中間件相關的錯誤處理的建議。
int是HTTP狀態碼,error應該被處理和/或記錄。有關這些返回值的詳細信息,請參閱godoc。

Handler通常是一個結構體,至少包含一個Next字段,用來鏈接下一個Handler

type gizmoHandler struct {
	next httpserver.Handler
}


除了這些之外,可以添加一些自己使用的參數,考慮 grpc 的 plugin 實現,解釋放在代碼塊中的注釋中

type server struct {
	backendAddr       string // 監聽地址
	next              httpserver.Handler // 作為中間件必須有的字段
    backendIsInsecure bool // 是否啟用 Insecure() 選項,是 grpc 的一項配置
	backendTLS        *tls.Config // 關于 TLS 的使用的證書文件
	wrappedGrpc       *grpcweb.WrappedGrpcServer // 通過 grpcweb 的 協議實現 HTTP 請求等
}

這就是參考的一個 字段的使用。可以根據自己的需要,調整在 caddyfile 中讀取的指令應該如何配置。

httpserver.Handler

為了實現httpserver.Handler接口,我們需要編寫一個名為ServeHTTP的方法。這個方法是實際的處理程序函數,除非它自己處理完畢請求,否則它應該調用鏈中的下一個Handler:即使用 g.next.ServeHTTP(w, r)

func (g gizmoHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error) {
	return g.next.ServeHTTP(w, r)
}

這里只是框架,具體邏輯可以自行填充,可以參照已有的 Plugin 實現。

第二步,注冊 Middleware

然后我們可以進行第二步,將這個 handler 注冊到整個 caddy 的 http 調用鏈上。

我們需要回到 剛才的 setup.go 文件中,
回到設置函數。你剛剛解析了標識并使用所有適當的配置設置了中間件處理程序:

func setup(c *caddy.Controller) error {
	g := gizmoHandler{} // 用來實現 HTTPHandler 的 next 的結構,用來構建 中間件。也可以加入一些自己的字段

    for c.Next() {
        // 獲取配置文件,并處理
    }
    // 現在開始注冊中間件
	httpserver.GetConfig(c).AddMiddleware(func(next httpserver.Handler) httpserver.Handler {
		g.next = next
		return g
	})
	
	return nil
}

這樣,代碼部分就全部完成了。

下面我們查看需要注意的事項。實際上是關乎于怎樣將寫好的插件集成在 caddy 中。

排序

要做的事情是告訴服務器類型在進程的什么地方執行你的指令。這一點很重要,因為其他指令可能會設置你所依賴的更原始的配置,因此執行指令的順序不能是隨意的。

每個服務器類型都有一個字符串列表,其中每個項都是一個指令的名稱。例如,查看HTTP服務器支持的指令列表。將指令添加到適當的位置。

插入你的插件

最后,不要忘記導入你的插件包!Caddy必須導入插件來注冊并執行它。這通常是在run.go的import部分的尾部完成的:

_ "your/plugin/package/here"

請注意:包名前的_是必需的。

上述就是小編為大家分享的caddy中怎么添加自定義插件了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注創新互聯行業資訊頻道。


本文名稱:caddy中怎么添加自定義插件
當前路徑:http://www.xueling.net.cn/article/pdspoc.html

其他資訊

在線咨詢
服務熱線
服務熱線:028-86922220
TOP
主站蜘蛛池模板: 欧美高清视频在线观看 | 蜜臀色欲Av在线播放国产日韩 | 免费看草逼| 中文字幕无码日韩专区免费 | 韩国V欧美V亚洲V日本V | 高清成人爽a毛片免费 | 成人97精品毛片免费看 | 午夜免费在线 | 无码无遮挡又大又爽又黄的视频 | 超碰97人人做人人爱2020 | 粉嫩国产15xxxxx | 男人j桶进女人p无遮挡 | 91成人免费在线观看 | 亚洲国产精品一区久久av篠田 | 成人午夜精品久久久久久久蜜臀 | 91亚洲精品久久久久图片蜜桃 | 久久人妻少妇偷人精品综合桃色 | 国产精品粉嫩av | 无码一区二区三区免费 | 成人无码区免费a片www | 亚洲成AV人无码综合在线观看 | 国产老妇伦国产熟女老妇高清 | 欧美国产在线一区 | 亚洲av毛片成人精品 | 极品无码国模国产在线观看 | 麻豆md0049免费 | 狠狠色噜噜狠狠狠狠色综合久AV | 在线观看免费人成视频播放 | 亚洲精品日韩专区 | 亚洲视频1区2区3区4区 | 国产精品综合久久 | 国产免费拔擦拔擦8x高清在线人 | 久久国产自偷自偷免费一区调 | 久久久乱码精品亚洲日韩mv | 天天澡天天添天天摸97影院 | 国产免费av片在线观看麻豆 | 久久勉费视频 | 久久不卡一区 | 亚洲综合成人一区 | 好吊妞国产欧美日韩免费观看 | 亚洲国产精品综合久久20 |