Header state machine

This commit is contained in:
Richard Patel 2018-10-27 16:29:10 +02:00
parent d748be72cd
commit 9e090d109d
No known key found for this signature in database
GPG Key ID: C268B2BBDA2ABECB

View File

@ -2,6 +2,7 @@ package main
import ( import (
"bytes" "bytes"
"errors"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
"github.com/valyala/fasthttp" "github.com/valyala/fasthttp"
"golang.org/x/net/html" "golang.org/x/net/html"
@ -184,35 +185,66 @@ func fileInfo(u url.URL, f *File) (err error) {
if err != nil { return } if err != nil { return }
// TODO Inefficient af // TODO Inefficient af
header := res.Header.String() header := res.Header.Header()
for _, line := range strings.Split(header, "\r\n") { var k []byte
if line == "" { continue } var v []byte
if strings.HasPrefix(line, "HTTP/1") { continue }
parts := strings.SplitN(line, ": ", 2) // Simple finite state machine
if len(parts) != 2 { continue } state := 0
for _, b := range header {
switch state {
case 0:
if b == byte(':') {
state = 1
} else {
k = append(k, b)
}
k, v := parts[0], parts[1] case 1:
k = strings.ToLower(k) if b == byte(' ') {
state = 2
} else {
return errors.New("bad request")
}
switch k { case 2:
if b == byte('\r') {
state = 3
} else {
v = append(v, b)
}
case 3:
if b == byte('\n') {
state = 0
key := strings.ToLower(string(k))
val := string(v)
switch key {
case "content-length": case "content-length":
size, err := strconv.ParseInt(v, 10, 64) size, err := strconv.ParseInt(val, 10, 64)
if err != nil { break } if err != nil { break }
if size < 0 { break } if size < 0 { break }
f.Size = size f.Size = size
case "last-modified": case "last-modified":
var err error var err error
f.MTime, err = time.Parse(time.RFC1123, v) f.MTime, err = time.Parse(time.RFC1123, val)
if err == nil { break } if err == nil { break }
f.MTime, err = time.Parse(time.RFC850, v) f.MTime, err = time.Parse(time.RFC850, val)
if err == nil { break } if err == nil { break }
// TODO Parse asctime // TODO Parse asctime
f.MTime, err = time.Parse("2006-01-02", v[:10]) f.MTime, err = time.Parse("2006-01-02", val[:10])
if err == nil { break } if err == nil { break }
} }
k = k[:0]
v = v[:0]
} else {
return errors.New("bad request")
}
}
} }
return nil return nil