Goでsocketに対して自前のヘッダーでPOSTする

最近Go言語で物を作っています。この言語、楽しいんですが、使いこなすのが難しそうですね・・・

というわけで、Go言語でUNIX domain socketに対して自前でヘッダー作ってPOSTしたかった話です。

簡単にできる方のnet/httpモジュールを使いたかったのですが、UNIX domain socketにファイル名から接続することはできませんでした。

そこで調べているとnetモジュールから直接ソケットに接続してデータを送る方法がありました。

ヘッダーも自分で作る必要がありますが、とりあえずこの方法でやってみようと思います。

    conn, err := net.Dial("unix", "/path/to/your/go.sock")
    if err != nil {
        log.Printf("error: %v\n", err)
        return
    }
    defer conn.Close()
    fmt.Fprintf(conn, "POST /get HTTP/1.0\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: 4\r\n\r\nid=5")
    readBuf := make([]byte, 1024)
    readlen, err := conn.Read(readBuf)
    if err != nil {
        log.Printf("error: %v\n", err)
        return
    }
    fmt.Println("response: " + string(readBuf[:readlen]))

ポイントはヘッダーにContent-Type: application/x-www-form-urlencodedとContent-Length: 4を入れているところです。サーバーもGoで書いているのですが、最低限このヘッダーが必要らしく、しばらく調べ回ってしまいました・・・

参考

  • https://github.com/kaneshin/playground/blob/master/go/net/listen-unixdomainsocket/main.go
  • https://golang.org/pkg/net/
  • https://support.f5.com/kb/en-us/solutions/public/2000/100/sol2167.html
  • http://rarara.cafe.coocan.jp/cgi-bin/lng/vc/vclng.cgi?print+200606/06060021.txt

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です