Fix data races across session/forwarder/registry, resolve POST/PUT hang, harden port allocation, add frontendURL env (#157)
Reviewed-on: #157 Co-authored-by: Bagas <bagas@fossy.my.id> Co-committed-by: Bagas <bagas@fossy.my.id>
This commit was merged in pull request #157.
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
package transport
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"context"
|
||||
"errors"
|
||||
@@ -52,25 +53,43 @@ func (hh *httpHandler) badRequest(conn net.Conn) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func readHTTPHeader(br *bufio.Reader, limit int) ([]byte, error) {
|
||||
var headerBuf []byte
|
||||
for {
|
||||
line, err := br.ReadSlice('\n')
|
||||
headerBuf = append(headerBuf, line...)
|
||||
if errors.Is(err, bufio.ErrBufferFull) {
|
||||
if len(headerBuf) > limit {
|
||||
return nil, fmt.Errorf("headers too large")
|
||||
}
|
||||
continue
|
||||
}
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if bytes.HasSuffix(headerBuf, []byte("\r\n\r\n")) {
|
||||
return headerBuf, nil
|
||||
}
|
||||
if len(headerBuf) > limit {
|
||||
return nil, fmt.Errorf("headers too large")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (hh *httpHandler) Handler(conn net.Conn, isTLS bool) {
|
||||
defer hh.closeConnection(conn)
|
||||
|
||||
_ = conn.SetReadDeadline(time.Now().Add(10 * time.Second))
|
||||
buf := make([]byte, hh.config.HeaderSize())
|
||||
n, err := conn.Read(buf)
|
||||
br := bufio.NewReaderSize(conn, hh.config.HeaderSize())
|
||||
headerBuf, err := readHTTPHeader(br, hh.config.HeaderSize())
|
||||
if err != nil {
|
||||
_ = hh.badRequest(conn)
|
||||
return
|
||||
}
|
||||
|
||||
if idx := bytes.Index(buf[:n], []byte("\r\n\r\n")); idx == -1 {
|
||||
_ = hh.badRequest(conn)
|
||||
return
|
||||
}
|
||||
|
||||
_ = conn.SetReadDeadline(time.Time{})
|
||||
|
||||
reqhf, err := header.NewRequest(buf[:n])
|
||||
reqhf, err := header.NewRequest(headerBuf)
|
||||
if err != nil {
|
||||
log.Printf("Error creating request header: %v", err)
|
||||
_ = hh.badRequest(conn)
|
||||
@@ -97,11 +116,11 @@ func (hh *httpHandler) Handler(conn net.Conn, isTLS bool) {
|
||||
Type: types.TunnelTypeHTTP,
|
||||
})
|
||||
if err != nil {
|
||||
_ = hh.redirect(conn, http.StatusMovedPermanently, fmt.Sprintf("https://tunnl.live/tunnel-not-found?slug=%s\r\n", slug))
|
||||
_ = hh.redirect(conn, http.StatusMovedPermanently, fmt.Sprintf("%s/tunnel-not-found?slug=%s\r\n", hh.config.FrontendURL(), slug))
|
||||
return
|
||||
}
|
||||
|
||||
hw := stream.New(conn, conn, conn.RemoteAddr())
|
||||
hw := stream.New(conn, br, conn.RemoteAddr())
|
||||
defer func(hw stream.HTTP) {
|
||||
err = hw.Close()
|
||||
if err != nil {
|
||||
|
||||
Reference in New Issue
Block a user