Go言語でコンテンツフィルタとして使うプロキシサーバをつくってみました。
使ったのは以下のライブラリです。
https://github.com/elazarl/goproxy
随分前に(まだRubyがCマガジンで連載されていたころ)、このような目的のProxyServerをRubyで立てたことがありましたが、exeにビルドできて配布しやすいGo言語にすることでいろんな可能性があるように思えます。
環境 : go1.4.1 windows/amd64 / Windows 7
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
package main import ( "goproxy-1.0" "log" "net/http" "regexp" "fmt" "io/ioutil" "bytes" "strings" ) func main() { proxy := goproxy.NewProxyHttpServer() proxy.Verbose = true re := regexp.MustCompile(`^.*\.com/.*$`) proxy.OnRequest(goproxy.UrlMatches(re)).DoFunc(func(r *http.Request, ctx *goproxy.ProxyCtx) (*http.Request, *http.Response){ return r,goproxy.NewResponse(r, goproxy.ContentTypeHtml, http.StatusOK, "<h3>Access Denied by Proxy</h3>") }) proxy.OnRequest().DoFunc(func(req *http.Request, ctx *goproxy.ProxyCtx) (*http.Request, *http.Response) { return req, nil }) proxy.OnResponse().DoFunc(func(resp *http.Response, ctx *goproxy.ProxyCtx) *http.Response { body, err:= ioutil.ReadAll(resp.Body) fmt.Printf("%s", body) fmt.Printf("%s", err) resp.Body.Close() b1 := strings.Replace(string(body), "#111111", "#555555", -1) b2 := strings.Replace(b1, "#a90000", "#0000a9", -1) resp.Body = ioutil.NopCloser(bytes.NewBufferString(b2)) return resp }) log.Fatal(http.ListenAndServe(":8080", proxy)) } |
機能としては、実用的ではありませんが、.comドメインのアクセス拒否と、Webページの色変換をしています。アクセス拒否をHTTPステータス403でなく200にしているのは、IEの403用の画面でなく、こちらの意図した画面を出したいためです。
文字列の置換にはさすがに負荷がかかりますが、結構速いという印象をうけます。
初めてのGo言語プログラムでした。