HTTP プロトコルについて
まず、HTTPプロトコルについて復習.
HTTPはTCPをベースにしてデータをやりとりするプロトコルです。じゃあTCPの上でどのような制御をしているのかというと、メッセージをやりとりする際のフォーマットが決められており、それに基づいて動作を制御しています。
メッセージフォーマットは下記の通り
Request Message | format | Example |
---|---|---|
リクエストライン | [Method] [Path] [version] | GET / HTTP/1.1 |
ヘッダーライン | [Header Key]: [header Value] | Content-Type: text/html; charset=utf-8 |
ボディーライン | POSTのBody部分(省略可) |
curlコマンド等でリクエストを送った際に下記のような表示をみたことがあると思います。
$ curl -v http://www.example.com
* Rebuilt URL to: http://www.example.com/
* Trying 2606:2800:220:1:248:1893:25c8:1946...
* TCP_NODELAY set
* Connected to www.example.com (2606:2800:220:1:248:1893:25c8:1946) port 80 (#0)
> GET / HTTP/1.1
> Host: www.example.com
> User-Agent: curl/7.51.0
> Accept: */*
>
この >
の1行目がリクエストライン、2行目以降がヘッダーライン、ボディーラインはGETリクエストのため省略されています。ヘッダーラインの終わりは空行にします。
何が言いたいかというと、Requestの構造体には、HTTPのプロトコルを満たすために、Method / Path / Version / Header / Body 等の変数が用意されている必要があるということです。このフォーマットを知っていればRequestが何で構成されているかなんとなくわかるのではないでしょうか。
Request構造体
定義されている変数
Requestの中身はこちらのDocumentに記載があります。
[変数名] [型名] の順に記載しています。
- Method string
- URL *url.URL
- Proto string
- ProtoMajor int
- ProtoMinor int
- Body io.ReadCloser
- GetBody func() (io.ReadCloser, error)
- ContentLength int64
- TransferEncoding []string
- Close bool
- Host string
- Form url.Values
- PostForm url.Values
- MultipartForm *multipart.Form
- Trailer Header
- RemoteAddr string
- RequestURI string
- TLS *tls.ConnectionState
- Cancel <-chan struct{}
- Response *Response
HTTP Requestメッセージに落とし込む
まず、メソッドを利用するために下記の変数は使われる
- Method string
その次はPath
(RequestURIは素のリクエスト先が文字列で記載されている。各要素が区切られたURL構造体の中にPathが存在する)
- URL *url.URL
- RequestURI string
HTTPのバージョンも必要
- Proto string
- ProtoMajor int
- ProtoMinor int
headerラインで取得できる情報はこれ
- Host string
- ContentLength int64
Body部の変数
- Body io.ReadCloser
- Form url.Values
- PostForm url.Values
- MultipartForm *multipart.Form
とりあえずこれだけ分かれば、GOでHTTPサーバをListenした時にRequestの値を使いこなせるのではないかと思います。
そのほかの項目も記載しようと思ったけど、Documentみた方が正確なので。。。