Skip to content

Instantly share code, notes, and snippets.

@lotuc
Last active December 4, 2022 13:00
Show Gist options
  • Save lotuc/e39a18b2fc491ef67bd8bef3c7628654 to your computer and use it in GitHub Desktop.
Save lotuc/e39a18b2fc491ef67bd8bef3c7628654 to your computer and use it in GitHub Desktop.
(ns etaoin.dev-patch
(:require [etaoin.dev :refer [get-performance-logs]]
[clojure.string :as str]))
(defn- try-parse-int
[line]
(try (Integer/parseInt line)
(catch Exception _e
line)))
(defn- request?
"Return true if `log` entry belongs to a network domain."
[log]
(some-> log :_type namespace (= "network")))
(defn- group-requests
"Group a set of request `logs` by their ID."
[logs]
(group-by
(fn [log]
(some-> log :message :params :requestId))
logs))
(defn- log->request
"A helper for a further reduce (see below).
Acc is an accumulation map."
[acc log]
(let [{:keys [_type message]} log
{:keys [params]} message]
(case _type
:network/requestwillbesent
(let [{:keys [request
requestId
type]} params
{:keys [method
headers
url
hasPostData]} request
type (some-> type str/lower-case keyword)
xhr? (identical? type :xhr)]
(assoc acc
:state 1
:id requestId
:type type
:xhr? xhr?
:url url
:with-data? hasPostData
:request {:method (some-> method str/lower-case keyword)
:headers headers}))
:network/responsereceived
(let [{:keys [response]} params
{:keys [headers mimeType remoteIPAddress]} response
{:keys [status]} headers]
(assoc acc
:state 2
:response {:status (try-parse-int status)
:headers headers
:mime mimeType
:remote-ip remoteIPAddress}))
:network/loadingfinished
(assoc acc
:state 4
:done? true)
;; patch
;; handling statusCode
:network/responsereceivedextrainfo
(let [{:keys [statusCode]} params]
(assoc acc
:status-code statusCode))
:network/loadingfailed
(assoc acc
:failed? true)
;; default
acc)))
(defn- build-request
"Takes a vector of request logs of the same ID and build a request map."
[logs]
(let [r (reduce log->request {} logs)
status-code (:status-code r)
response (:response r)]
;; patch
;; relocate status-code to response
(if (and status-code response)
(-> r (dissoc :status-code)
(assoc :response (assoc response :status-code status-code)))
r)))
(defn logs->requests
"Return list of log entries `logs` converted to requests."
[logs]
(->> logs
(filter request?)
group-requests
vals
(mapv build-request)))
(defn get-requests
"Have `driver` return a list of HTTP requests made by the browser.
Works only when `perfLoggingPrefs` is enabled, see [DevTools](/doc/01-user-guide.adoc#devtools)."
[driver]
(-> driver
get-performance-logs
logs->requests))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment