///|
pub fn export_entries_csv(archive : HarArchive) -> String {
let mut out = "index,method,status,time,bytes,domain,kind,url\n"
for i = 0; i < archive.log.entries.length(); i = i + 1 {
out = out + export_entry_csv_row(archive.log.entries[i], i)
}
out
}
///|
pub fn export_entry_csv_row(entry : HarEntry, index : Int) -> String {
index.to_string() +
"," +
csv_cell(entry.request.http_method) +
"," +
entry.response.status.to_string() +
"," +
entry.time.to_string() +
"," +
entry_bytes(entry).to_string() +
"," +
csv_cell(extract_domain(entry.request.url)) +
"," +
csv_cell(resource_kind(entry.response.content.mime_type, entry.request.url)) +
"," +
csv_cell(entry.request.url) +
"\n"
}
///|
pub fn csv_cell(value : String) -> String {
if value.contains(",") || value.contains("\"") || value.contains("\n") {
"\"" + value.replace_all(old="\"", new="\"\"") + "\""
} else {
value
}
}
///|
pub fn export_domains_csv(summary : HarSummary) -> String {
let mut out = "domain,count,bytes,failures\n"
for i = 0; i < summary.domains.length(); i = i + 1 {
let d = summary.domains[i]
out = out +
csv_cell(d.domain) +
"," +
d.count.to_string() +
"," +
d.bytes.to_string() +
"," +
d.failures.to_string() +
"\n"
}
out
}
///|
pub fn export_resources_csv(summary : HarSummary) -> String {
let mut out = "kind,count,bytes\n"
for i = 0; i < summary.resources.length(); i = i + 1 {
let r = summary.resources[i]
out = out +
csv_cell(r.kind) +
"," +
r.count.to_string() +
"," +
r.bytes.to_string() +
"\n"
}
out
}
///|
pub fn export_statuses_csv(summary : HarSummary) -> String {
let mut out = "group,count\n"
for i = 0; i < summary.statuses.length(); i = i + 1 {
let s = summary.statuses[i]
out = out + csv_cell(s.group) + "," + s.count.to_string() + "\n"
}
out
}
///|
pub fn export_slow_csv(summary : HarSummary) -> String {
let mut out = "method,status,time,wait,receive,url\n"
for i = 0; i < summary.slow_entries.length(); i = i + 1 {
let s = summary.slow_entries[i]
out = out +
csv_cell(s.http_method) +
"," +
s.status.to_string() +
"," +
s.time.to_string() +
"," +
s.wait.to_string() +
"," +
s.receive.to_string() +
"," +
csv_cell(s.url) +
"\n"
}
out
}
///|
pub fn export_waterfall_json(rows : Array[WaterfallRow]) -> String {
let mut out = "["
for i = 0; i < rows.length(); i = i + 1 {
if i > 0 {
out = out + ","
}
out = out + export_waterfall_row_json(rows[i])
}
out + "]"
}
///|
pub fn export_waterfall_row_json(row : WaterfallRow) -> String {
"{" +
"\"index\":" +
row.index.to_string() +
"," +
"\"method\":\"" +
escape_json(row.http_method) +
"\"," +
"\"status\":" +
row.status.to_string() +
"," +
"\"duration\":" +
row.duration.to_string() +
"," +
"\"startOffset\":" +
row.start_offset.to_string() +
"," +
"\"domain\":\"" +
escape_json(row.domain) +
"\"," +
"\"kind\":\"" +
escape_json(row.kind) +
"\"," +
"\"url\":\"" +
escape_json(row.url) +
"\"" +
"}"
}
///|
pub fn export_diagnostics_json(diags : Array[Diagnostic]) -> String {
let mut out = "["
for i = 0; i < diags.length(); i = i + 1 {
if i > 0 {
out = out + ","
}
let d = diags[i]
out = out + "{"
out = out +
"\"severity\":\"" +
escape_json(severity_text(d.severity)) +
"\","
out = out + "\"code\":\"" + escape_json(d.code) + "\","
out = out + "\"path\":\"" + escape_json(d.path) + "\","
out = out + "\"message\":\"" + escape_json(d.message) + "\""
out = out + "}"
}
out + "]"
}
///|
pub fn export_full_report_json(archive : HarArchive) -> String {
let summary = analyze_archive(archive)
let diagnostics = validate_archive(archive)
let rows = build_waterfall(archive)
"{" +
"\"summary\":" +
render_summary_json(summary) +
"," +
"\"diagnostics\":" +
export_diagnostics_json(diagnostics) +
"," +
"\"waterfall\":" +
export_waterfall_json(rows) +
"}"
}