Last active
December 4, 2022 13:00
-
-
Save lotuc/e39a18b2fc491ef67bd8bef3c7628654 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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