AllIsHackedOff

Just a memo, just a progress

net/http触り直し(1)

GolangでWAFを使わなくても問題ない的な話が年末上がっていたのと(advent calendar界隈で)自分的にもそう思ったので RequestのBodyやらHeaderやらを適当にParseする方法を復習がてらメモ。

package main

import (
    "fmt"
    "log"
    "net/http"

    "github.com/davecgh/go-spew/spew"
    "github.com/julienschmidt/httprouter"
)

func main() {
    router := httprouter.New()
    router.GET("/test", testFuncGET)
    router.POST("/test", testFuncPost)
    log.Fatal(http.ListenAndServe(":9999", router))
}

func testFuncGET(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
    h := r.Header
    spew.Dump(h)
    val := h.Get("Hoge")
    fmt.Println("=======")
    fmt.Println(val)
    fmt.Println("=======")

    q := r.URL.Query()
    spew.Dump(q)
}

func testFuncPost(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
    r.ParseForm()
    f := r.Form
    spew.Dump(f)
}

httprouterくらいは使わないとさすがにアレなコードになる気はしている。

curl "http://localhost:9999/test" -H "Hoge:Fugaaa" -XPOST -d "a=1" -d "a=2" -d "a=3" -d "vals=[{'key':'value1'},{'key':'value2']"
 (string) (len=1) "v": ([]string) (len=1 cap=1) {
  (string) (len=5) "1,2,3"
 }
}
(url.Values) (len=2) {
 (string) (len=4) "vals": ([]string) (len=1 cap=1) {
  (string) (len=34) "[{'key':'value1'},{'key':'value2']"
 },
 (string) (len=1) "a": ([]string) (len=3 cap=4) {
  (string) (len=1) "1",
  (string) (len=1) "2",
  (string) (len=1) "3"
 }
}
-d "a=1" -d "a=2" -d "a=3"

この送り方で配列になるのは意外だった。RFCにでもそう書いてあるのだろうか(調べるか)