【问题标题】:Stream HAR events流式传输 HAR 事件
【发布时间】:2017-11-25 23:21:04
【问题描述】:

我想实时监控一个长时间运行的应用程序。 HAR 文件允许我在事后执行此操作,但由于它们是“存档”,它们不允许我实时执行此操作。

他们是否会流式传输 HAR 文件的“事件”数组,以便我可以在生成它们时对其进行处理?

这可以是 firefox 或 chrome。

【问题讨论】:

    标签: har


    【解决方案1】:

    所以在https://github.com/mafredri/cdp/tree/master/example/screencast 的帮助下,我想出了如何使用 chrome 的调试器 api 来做到这一点

    这段代码没有做的是将请求正文与响应绑定(在它不可用的地方),但正如我所展示的,RequestID 将是一致的,所以如果一个序列化事件处理(比如通过锁定)一个可以保存body,在看到response事件时使用。

    package main
    
    import (
        "context"
        "log"
    
        "github.com/mafredri/cdp"
        "github.com/mafredri/cdp/cdpcmd"
        "github.com/mafredri/cdp/devtool"
        "github.com/mafredri/cdp/rpcc"
    )
    
    func main() {
        if err := run(); err != nil {
            panic(err)
        }
    }
    
    func run() error {
        ctx, cancel := context.WithCancel(context.TODO())
        defer cancel()
    
        devt := devtool.New("http://localhost:9222")
    
        page, err := devt.Get(ctx, devtool.Page)
        if err != nil {
            return err
        }
    
        conn, err := rpcc.DialContext(ctx, page.WebSocketDebuggerURL)
        if err != nil {
            return err
        }
        defer conn.Close()
    
        c := cdp.NewClient(conn)
    
        err = c.Page.Enable(ctx)
        if err != nil {
            return err
        }
    
        loadEventFired, err := c.Page.LoadEventFired(ctx)
        if err != nil {
            return err
        }
    
        _, err = c.Page.Navigate(ctx, cdpcmd.NewPageNavigateArgs("https://github.com/"))
        if err != nil {
            return err
        }
    
        _, err = loadEventFired.Recv()
        if err != nil {
            return err
        }
        loadEventFired.Close()
    
        a := &cdpcmd.NetworkEnableArgs{}
        a.SetMaxResourceBufferSize(32000)
        a.SetMaxTotalBufferSize(96000)
    
        err = c.Network.Enable(ctx, a)
    
        responseEvents, err := c.Network.ResponseReceived(ctx)
        requestEvents, err := c.Network.RequestWillBeSent(ctx)
    
        go func() {
            defer responseEvents.Close()
    
            for {
                ev, err := responseEvents.Recv()
                if err != nil {
                    log.Printf("Failed to receive network event: %v", err)
                    return
                }
                log.Printf("requestid = %v, url = %v", ev.RequestID, ev.Response.URL)
            }
        }()
    
        go func() {
            defer requestEvents.Close()
    
            for {
                ev, err := requestEvents.Recv()
                if err != nil {
                    log.Printf("Failed to receive network event: %v", err)
                    return
                }
                log.Printf("requestid = %v, url = %v", ev.RequestID, ev.Request.URL)
            }
        }()
    
        select {}
    
        return nil
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-12
      • 1970-01-01
      • 2011-02-03
      • 1970-01-01
      相关资源
      最近更新 更多