栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在Go中解析来自文本文件的HTTP请求和响应

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在Go中解析来自文本文件的HTTP请求和响应

实际上非常简单:

package mainimport (    "bufio"    "bytes"    "fmt"    "io"    "io/ioutil"    "log"    "net/http"    "net/http/httputil"    "os")type Connection struct {    Request  *http.Request    Response *http.Response}func ReadHTTPFromFile(r io.Reader) ([]Connection, error) {    buf := bufio.NewReader(r)    stream := make([]Connection, 0)    for {        req, err := http.ReadRequest(buf)        if err == io.EOF { break        }        if err != nil { return stream, err        }        resp, err := http.ReadResponse(buf, req)        if err != nil { return stream, err        }        //save response body        b := new(bytes.Buffer)        io.Copy(b, resp.Body)        resp.Body.Close()        resp.Body = ioutil.NopCloser(b)        stream = append(stream, Connection{Request: req, Response: resp})    }    return stream, nil}func main() {    f, err := os.Open("/tmp/test.http")    if err != nil {        log.Fatal(err)    }    defer f.Close()    stream, err := ReadHTTPFromFile(f)    if err != nil {        log.Fatalln(err)    }    for _, c := range stream {        b, err := httputil.DumpRequest(c.Request, true)        if err != nil { log.Fatal(err)        }        fmt.Println(string(b))        b, err = httputil.DumpResponse(c.Response, true)        if err != nil { log.Fatal(err)        }        fmt.Println(string(b))    }}

一些注意事项:

  • http.ReadRequest
    http.ReadResponse
  • http.ReadRequest
    http.ReadResponse
    可以在相同的位置上反复调用,
    bufio.Reader
    直到
    EOF
    它“正常工作”
    • “正常工作”取决于Content-Length标头的存在和正确性,因此读取正文会将Reader置于下一个请求/响应的开始
    • 阅读代码以确切了解哪些将起作用,哪些将不起作用
  • resp.Body
    必须根据
    Close
    文档进行编辑,因此我们必须将其复制到另一个缓冲区以保留它
  • 使用您的示例数据(修改Content-Length以匹配您的截断),此代码将输出与给定相同的请求和响应
  • httputil.DumpRequest
    并且
    httputil.DumpResponse
    不一定会以与输入文件相同的顺序转储HTTP标头,因此不要指望a
    diff
    是完美的


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/436321.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号