11import { Entry , Header } from "har-format" ;
2- import { getHeader } from "../helpers/har" ;
2+ import { getHeader , getHeaders } from "../helpers/har" ;
33import {
4- formatBytes , formatDateLocalized , formatMilliseconds , formatSeconds , parseAndFormat , parseDate , parseNonEmpty ,
5- parseNonNegative , parsePositive ,
4+ formatBytes ,
5+ formatDateLocalized ,
6+ formatMilliseconds ,
7+ formatSeconds ,
8+ parseAndFormat ,
9+ parseDate ,
10+ parseNonEmpty ,
11+ parseNonNegative ,
12+ parsePositive ,
613} from "../helpers/parse" ;
14+ import { KvTuple } from "../typing/waterfall" ;
15+ import { flattenKvTuple } from "./helpers" ;
716
817const byteSizeProperty = ( title : string , input : string | number ) : KvTuple => {
918 return [ title , parseAndFormat ( input , parsePositive , formatBytes ) ] ;
@@ -12,8 +21,13 @@ const countProperty = (title: string, input: string | number): KvTuple => {
1221 return [ title , parseAndFormat ( input , parsePositive ) ] ;
1322} ;
1423
24+ /** Predicate to filter out invalid or empty `KvTuple` */
25+ const notEmpty = ( kv : KvTuple ) => {
26+ return kv . length > 1 && kv [ 1 ] !== undefined && kv [ 1 ] !== "" ;
27+ } ;
28+
1529function parseGeneralDetails ( entry : Entry , startRelative : number , requestID : number ) : KvTuple [ ] {
16- return [
30+ return ( [
1731 [ "Request Number" , `#${ requestID } ` ] ,
1832 [ "Started" , new Date ( entry . startedDateTime ) . toLocaleString ( ) + ( ( startRelative > 0 ) ?
1933 " (" + formatMilliseconds ( startRelative ) + " after page request started)" : "" ) ] ,
@@ -41,15 +55,14 @@ function parseGeneralDetails(entry: Entry, startRelative: number, requestID: num
4155 byteSizeProperty ( "Minify Save" , entry . _minify_save ) ,
4256 byteSizeProperty ( "Image Total" , entry . _image_total ) ,
4357 byteSizeProperty ( "Image Save" , entry . _image_save ) ,
44- ] . filter ( ( k ) => k [ 1 ] !== undefined && k [ 1 ] !== "" ) as KvTuple [ ] ;
58+ ] as KvTuple [ ] ) . filter ( notEmpty ) ;
4559}
4660
4761function parseRequestDetails ( harEntry : Entry ) : KvTuple [ ] {
4862 const request = harEntry . request ;
63+ const stringHeader = ( name : string ) : KvTuple [ ] => getHeaders ( request . headers , name ) ;
4964
50- const stringHeader = ( name : string ) : KvTuple => [ name , getHeader ( request . headers , name ) ] ;
51-
52- return [
65+ return flattenKvTuple ( [
5366 [ "Method" , request . method ] ,
5467 [ "HTTP Version" , request . httpVersion ] ,
5568 byteSizeProperty ( "Bytes Out (uploaded)" , harEntry . _bytesOut ) ,
@@ -68,15 +81,17 @@ function parseRequestDetails(harEntry: Entry): KvTuple[] {
6881 stringHeader ( "If-Unmodified-Since" ) ,
6982 countProperty ( "Querystring parameters count" , request . queryString . length ) ,
7083 countProperty ( "Cookies count" , request . cookies . length ) ,
71- ] . filter ( ( k ) => k [ 1 ] !== undefined && k [ 1 ] !== "" ) as KvTuple [ ] ;
84+ ] ) . filter ( notEmpty ) ;
7285}
7386
7487function parseResponseDetails ( entry : Entry ) : KvTuple [ ] {
7588 const response = entry . response ;
7689 const content = response . content ;
7790 const headers = response . headers ;
7891
79- const stringHeader = ( title : string , name : string = title ) : KvTuple => [ title , getHeader ( headers , name ) ] ;
92+ const stringHeader = ( title : string , name : string = title ) : KvTuple [ ] => {
93+ return getHeaders ( headers , name ) ;
94+ } ;
8095 const dateHeader = ( name : string ) : KvTuple => {
8196 const header = getHeader ( headers , name ) ;
8297 return [ name , parseAndFormat ( header , parseDate , formatDateLocalized ) ] ;
@@ -93,7 +108,7 @@ function parseResponseDetails(entry: Entry): KvTuple[] {
93108 contentType = contentType + " | " + entry . _contentType ;
94109 }
95110
96- return [
111+ return flattenKvTuple ( [
97112 [ "Status" , response . status + " " + response . statusText ] ,
98113 [ "HTTP Version" , response . httpVersion ] ,
99114 byteSizeProperty ( "Bytes In (downloaded)" , entry . _bytesIn ) ,
@@ -123,12 +138,11 @@ function parseResponseDetails(entry: Entry): KvTuple[] {
123138 stringHeader ( "Timing-Allow-Origin" ) ,
124139 [ "Redirect URL" , parseAndFormat ( response . redirectURL , parseNonEmpty ) ] ,
125140 [ "Comment" , parseAndFormat ( response . comment , parseNonEmpty ) ] ,
126- ] ;
141+ ] ) . filter ( notEmpty ) ;
127142}
128143
129144function parseTimings ( entry : Entry , start : number , end : number ) : KvTuple [ ] {
130145 const timings = entry . timings ;
131-
132146 const optionalTiming = ( timing ?: number ) => parseAndFormat ( timing , parseNonNegative , formatMilliseconds ) ;
133147 const total = ( typeof start !== "number" || typeof end !== "number" ) ? undefined : ( end - start ) ;
134148
@@ -144,8 +158,6 @@ function parseTimings(entry: Entry, start: number, end: number): KvTuple[] {
144158 ] ;
145159}
146160
147- /** Key/Value pair in array `["key", "value"]` */
148- export type KvTuple = [ string , string ] ;
149161
150162/**
151163 * Data to show in overlay tabs
@@ -155,8 +167,7 @@ export type KvTuple = [string, string];
155167export function getKeys ( entry : Entry , requestID : number , startRelative : number , endRelative : number ) {
156168 const requestHeaders = entry . request . headers ;
157169 const responseHeaders = entry . response . headers ;
158-
159- let headerToKvTuple = ( header : Header ) : KvTuple => [ header . name , header . value ] ;
170+ const headerToKvTuple = ( header : Header ) : KvTuple => [ header . name , header . value ] ;
160171
161172 return {
162173 "general" : parseGeneralDetails ( entry , startRelative , requestID ) ,
0 commit comments