64 lines
1.2 KiB
Go
64 lines
1.2 KiB
Go
package header
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
)
|
|
|
|
func NewRequest(headerData []byte) (RequestHeader, error) {
|
|
header := &requestHeader{
|
|
headers: make(map[string]string, 16),
|
|
}
|
|
|
|
lineEnd := bytes.Index(headerData, []byte("\r\n"))
|
|
if lineEnd == -1 {
|
|
return nil, fmt.Errorf("invalid request: no CRLF found in start line")
|
|
}
|
|
|
|
startLine := headerData[:lineEnd]
|
|
header.startLine = startLine
|
|
var err error
|
|
header.method, header.path, header.version, err = parseStartLine(startLine)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
remaining := headerData[lineEnd+2:]
|
|
|
|
setRemainingHeaders(remaining, header)
|
|
|
|
return header, nil
|
|
}
|
|
|
|
func (req *requestHeader) Value(key string) string {
|
|
val, ok := req.headers[key]
|
|
if !ok {
|
|
return ""
|
|
}
|
|
return val
|
|
}
|
|
|
|
func (req *requestHeader) Set(key string, value string) {
|
|
req.headers[key] = value
|
|
}
|
|
|
|
func (req *requestHeader) Remove(key string) {
|
|
delete(req.headers, key)
|
|
}
|
|
|
|
func (req *requestHeader) Method() string {
|
|
return req.method
|
|
}
|
|
|
|
func (req *requestHeader) Path() string {
|
|
return req.path
|
|
}
|
|
|
|
func (req *requestHeader) Version() string {
|
|
return req.version
|
|
}
|
|
|
|
func (req *requestHeader) Finalize() []byte {
|
|
return finalize(req.startLine, req.headers)
|
|
}
|