Skip to content

Instantly share code, notes, and snippets.

@BooookStore
Created November 19, 2017 04:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save BooookStore/6891deebedb8a424e73a1f9cc9bf9077 to your computer and use it in GitHub Desktop.
Save BooookStore/6891deebedb8a424e73a1f9cc9bf9077 to your computer and use it in GitHub Desktop.
GolangでHTTP/1.1のチャンク受信
package main
import (
"net"
"net/http"
"time"
"bufio"
"io"
"strconv"
"log"
)
func main() {
// TCPソケットオープン
dialer := &net.Dialer{
Timeout: 30 * time.Second,
KeepAlive: 30 * time.Second,
}
conn, err := dialer.Dial("tcp", "localhost:8080")
if err != nil {
panic(err)
}
defer conn.Close()
// コネクションを通してリクエストの送信
request, err := http.NewRequest("GET", "http://localhost:8080/chunked", nil)
err = request.Write(conn)
if err != nil {
panic(err)
}
// コネクションからリーダーを作成
reader := bufio.NewReader(conn)
// ヘッダの読み込み
resp, err := http.ReadResponse(reader, request)
if err != nil {
panic(err)
}
if resp.TransferEncoding[0] != "chunked" {
panic("wront transfer encoding")
}
for {
// サイズを取得
sizeStr, err := reader.ReadBytes('\n')
if err == io.EOF {
break
}
// 16進数のサイズをパース。サイズが0ならクローズ
// HTTPではボディ要素以外の行末印をCRLFとして扱っているため、その分は読み込まない。
size, err := strconv.ParseInt(string(sizeStr[:len(sizeStr)-2]), 16, 64)
if size == 0 {
break
}
if err != nil {
panic(err)
}
// サイズ数分バッファを確保して読み込み
line := make([]byte, int(size))
reader.Read(line)
reader.Discard(2)
log.Println(" ", string(line))
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment