2012/10/23

手軽に使える forward http proxy : stone, Tinyproxy - 酒日記 はてな支店

直接グローバルに繋がる経路をもたないホストから http アクセスしたいので http proxy を使いたい。Squidは定番ですが、もう少し手軽なのはなにかないかと思っていたところ twitter で教えていただきました。

http://d.hatena.ne.jp/sfujiwara/20121023/1350990163
本題からそれますが、go言語で小さいプロキシを使う場合に僕がお勧めしたいのが goproxy です。
elazarl/goproxy - GitHub

An HTTP proxy library for Go

https://github.com/elazarl/goproxy
goproxy 自身は実は実行モジュールを提供していません。ですので goproxy を使った実行モジュールは自分で作ります。
package main

import (
    "github.com/elazarl/goproxy"
    "log"
    "net/http"
)

func main() {
    proxy := goproxy.NewProxyHttpServer()
    proxy.Verbose = true
    log.Fatal(http.ListenAndServe(":8080", proxy))
}
このソースを proxy.go という名前で保存して、go build proxy.go とすれば実行モジュールが出来上がります。
ポートを変えたいであったり、監視機能を付けたいという人は勝手にソースを弄ります。
goproxy はプログラマブルなプロキシです。なので例えば
package main

import (
    "github.com/elazarl/goproxy"
    "log"
    . "net/http"
    "regexp"
    "time"
)

func main() {
    proxy := goproxy.NewProxyHttpServer()
    proxy.Verbose = true
    re := regexp.MustCompile(`^(www\.)?2ch\.net/?`)
    proxy.OnRequest(goproxy.UrlMatches(re)).DoFunc(
        func(r *Request, ctx *goproxy.ProxyCtx) (*Request, *Response) {
            h,_,_ := time.Now().Clock()
            if h >= 9 && h <= 18 {
                return r,goproxy.NewResponse(r,
                    goproxy.ContentTypeText, StatusForbidden,
                    "就業時間中です。通報しました。")
            }
            return r, nil
    })
    log.Fatal(ListenAndServe(":8888", proxy))
}
こう書けば就業時間中の2ch閲覧禁止を行うプロキシが出来上がります。もちろん外部の設定を参照して制御を行うのも良いと思います。
また squid の様にキャッシュする事で高速に動作させる事も出来るかと思います。オリジナルのプロキシを作ってみたいという方は試してみる価値あるかと思います。

プログラミング言語Goフレーズブック プログラミング言語Goフレーズブック
David Chisnall, デイビッド・チズナール
ピアソン桐原 / (2012-10-04)
 
発送可能時間:

Posted at 21:38 | WriteBacks () | Edit
Edit this entry...

wikieditish message: Ready to edit this entry.






















A quick preview will be rendered here when you click "Preview" button.