46 lines
918 B
Go
46 lines
918 B
Go
package server
|
|
|
|
import (
|
|
"bufio"
|
|
"fmt"
|
|
"net"
|
|
"net/http"
|
|
)
|
|
|
|
type tunnelWriter struct {
|
|
conn net.Conn
|
|
header http.Header
|
|
}
|
|
|
|
func (f *tunnelWriter) Header() http.Header {
|
|
if f.header == nil {
|
|
f.header = make(http.Header)
|
|
}
|
|
return f.header
|
|
}
|
|
|
|
func (f *tunnelWriter) Write(data []byte) (int, error) {
|
|
return f.conn.Write(data)
|
|
}
|
|
|
|
func (f *tunnelWriter) WriteHeader(statusCode int) {
|
|
// Write HTTP status line
|
|
status := fmt.Sprintf("HTTP/1.1 %d %s\r\n", statusCode, http.StatusText(statusCode))
|
|
f.conn.Write([]byte(status))
|
|
|
|
// Write headers
|
|
for key, values := range f.header {
|
|
for _, value := range values {
|
|
f.conn.Write([]byte(fmt.Sprintf("%s: %s\r\n", key, value)))
|
|
}
|
|
}
|
|
|
|
// End headers
|
|
f.conn.Write([]byte("\r\n"))
|
|
}
|
|
|
|
func (f *tunnelWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) {
|
|
rw := bufio.NewReadWriter(bufio.NewReader(f.conn), bufio.NewWriter(f.conn))
|
|
return f.conn, rw, nil
|
|
}
|