↓Przewiń do głównej treści

Pliki HAR - HTTP archive

·381 słów·2 min
Har Http
Spis treści

Pliki HAR - HTTP archive
#

Plik JSON wykorzystuje kodowanie UTF-8. Zawiera zapytania, które przeglądarka wysyła podczas sesji. Zapisuje czas trwania żądań i odpowiedzi HTTP. Specyfikacja wersji 1.2 pochodzi z okolic 2012 roku. Link har_analyzer, na końcu wpisu, szczegółowo opisuje, jak nagrywać sesję.

Praktyczne zastosowania
#

  • Wykrywanie błędów
  • Wykrywanie zbyt długo trwających zapytań
  • Wizualizacja zapytań HTTP w przeglądarce za pomocą narzędzi deweloperskich (F12)
  • Analiza przekierowań
  • Podstawa pod mocki w Playwright
  • Tworzenie komend curl na bazie pliku, za pomocą zewnętrznych narzędzi

Format
#

Przykładowy okrojony plik. Szczegóły schematu formatu HAR znajdują się w jednym ze źródeł (har-schema).

{
  "log": {
    "version": "1.2",
    "creator": { "name": "Chrome", "version": "120.0" },
    "entries": [
      {
        "pageref": "page_0",
        "startedDateTime": "2009-04-16T12:07:23.596Z",
        "time": 50,
        "request": {
          "method": "GET",
          "url": "http://www.example.com/path/?param=value",
          "httpVersion": "HTTP/1.1",
          "cookies": [],
          "headers": [],
          "queryString" : [],
          "postData" : {},
          "headersSize" : 150,
          "bodySize" : 0
        },
        "response": {
          "statusText": "OK",
          "httpVersion": "HTTP/1.1",
          "cookies": [],
          "headers": [],
          "content": {},
          "redirectURL": "",
          "headersSize" : 160,
          "bodySize" : 850
        },
        "cache": {...},
        "timings": {...},
        "serverIPAddress": "10.0.0.1",
        "connection": "52492"
      },

      ...

    ]
  }
}

Analiza pliku
#

# kod niekompatybilny ze statusami http
jq '[ .log.entries[] | select(.response.status < 100) ]' example_file.har

# błędy klienta
jq '[ .log.entries[] | select(.response.status >= 400 and .response.status < 500) ]' example_file.har

# błędy serwera
jq '[ .log.entries[] | select(.response.status >= 500 and .response.status < 600) ]' example_file.har

# odpowiedź z wybranymi polami, gdzie status wynosi -1
jq '[ .log.entries[] | select(.response.status == -1) | {method: .request.method, url: .request.url, response: .response, cache: .cache, timings: .timings} ]' example_file.har

# posortowane malejąco zależnie od czasu odpowiedzi
jq '[ .log.entries[] ] | sort_by(.time) | reverse' example_file.har

# posortowane malejąco zależnie od czasu odpowiedzi odpowiedniego komponentu
jq '[ .log.entries[] ] | sort_by(.timings.dns) | reverse' example_file.har
jq '[ .log.entries[] ] | sort_by(.timings.ssl) | reverse' example_file.har
jq '[ .log.entries[] ] | sort_by(.timings.wait) | reverse' example_file.har
jq '[ .log.entries[] ] | sort_by(.timings.connect) | reverse' example_file.har
jq '[ .log.entries[] ] | sort_by(.timings.receive) | reverse' example_file.har

# wpisy dotyczące example.com
jq '.log.entries[] | select(.request.url | test("example.com"))'

# ilość wpisów
jq -r '.log.entries[] | select(.request.url | test("example.com")) | length'

# uproszczony zapis
jq -r '.log.entries[] | "- \(.request.method) \"\(.request.url)\"\n  \(.response.status // "") \(.response.redirectURL // "") \(.response._error // "")"'

Inne linki
#

Źródła
#