[internal.http.request.parser.header] multi-value header parser
This commit is contained in:
parent
b3ccc911ee
commit
e375de0f33
|
@ -0,0 +1,51 @@
|
||||||
|
package header
|
||||||
|
|
||||||
|
import (
|
||||||
|
"regexp"
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
"bytes"
|
||||||
|
)
|
||||||
|
|
||||||
|
// parse tries to return a 'T' (httpHeader) from a byte array
|
||||||
|
func Parse(b []byte) (*T, error) {
|
||||||
|
|
||||||
|
/* (1) Split by ':' */
|
||||||
|
parts := bytes.Split(b, []byte(": "))
|
||||||
|
|
||||||
|
if len(parts) != 2 {
|
||||||
|
return nil, fmt.Errorf("Invalid HTTP header format '%s'", b)
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (2) Create instance */
|
||||||
|
inst := new(T)
|
||||||
|
|
||||||
|
/* (3) Check for header name */
|
||||||
|
switch strings.ToLower(string(parts[0])) {
|
||||||
|
case "host": inst.Name = HOST
|
||||||
|
case "upgrade": inst.Name = UPGRADE
|
||||||
|
case "connection": inst.Name = CONNECTION
|
||||||
|
case "origin": inst.Name = ORIGIN
|
||||||
|
case "sec-websocket-key": inst.Name = WSKEY
|
||||||
|
case "sec-websocket-protocol": inst.Name = WSPROTOCOL
|
||||||
|
case "sec-websocket-extensions": inst.Name = WSEXTENSIONS
|
||||||
|
case "sec-websocket-version": inst.Name = WSVERSION
|
||||||
|
default: inst.Name = UNKNOWN
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (4) Check format */
|
||||||
|
checker := regexp.MustCompile(`^(?:[^,]+,\s*)*[^,]+$`)
|
||||||
|
if !checker.Match(parts[1]) {
|
||||||
|
return nil, fmt.Errorf("Invalid HTTP header value format '%s'", parts[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (5) Normalise format */
|
||||||
|
normaliser := regexp.MustCompile(`,\s+`)
|
||||||
|
values := normaliser.ReplaceAll(parts[1], []byte(","))
|
||||||
|
|
||||||
|
/* (5) Split values */
|
||||||
|
inst.Values = bytes.Split(values, []byte(","))
|
||||||
|
|
||||||
|
return inst, nil
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
package header
|
||||||
|
|
||||||
|
// HeaderType represents all 'valid' HTTP request headers
|
||||||
|
type HeaderType byte
|
||||||
|
const (
|
||||||
|
UNKNOWN HeaderType = iota
|
||||||
|
HOST
|
||||||
|
UPGRADE
|
||||||
|
CONNECTION
|
||||||
|
ORIGIN
|
||||||
|
WSKEY
|
||||||
|
WSPROTOCOL
|
||||||
|
WSEXTENSIONS
|
||||||
|
WSVERSION
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
// T represents the data of a HTTP request header
|
||||||
|
type T struct{
|
||||||
|
Name HeaderType
|
||||||
|
Values [][]byte
|
||||||
|
}
|
Loading…
Reference in New Issue