Network Capture

Brome use the mitm proxy to gather the network data. It support chrome and firefox on localhost.

Below are the step to follow in order to capture the network data.

Install Mitmproxy

Follow the steps found here: https://mitmproxy.org/doc/install.html

Browser config

Add the enable_proxy config to your browser config:

#/path/to/project/config/browsers_config.yml
firefox:
  browserName: 'Firefox'
  enable_proxy: True
chrome:
  browserName: 'Chrome'
  enable_proxy: True

Brome config

Add the following config to your brome yaml:

#/path/to/project/config/brome.yml
mitmproxy:
  path: '/path/to/proxy/mitmdump'
  filter: "~m post" #optional this filter will only gather post requests
webserver:
  SHOW_NETWORK_CAPTURE: true
  analyse_network_capture_func: 'model.network_analysis'

Network capture data

The network capture data will be stored in the test results folder under the network_capture folder of the specific test batch. For example: /path/to/project/test_results/tb_1/network_data/test.data

You can analyse the data manually with this code:

#!/usr/bin/env python
import pprint
import sys

from libmproxy import flow

with open(sys.argv[1], "rb") as logfile:
    freader = flow.FlowReader(logfile)
    pp = pprint.PrettyPrinter(indent=4)
    try:
        for f in freader.stream():
            print(f)
            print(f.request.host)
            pp.pprint(f.get_state())
            print("")
    except flow.FlowReadError as v:
        print "Flow file corrupted. Stopped loading."

Analysis in the webserver

The webserver can automatically analyse the network captured data for you if you provided a method. Here is an example:

#/path/to/project/model/network_analysis.py
import json

from libmproxy import flow

def analyse(network_capture_path):
    with open(network_capture_path, "rb") as logfile:
        freader = flow.FlowReader(logfile)

        nb_success = 0
        nb_failure = 0
        try:
            for f in freader.stream():
                try:
                    result = json.loads(f.response.get_decoded_content())
                    if result['success']:
                        nb_success += 1
                    else:
                        nb_failure += 1
                except:
                    pass

            return "<p>Nb success: %s</p><p>Nb failure: %s</p>"%(nb_success, nb_failure)
        except flow.FlowReadError as v:
            return "<p>Flow file corrupted. Stopped loading.</p>"