私が歌川です

@utgwkk が書いている

Go言語の http.Client による外部リクエストの全てに独自のヘッダーを付与する

req.Header.Set("X-Hoge", "fugapiyo") する http.RoundTripper を実装したらできそう。

実装

全てのリクエストの User-Agentutagawakiki-bot (+https://twitter.com/utgwkk) に設定する RoudTripper です。こんな感じで http.DefaultClient.Transport に設定したり、お使いの http.Client に挟み込んだりできます。

package main

import (
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
)

func main() {
    http.DefaultClient.Transport = &userAgentTransport{}

    resp, err := http.Get("https://httpbin.org/headers")
    if err != nil {
        log.Fatal(err)
    }
    defer resp.Body.Close()

    buf, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(string(buf))
}

const userAgent = "utagawakiki-bot (+https://twitter.com/utgwkk)"

type userAgentTransport struct {
    Transport http.RoundTripper
}

func (t *userAgentTransport) RoundTrip(req *http.Request) (resp *http.Response, err error) {
    transport := t.Transport

    if transport == nil {
        transport = http.DefaultTransport
    }

    req.Header.Set("User-Agent", userAgent)

    resp, err = transport.RoundTrip(req)

    return
}

実行結果

{
  "headers": {
    "Accept-Encoding": "gzip", 
    "Host": "httpbin.org", 
    "User-Agent": "utagawakiki-bot (+https://twitter.com/utgwkk)", 
    "X-Amzn-Trace-Id": "Root=1-5fc3621d-0125a0fe085c502a32591819"
  }
}

オチ

github.com/google/go-github には User-Agent 文字列を設定するインタフェースが用意されていたので、この実装は不要になりました。よかったですね。

github.com