我从其他地方的日志中附带了http响应标头。在我的日志文件中,我有类似以下内容:
Date: Fri, 21 Mar 2014 06:45:15 GMT\r\nContent-Encoding: gzip\r\nLast-Modified: Tue, 20 Aug 2013 15:45:41 GMT\r\nServer: nginx/0.8.54\r\nAge: 18884\r\nVary: Accept-Encoding\r\nContent-Type: text/html\r\nCache-Control: max-age=864000, public\r\nX-UA-Compatible: IE=Edge,chrome=1\r\nTiming-Allow-Origin: *\r\nContent-Length: 14888\r\nExpires: Mon, 31 Mar 2014 06:45:15 GMT\r\n
给定上面的字符串,我如何将其解析为net / http中所述的Header对象。一种方法是自己分割字符串并映射键,值…但是我希望避免手动操作,而使用标准的(或维护良好的第3方)库来解析它…任何指针?
内置的解析器位于textproto中。您可以直接使用它,也可以添加伪造的HTTP请求标头并在http包中使用ReadRequest。无论哪种方式,您都需要将数据包装到bufio.Reader中,这里我只是假设我们从字符串开始。
使用textproto:
logEntry := "Content-Encoding: gzip\r\nLast-Modified: Tue, 20 Aug 2013 15:45:41 GMT\r\nServer: nginx/0.8.54\r\nAge: 18884\r\nVary: Accept-Encoding\r\nContent-Type: text/html\r\nCache-Control: max-age=864000, public\r\nX-UA-Compatible: IE=Edge,chrome=1\r\nTiming-Allow-Origin: *\r\nContent-Length: 14888\r\nExpires: Mon, 31 Mar 2014 06:45:15 GMT\r\n" // don't forget to make certain the headers end with a second "\r\n" reader := bufio.NewReader(strings.NewReader(logEntry + "\r\n")) tp := textproto.NewReader(reader) mimeHeader, err := tp.ReadMIMEHeader() if err != nil { log.Fatal(err) } // http.Header and textproto.MIMEHeader are both just a map[string][]string httpHeader := http.Header(mimeHeader) log.Println(httpHeader)
和http.ReadRequest:
logEntry := "Content-Encoding: gzip\r\nLast-Modified: Tue, 20 Aug 2013 15:45:41 GMT\r\nServer: nginx/0.8.54\r\nAge: 18884\r\nVary: Accept-Encoding\r\nContent-Type: text/html\r\nCache-Control: max-age=864000, public\r\nX-UA-Compatible: IE=Edge,chrome=1\r\nTiming-Allow-Origin: *\r\nContent-Length: 14888\r\nExpires: Mon, 31 Mar 2014 06:45:15 GMT\r\n" // we need to make sure to add a fake HTTP header here to make a valid request. reader := bufio.NewReader(strings.NewReader("GET / HTTP/1.1\r\n" + logEntry + "\r\n")) logReq, err := http.ReadRequest(reader) if err != nil { log.Fatal(err) } log.Println(logReq.Header)