@@ -8,24 +8,9 @@ window.templates.network || (window.templates.network = {});
88var HTTP_BOUNDARY_CLASS = "http-token-type-boundary" ;
99var TEXT_TYPES = [ "markup" , "script" , "css" , "text" ] ;
1010
11- templates . _col_or_row = function ( template )
11+ templates . _pre = function ( content )
1212{
13- // template is either ["elem", "text"], which will be wrapped in a column
14- // or [["elem", "text"], ["elem", "text"]] which will be wrapped in a row.
15- if ( Array . isArray ( template [ 0 ] ) && template [ 1 ] )
16- {
17- return [ "tr" , template [ 0 ] , template [ 1 ] ] ;
18- }
19- return [ "tr" , [ "td" , template , "colspan" , "2" ] ] ;
20- } ;
21-
22- templates . _pre = function ( str , additional_classname )
23- {
24- var classname = "mono" ;
25- if ( additional_classname )
26- classname += " " + additional_classname ;
27-
28- return [ "pre" , str , "class" , classname ] ;
13+ return [ "pre" , content , "class" , "mono" ] ;
2914} ;
3015
3116templates . details = function ( entry , left_val , do_raw )
@@ -188,22 +173,38 @@ templates._header_token_templ = function(state, token)
188173{
189174 var TYPE = 0 ;
190175 var STR = 1 ;
176+ var highlighted_types = [
177+ cls . HTTPHeaderTokenizer . types . NAME ,
178+ cls . HTTPHeaderTokenizer . types . FIRST_LINE_PART
179+ ] ;
191180 var attrs = [ "class" , cls . HTTPHeaderTokenizer . classnames [ token [ TYPE ] ] ] ;
192181
193- if ( token [ TYPE ] === cls . HTTPHeaderTokenizer . types . NAME )
194- {
195- attrs . extend ( [ "data-spec" , "http#" + token [ STR ] . trim ( ) ] ) ;
196- }
197- else if ( token [ TYPE ] === cls . HTTPHeaderTokenizer . types . FIRST_LINE_PART )
182+ if ( highlighted_types . indexOf ( token [ TYPE ] ) != - 1 )
198183 {
199- if ( state . data_spec_firstline_tokens . contains ( state . firstline_tokens ) )
184+ if ( token [ TYPE ] === cls . HTTPHeaderTokenizer . types . NAME )
185+ {
186+ attrs . extend ( [ "data-spec" , "http#" + token [ STR ] . trim ( ) ] ) ;
187+ }
188+ else if ( token [ TYPE ] === cls . HTTPHeaderTokenizer . types . FIRST_LINE_PART )
189+ {
190+ if ( state . data_spec_firstline_tokens . contains ( state . firstline_tokens ) )
191+ {
192+ // Add data-spec attributes on certain firstline tokens, tracked in state
193+ attrs . extend ( [ "data-spec" , "http#" + ( token [ STR ] ) . trim ( ) ] ) ;
194+ }
195+ state . firstline_tokens ++ ;
196+ }
197+ var buffer = state . str_buffer ;
198+ var ret = [ [ "span" , token [ STR ] ] . concat ( attrs ) ] ;
199+ if ( buffer )
200200 {
201- // Add data-spec attributes on certain firstline tokens, tracked in state
202- attrs . extend ( [ "data-spec" , "http#" + ( token [ STR ] ) . trim ( ) ] ) ;
201+ ret . unshift ( buffer ) ;
202+ state . str_buffer = "" ;
203203 }
204- state . firstline_tokens ++ ;
204+ return ret ;
205205 }
206- return [ "span" , token [ STR ] ] . concat ( attrs ) ;
206+ state . str_buffer += token [ STR ] ;
207+ return [ ] ;
207208} ;
208209
209210templates . _token_receiver = function ( tokens , token_type , token )
@@ -223,18 +224,10 @@ templates._request_headers = function(req, do_raw)
223224 var tokenizer = new cls . HTTPHeaderTokenizer ( ) ;
224225 tokenizer . tokenize ( req . request_headers_raw , this . _token_receiver . bind ( this , req . header_tokens ) ) ;
225226 }
226-
227227 var METHOD = 0 ;
228- var data_spec_firstline_tokens = [ METHOD ] ;
229- var state_holder = new cls . HTTPHeaderTokenizer . TokenStateholder ( data_spec_firstline_tokens ) ;
230- var map_func = this . _header_token_templ . bind ( this , state_holder ) ;
231- return [
232- this . _pre ( req . header_tokens . map ( map_func ) )
233- ] ;
228+ return this . _pre ( this . headers_tonkenized ( req . header_tokens , [ METHOD ] ) ) ;
234229 }
235- return [
236- ui_strings . S_NETWORK_REQUEST_NO_HEADERS_LABEL
237- ] ;
230+ return ui_strings . S_NETWORK_REQUEST_NO_HEADERS_LABEL ;
238231 }
239232
240233 var ret = [ ] ;
@@ -258,19 +251,26 @@ templates._request_headers = function(req, do_raw)
258251 if ( req . firstline_tokens . length )
259252 {
260253 var METHOD = 0 ;
261- var data_spec_firstline_tokens = [ METHOD ] ;
262- var state_holder = new cls . HTTPHeaderTokenizer . TokenStateholder ( data_spec_firstline_tokens ) ;
263- var map_func = this . _header_token_templ . bind ( this , state_holder ) ;
264- firstline = req . firstline_tokens . map ( map_func ) ;
254+ ret . unshift ( this . headers_tonkenized ( req . firstline_tokens , [ METHOD ] ) ) ;
265255 }
266- ret . unshift ( this . _pre ( firstline ) ) ;
267256 }
268257 }
269- return [
270- ret
271- ] ;
258+ return templates . _pre ( ret ) ;
272259} ;
273260
261+ templates . headers_tonkenized = function ( tokens , data_spec_firstline_tokens )
262+ {
263+ var state_holder = new cls . HTTPHeaderTokenizer . TokenStateholder ( data_spec_firstline_tokens ) ;
264+ var map_func = this . _header_token_templ . bind ( this , state_holder ) ;
265+ var token_templates = tokens . reduce ( function ( previous_val , current_val , index ) {
266+ if ( index == 1 )
267+ previous_val = map_func ( previous_val ) ;
268+ return previous_val . concat ( map_func ( current_val ) ) ;
269+ } ) ;
270+ token_templates . push ( state_holder . str_buffer ) ;
271+ return token_templates ;
272+ }
273+
274274templates . _response_headers = function ( resp , do_raw )
275275{
276276 if ( do_raw )
@@ -285,19 +285,14 @@ templates._response_headers = function(resp, do_raw)
285285 if ( resp . header_tokens . length )
286286 {
287287 var RESPONSECODE = 1 ;
288- var data_spec_firstline_tokens = [ RESPONSECODE ] ;
289- var state_holder = new cls . HTTPHeaderTokenizer . TokenStateholder ( data_spec_firstline_tokens ) ;
290- var map_func = this . _header_token_templ . bind ( this , state_holder ) ;
291- return [
292- this . _pre ( resp . header_tokens . map ( map_func ) )
293- ] ;
288+ return this . _pre ( this . headers_tonkenized ( resp . header_tokens , [ RESPONSECODE ] ) ) ;
294289 }
295290 return [
296291 ui_strings . S_NETWORK_REQUEST_NO_HEADERS_LABEL
297292 ] ;
298293 }
299294
300- var ret = [ resp . response_headers . map ( this . _headers_pseudo_raw ) ] ;
295+ var ret = resp . response_headers && resp . response_headers . map ( this . _headers_pseudo_raw ) || [ ] ;
301296 if ( resp . first_line )
302297 {
303298 var firstline = [ ] ;
@@ -310,37 +305,38 @@ templates._response_headers = function(resp, do_raw)
310305
311306 if ( resp . firstline_tokens . length )
312307 {
313- var RESPONSECODE = 1 ;
314- var data_spec_firstline_tokens = [ RESPONSECODE ] ;
315- var state_holder = new cls . HTTPHeaderTokenizer . TokenStateholder ( data_spec_firstline_tokens ) ;
316- var map_func = this . _header_token_templ . bind ( this , state_holder ) ;
317- firstline = resp . firstline_tokens . map ( map_func ) ;
308+ ret . unshift ( this . headers_tonkenized ( resp . firstline_tokens , [ RESPONSECODE ] ) ) ;
318309 }
319- ret . unshift ( this . _pre ( firstline ) ) ;
320310 }
321311
322- return [
323- ret
324- ] ;
312+ return templates . _pre ( ret ) ;
325313} ;
326314
327315templates . _headers_pseudo_raw = function ( header )
328316{
317+ /* Shortcutting. For raw headers, highlighted types are defined like this:
318+ var highlighted_types = [
319+ cls.HTTPHeaderTokenizer.types.NAME,
320+ cls.HTTPHeaderTokenizer.types.FIRST_LINE_PART
321+ ];
322+ */
329323 var template = [
330324 [ "span" , header . name ,
331325 "data-spec" , "http#" + header . name . trim ( ) ,
332- "class" , cls . HTTPHeaderTokenizer . classnames [ cls . HTTPHeaderTokenizer . types . NAME ]
326+ "class" , cls . HTTPHeaderTokenizer . classnames [ cls . HTTPHeaderTokenizer . types . NAME ] ,
327+ "data-tooltip" , "network-header-tooltip" ,
328+ "data-header-name" , header . name . trim ( ) . toLowerCase ( )
333329 ] ,
334- [ "span" , ": " + header . value ,
335- "class" , cls . HTTPHeaderTokenizer . classnames [ cls . HTTPHeaderTokenizer . types . VALUE ] ]
330+ ": " + header . value + "\n"
336331 ] ;
337- return templates . _pre ( template ) ;
332+ return template ;
338333} ;
339334
340335templates . param_cells = function ( name_value )
341336{
342337 var parts = name_value . replace ( / \+ / g, " " ) . split ( "=" ) ;
343338 return [
339+ "tr" ,
344340 [ "td" , decodeURIComponent ( parts [ 0 ] ) , "class" , "mono" ] ,
345341 [ "td" , decodeURIComponent ( parts [ 1 ] ) , "class" , "mono" ]
346342 ] ;
@@ -351,47 +347,55 @@ templates._request_body = function(req, do_raw)
351347 if ( req . request_body == null )
352348 return [ ] ;
353349
354- var ret = [ this . _pre ( "\n" ) ] ;
350+ var ret ; // todo: might revisit "ret", maybe return more often so that it's clear nothing more happens.
355351 if ( req . request_body . partList . length ) // Multipart
356352 {
353+ var multi_p_template = [ ] ;
357354 var use_raw_boundary = Boolean ( do_raw && req . boundary ) ;
358- var boundary = use_raw_boundary ? req . boundary : [ "hr" ] ;
355+ var boundary = use_raw_boundary ? [ "span" , req . boundary , "class" , HTTP_BOUNDARY_CLASS ] : [ "hr" ] ;
359356 for ( var n = 0 , part ; part = req . request_body . partList [ n ] ; n ++ )
360357 {
361358 if ( n === 0 )
362- ret . push ( this . _pre ( boundary , HTTP_BOUNDARY_CLASS ) ) ;
359+ multi_p_template . push ( boundary ) ;
363360
364- ret . extend ( part . headerList . map ( this . _headers_pseudo_raw ) ) ;
365- ret . push ( this . _pre ( "\n" ) ) ;
361+ multi_p_template . extend ( part . headerList . map ( this . _headers_pseudo_raw ) ) ;
362+ multi_p_template . push ( this . _pre ( "\n" ) ) ;
366363 if ( part . content && part . content . stringData )
367- ret . push ( this . _pre ( part . content . stringData , "mono network-body" ) ) ;
364+ multi_p_template . push ( part . content . stringData ) ;
368365 else
369- ret . push ( [ "p" , ui_strings . S_NETWORK_N_BYTE_BODY . replace ( "%s" , part . contentLength ) ] ) ;
366+ multi_p_template . push ( [ "p" , ui_strings . S_NETWORK_N_BYTE_BODY . replace ( "%s" , part . contentLength ) ] ) ;
370367
371368 if ( use_raw_boundary && part === req . request_body . partList . last )
372- boundary += "--\n" ;
373-
374- ret . push ( this . _pre ( boundary , HTTP_BOUNDARY_CLASS ) ) ;
369+ {
370+ var TEXTCONTENT = 1 ;
371+ boundary [ TEXTCONTENT ] += "--\n" ;
372+ }
373+ multi_p_template . push ( boundary ) ;
375374 }
375+ ret = multi_p_template ;
376376 }
377377 else if ( req . request_body . mimeType . startswith ( "application/x-www-form-urlencoded" ) )
378378 {
379+ var url_enc_template = [ ] ;
379380 if ( do_raw )
380381 {
381- ret . push ( this . _pre ( req . request_body . content . stringData , "network-body" ) ) ;
382+ url_enc_template . push ( req . request_body . content . stringData ) ;
382383 }
383384 else
384385 {
385386 var parts = req . request_body . content . stringData . split ( "&" ) ;
386387 var rows = [ ] ;
387388 rows . push ( [
388- [ "th" , ui_strings . S_LABEL_NETWORK_POST_DATA_NAME ] ,
389- [ "th" , ui_strings . S_LABEL_NETWORK_POST_DATA_VALUE ]
390- ] ) ;
389+ "tr" ,
390+ [ "th" , [ "p" , ui_strings . S_LABEL_NETWORK_POST_DATA_NAME ] ] ,
391+ [ "th" , [ "p" , ui_strings . S_LABEL_NETWORK_POST_DATA_VALUE ] ]
392+ ]
393+ ) ;
391394 rows . extend ( parts . map ( this . param_cells ) ) ;
392395 var table = [ "table" , rows ] ;
393- ret . push ( table ) ;
396+ url_enc_template . push ( table ) ;
394397 }
398+ ret = url_enc_template ;
395399 }
396400 else // not multipart or form.
397401 {
@@ -400,22 +404,22 @@ templates._request_body = function(req, do_raw)
400404 var type = cls . ResourceUtil . mime_to_type ( req . request_body . mimeType ) ;
401405 if ( TEXT_TYPES . contains ( type ) )
402406 {
403- ret . push ( this . _pre ( req . request_body . content . stringData , "network-body" ) ) ;
407+ ret = req . request_body . content . stringData ;
404408 }
405409 else
406410 {
407411 if ( req . request_body . mimeType )
408412 {
409- ret . push ( [ "p" , ui_strings . S_NETWORK_CANT_DISPLAY_TYPE . replace ( "%s" , req . request_body . mimeType ) ] ) ;
413+ ret = [ "p" , ui_strings . S_NETWORK_CANT_DISPLAY_TYPE . replace ( "%s" , req . request_body . mimeType ) ] ;
410414 }
411415 else
412416 {
413- ret . push ( [ "p" , ui_strings . S_NETWORK_UNKNOWN_MIME_TYPE ] ) ;
417+ ret = [ "p" , ui_strings . S_NETWORK_UNKNOWN_MIME_TYPE ] ;
414418 }
415419 }
416420 }
417421 }
418- return ret ;
422+ return [ this . _pre ( "\n" ) , templates . _pre ( ret ) ] ;
419423} ;
420424
421425
@@ -454,20 +458,19 @@ templates._response_body = function(resp, do_raw, is_last_response)
454458 if ( TEXT_TYPES . contains ( resp . logger_entry_type ) )
455459 {
456460 ret . push (
457- this . _pre ( resp . responsebody . content . stringData , "network-body" )
461+ this . _pre ( resp . responsebody . content . stringData ) // todo: don't pre here
458462 ) ;
459463 }
460464 else if ( resp . logger_entry_type == "image" )
461465 {
462466 ret . push (
463- [ "img" , "src" , resp . responsebody . content . stringData , "class" , "network-body" ]
467+ [ "img" , "src" , resp . responsebody . content . stringData ]
464468 ) ;
465469 }
466470 else
467471 {
468472 ret . push (
469- [ "span" , ui_strings . S_NETWORK_REQUEST_DETAIL_UNDISPLAYABLE_BODY_LABEL . replace ( "%s" , resp . logger_entry_mime ) ,
470- "class" , "network-body" ]
473+ [ "p" , ui_strings . S_NETWORK_REQUEST_DETAIL_UNDISPLAYABLE_BODY_LABEL . replace ( "%s" , resp . logger_entry_mime ) ]
471474 ) ;
472475 }
473476 }
0 commit comments