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 }