Fix header parsing

This commit is contained in:
Richard Patel 2018-11-11 18:53:17 +01:00
parent 93272e1da1
commit 9c8174dd8d
No known key found for this signature in database
GPG Key ID: C268B2BBDA2ABECB

View File

@ -137,9 +137,8 @@ func GetFile(u fasturl.URL, f *File) (err error) {
err = checkStatusCode(res.StatusCode()) err = checkStatusCode(res.StatusCode())
if err != nil { return } if err != nil { return }
// TODO Inefficient af f.applyContentLength(string(res.Header.Peek("content-length")))
header := res.Header.Header() f.applyLastModified(string(res.Header.Peek("last-modified")))
f.ParseHeader(header)
return nil return nil
} }
@ -164,64 +163,24 @@ func HashString(s string) (o redblackhash.Key) {
return return
} }
func (f *File) ParseHeader(h []byte) { func (f *File) applyContentLength(v string) {
var k1, k2 int if v == "" { return }
var v1, v2 int size, err := strconv.ParseInt(v, 10, 64)
if err != nil { return }
// Simple finite state machine if size < 0 { return }
state := 0 f.Size = size
for i, b := range h {
switch state {
case 0:
if b == byte(':') {
state = 1
k2 = i
}
case 1:
state = 2
case 2:
state = 3
v1 = i
case 3:
if b == byte('\r') {
state = 4
}
case 4:
state = 0
v2 = i - 1
key := string(h[k1:k2])
val := string(h[v1:v2])
k1 = i
f.applyHeader(key, val)
}
}
} }
func (f *File) applyHeader(k, v string) { func (f *File) applyLastModified(v string) {
switch k { if v == "" { return }
case "content-length":
size, err := strconv.ParseInt(v, 10, 64)
if err != nil { break }
if size < 0 { break }
f.Size = size
case "last-modified":
var err error var err error
f.MTime, err = time.Parse(time.RFC1123, v) f.MTime, err = time.Parse(time.RFC1123, v)
if err == nil { break } if err == nil { return }
f.MTime, err = time.Parse(time.RFC850, v) f.MTime, err = time.Parse(time.RFC850, v)
if err == nil { break } if err == nil { return }
// TODO Parse asctime // TODO Parse asctime
f.MTime, err = time.Parse("2006-01-02", v[:10]) f.MTime, err = time.Parse("2006-01-02", v[:10])
if err == nil { break } if err == nil { return }
}
} }
func checkStatusCode(status int) error { func checkStatusCode(status int) error {