mirror of
https://github.com/terorie/od-database-crawler.git
synced 2025-04-19 18:36:43 +00:00
Fix header parsing
This commit is contained in:
parent
93272e1da1
commit
9c8174dd8d
67
crawl.go
67
crawl.go
@ -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 {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user