Saya ingin membuat alat proksi http menggunakan go:
func main() {
listener, err := net.Listen("tcp", ":8080")
if err != nil {
log.Panic(err)
}
for {
client, err := listener.Accept()
if err != nil {
log.Panic(err)
}
go handleClientRequest(client)
}
}
func handleClientRequest(client net.Conn) {
if client == nil {
return
}
defer client.Close()
var buf [1024]byte
n, err := client.Read(buf[:])
if err != nil {
log.Println(err)
return
}
fmt.Println("recv msg:", string(buf[0:n]))
}
1024 bait mungkin tak cukup, mesti ada tanda tamat kan?
Protokol TCP melepaskan sambungan dengan menghantar paket FIN, jadi paket FIN ialah tanda akhir, yang bermaksud ia diterima sehingga sambungan terputus.
Tetapi
Jadi bagaimana untuk menilai kesudahannya selepas menghidupkan Keep-Alive?
Malah, pengepala HTTP mempunyai panjang kandungan, iaitu panjang badan paket HTTP
Sudah tentu, terdapat juga kes di mana tidak ada panjang kandungan, iaitu pengekodan chunked digunakan Data dibahagikan kepada satu siri blok dan dihantar, dan setiap blok mempunyai penerangan saiz. Walaupun pelayan tidak mengetahui saiz keseluruhan entiti semasa menjana pengepala (biasanya kerana entiti dijana secara dinamik), pengekodan bongkah masih boleh digunakan untuk menghantar beberapa ketulan saiz yang diketahui.
Selain itu, pengepala mesej HTTP dan badan mesej dipisahkan oleh CRLF (carriage return and line feed),
rnrn