Sfoglia il codice sorgente

return error when header too long

Darien Raymond 8 anni fa
parent
commit
0f0f01ddf6
1 ha cambiato i file con 10 aggiunte e 1 eliminazioni
  1. 10 1
      transport/internet/headers/http/http.go

+ 10 - 1
transport/internet/headers/http/http.go

@@ -2,6 +2,7 @@ package http
 
 import (
 	"bytes"
+	"errors"
 	"io"
 	"net"
 	"net/http"
@@ -17,11 +18,13 @@ const (
 	CRLF   = "\r\n"
 	ENDING = CRLF + CRLF
 
+	// max length of HTTP header. Safety precaution for DDoS attack.
 	maxHeaderLength = 8192
 )
 
 var (
-	writeCRLF = serial.WriteString(CRLF)
+	ErrHeaderToLong = errors.New("Header too long.")
+	writeCRLF       = serial.WriteString(CRLF)
 )
 
 type Reader interface {
@@ -50,6 +53,7 @@ type HeaderReader struct {
 func (*HeaderReader) Read(reader io.Reader) (*buf.Buffer, error) {
 	buffer := buf.NewSmall()
 	totalBytes := 0
+	endingDetected := false
 	for totalBytes < maxHeaderLength {
 		err := buffer.AppendSupplier(buf.ReadFrom(reader))
 		if err != nil {
@@ -57,6 +61,7 @@ func (*HeaderReader) Read(reader io.Reader) (*buf.Buffer, error) {
 		}
 		if n := bytes.Index(buffer.Bytes(), []byte(ENDING)); n != -1 {
 			buffer.SliceFrom(n + len(ENDING))
+			endingDetected = true
 			break
 		}
 		if buffer.Len() >= len(ENDING) {
@@ -71,6 +76,10 @@ func (*HeaderReader) Read(reader io.Reader) (*buf.Buffer, error) {
 		buffer.Release()
 		return nil, nil
 	}
+	if !endingDetected {
+		buffer.Release()
+		return nil, ErrHeaderToLong
+	}
 	return buffer, nil
 }