@paretools/http 0.8.5 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -3,7 +3,7 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
3
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
4
  import { registerAllTools } from "./tools/index.js";
5
5
  const server = new McpServer({ name: "@paretools/http", version: "0.8.1" }, {
6
- instructions: "Structured HTTP request operations via curl (request, get, post, head). Use instead of running curl commands via bash. Returns typed JSON with status, headers, body, timing, and size.",
6
+ instructions: "Structured HTTP request operations via curl (request, get, post, head). Returns typed JSON with status, headers, body, timing, and size.",
7
7
  });
8
8
  registerAllTools(server);
9
9
  const transport = new StdioServerTransport();
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,OAAO,EAAE,EAC7C;IACE,YAAY,EACV,yLAAyL;CAC5L,CACF,CAAC;AAEF,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAEzB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,OAAO,EAAE,EAC7C;IACE,YAAY,EACV,0IAA0I;CAC7I,CACF,CAAC;AAEF,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAEzB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC"}
@@ -4,6 +4,6 @@ import { run } from "@paretools/shared";
4
4
  * Uses a generous timeout since HTTP requests can be slow.
5
5
  */
6
6
  export async function curlCmd(args, cwd) {
7
- return run("curl", args, { cwd, timeout: 120_000 });
7
+ return run("curl", args, { cwd, timeout: 180_000 });
8
8
  }
9
9
  //# sourceMappingURL=curl-runner.js.map
@@ -7,7 +7,11 @@ export declare function formatHttpHeadResponse(data: HttpHeadResponse): string;
7
7
  export declare function compactResponseMap(data: HttpResponse): HttpResponseCompact;
8
8
  /** Formats compact HTTP response. */
9
9
  export declare function formatResponseCompact(data: HttpResponseCompact): string;
10
- /** Maps full HEAD response to compact form (drop headers). */
10
+ /**
11
+ * Maps full HEAD response to compact form.
12
+ * Preserves essential headers (content-length, cache-control, etag, last-modified, content-type)
13
+ * even in compact mode, since HEAD responses are primarily about headers.
14
+ */
11
15
  export declare function compactHeadResponseMap(data: HttpHeadResponse): HttpHeadResponseCompact;
12
16
  /** Formats compact HEAD response. */
13
17
  export declare function formatHeadResponseCompact(data: HttpHeadResponseCompact): string;
@@ -1 +1 @@
1
- {"version":3,"file":"formatters.d.ts","sourceRoot":"","sources":["../../src/lib/formatters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,gBAAgB,EAChB,mBAAmB,EACnB,uBAAuB,EACxB,MAAM,qBAAqB,CAAC;AAE7B,6DAA6D;AAC7D,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CA0B7D;AAED,wDAAwD;AACxD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAoBrE;AAID,uEAAuE;AACvE,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,YAAY,GAAG,mBAAmB,CAQ1E;AAED,qCAAqC;AACrC,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAGvE;AAED,8DAA8D;AAC9D,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,gBAAgB,GAAG,uBAAuB,CAOtF;AAED,qCAAqC;AACrC,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,uBAAuB,GAAG,MAAM,CAG/E"}
1
+ {"version":3,"file":"formatters.d.ts","sourceRoot":"","sources":["../../src/lib/formatters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,gBAAgB,EAChB,mBAAmB,EACnB,uBAAuB,EAExB,MAAM,qBAAqB,CAAC;AAyB7B,6DAA6D;AAC7D,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CA4C7D;AAED,wDAAwD;AACxD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAyCrE;AAID,uEAAuE;AACvE,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,YAAY,GAAG,mBAAmB,CAS1E;AAED,qCAAqC;AACrC,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAIvE;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,gBAAgB,GAAG,uBAAuB,CAmBtF;AAED,qCAAqC;AACrC,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,uBAAuB,GAAG,MAAM,CAmB/E"}
@@ -1,11 +1,50 @@
1
+ import { HEAD_ESSENTIAL_HEADERS } from "../schemas/index.js";
2
+ /** Formats timing details into a human-readable string. */
3
+ function formatTimingLine(timing) {
4
+ let line = `Time: ${timing.total.toFixed(3)}s`;
5
+ if (timing.details) {
6
+ const d = timing.details;
7
+ const parts = [];
8
+ parts.push(`dns=${d.namelookup.toFixed(3)}s`);
9
+ parts.push(`tcp=${d.connect.toFixed(3)}s`);
10
+ if (d.appconnect !== undefined) {
11
+ parts.push(`tls=${d.appconnect.toFixed(3)}s`);
12
+ }
13
+ if (d.pretransfer !== undefined) {
14
+ parts.push(`pre=${d.pretransfer.toFixed(3)}s`);
15
+ }
16
+ if (d.starttransfer !== undefined) {
17
+ parts.push(`ttfb=${d.starttransfer.toFixed(3)}s`);
18
+ }
19
+ line += ` (${parts.join(", ")})`;
20
+ }
21
+ return line;
22
+ }
1
23
  /** Formats a full HTTP response into human-readable text. */
2
24
  export function formatHttpResponse(data) {
3
25
  const lines = [];
4
- lines.push(`HTTP ${data.status} ${data.statusText}`);
26
+ const version = data.httpVersion ? `/${data.httpVersion}` : "";
27
+ lines.push(`HTTP${version} ${data.status} ${data.statusText}`);
5
28
  if (data.contentType) {
6
29
  lines.push(`Content-Type: ${data.contentType}`);
7
30
  }
8
- lines.push(`Size: ${data.size} bytes | Time: ${data.timing.total.toFixed(3)}s`);
31
+ const upload = data.uploadSize !== undefined ? ` | uploaded ${data.uploadSize} bytes` : "";
32
+ lines.push(`Size: ${data.size} bytes${upload} | ${formatTimingLine(data.timing)}`);
33
+ if (data.redirectChain && data.redirectChain.length > 0) {
34
+ lines.push(`Redirects: ${data.redirectChain.length}`);
35
+ for (const hop of data.redirectChain) {
36
+ lines.push(` ${hop.status} -> ${hop.location}`);
37
+ }
38
+ }
39
+ if (data.finalUrl) {
40
+ lines.push(`Final URL: ${data.finalUrl}`);
41
+ }
42
+ if (data.scheme) {
43
+ lines.push(`Scheme: ${data.scheme}`);
44
+ }
45
+ if (data.tlsVerifyResult !== undefined) {
46
+ lines.push(`TLS verify result: ${data.tlsVerifyResult}`);
47
+ }
9
48
  const headers = data.headers ?? {};
10
49
  const headerCount = Object.keys(headers).length;
11
50
  lines.push(`Headers: ${headerCount}`);
@@ -22,11 +61,30 @@ export function formatHttpResponse(data) {
22
61
  /** Formats a HEAD response into human-readable text. */
23
62
  export function formatHttpHeadResponse(data) {
24
63
  const lines = [];
25
- lines.push(`HTTP ${data.status} ${data.statusText}`);
64
+ const version = data.httpVersion ? `/${data.httpVersion}` : "";
65
+ lines.push(`HTTP${version} ${data.status} ${data.statusText}`);
26
66
  if (data.contentType) {
27
67
  lines.push(`Content-Type: ${data.contentType}`);
28
68
  }
29
- lines.push(`Time: ${data.timing.total.toFixed(3)}s`);
69
+ if (data.contentLength !== undefined) {
70
+ lines.push(`Content-Length: ${data.contentLength}`);
71
+ }
72
+ lines.push(formatTimingLine(data.timing));
73
+ if (data.redirectChain && data.redirectChain.length > 0) {
74
+ lines.push(`Redirects: ${data.redirectChain.length}`);
75
+ for (const hop of data.redirectChain) {
76
+ lines.push(` ${hop.status} -> ${hop.location}`);
77
+ }
78
+ }
79
+ if (data.finalUrl) {
80
+ lines.push(`Final URL: ${data.finalUrl}`);
81
+ }
82
+ if (data.scheme) {
83
+ lines.push(`Scheme: ${data.scheme}`);
84
+ }
85
+ if (data.tlsVerifyResult !== undefined) {
86
+ lines.push(`TLS verify result: ${data.tlsVerifyResult}`);
87
+ }
30
88
  const headers = data.headers ?? {};
31
89
  const headerCount = Object.keys(headers).length;
32
90
  lines.push(`Headers: ${headerCount}`);
@@ -41,6 +99,7 @@ export function compactResponseMap(data) {
41
99
  return {
42
100
  status: data.status,
43
101
  statusText: data.statusText,
102
+ httpVersion: data.httpVersion,
44
103
  contentType: data.contentType,
45
104
  size: data.size,
46
105
  timing: data.timing,
@@ -48,21 +107,51 @@ export function compactResponseMap(data) {
48
107
  }
49
108
  /** Formats compact HTTP response. */
50
109
  export function formatResponseCompact(data) {
110
+ const version = data.httpVersion ? `/${data.httpVersion}` : "";
51
111
  const ct = data.contentType ? ` (${data.contentType})` : "";
52
- return `HTTP ${data.status} ${data.statusText}${ct} | ${data.size} bytes | ${data.timing.total.toFixed(3)}s`;
112
+ return `HTTP${version} ${data.status} ${data.statusText}${ct} | ${data.size} bytes | ${data.timing.total.toFixed(3)}s`;
53
113
  }
54
- /** Maps full HEAD response to compact form (drop headers). */
114
+ /**
115
+ * Maps full HEAD response to compact form.
116
+ * Preserves essential headers (content-length, cache-control, etag, last-modified, content-type)
117
+ * even in compact mode, since HEAD responses are primarily about headers.
118
+ */
55
119
  export function compactHeadResponseMap(data) {
120
+ const headers = data.headers ?? {};
121
+ const essential = {};
122
+ for (const key of HEAD_ESSENTIAL_HEADERS) {
123
+ if (headers[key] !== undefined) {
124
+ essential[key] = headers[key];
125
+ }
126
+ }
56
127
  return {
57
128
  status: data.status,
58
129
  statusText: data.statusText,
130
+ httpVersion: data.httpVersion,
59
131
  contentType: data.contentType,
132
+ contentLength: data.contentLength,
60
133
  timing: data.timing,
134
+ ...(Object.keys(essential).length > 0 ? { essentialHeaders: essential } : {}),
61
135
  };
62
136
  }
63
137
  /** Formats compact HEAD response. */
64
138
  export function formatHeadResponseCompact(data) {
139
+ const version = data.httpVersion ? `/${data.httpVersion}` : "";
65
140
  const ct = data.contentType ? ` (${data.contentType})` : "";
66
- return `HTTP ${data.status} ${data.statusText}${ct} | ${data.timing.total.toFixed(3)}s`;
141
+ const cl = data.contentLength !== undefined ? ` | ${data.contentLength} bytes` : "";
142
+ let line = `HTTP${version} ${data.status} ${data.statusText}${ct}${cl} | ${data.timing.total.toFixed(3)}s`;
143
+ if (data.essentialHeaders && Object.keys(data.essentialHeaders).length > 0) {
144
+ const headerParts = [];
145
+ for (const [key, value] of Object.entries(data.essentialHeaders)) {
146
+ // Skip content-type (already shown) and content-length (already shown as bytes)
147
+ if (key === "content-type" || key === "content-length")
148
+ continue;
149
+ headerParts.push(`${key}: ${value}`);
150
+ }
151
+ if (headerParts.length > 0) {
152
+ line += "\n " + headerParts.join("\n ");
153
+ }
154
+ }
155
+ return line;
67
156
  }
68
157
  //# sourceMappingURL=formatters.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"formatters.js","sourceRoot":"","sources":["../../src/lib/formatters.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"formatters.js","sourceRoot":"","sources":["../../src/lib/formatters.ts"],"names":[],"mappings":"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"}
@@ -11,7 +11,7 @@ export declare const PARE_META_SEPARATOR = "---PARE_HTTP_META---";
11
11
  * \r\n
12
12
  * <body>
13
13
  * \n---PARE_HTTP_META---\n
14
- * <time_total> <size_download>
14
+ * <time_total> <size_download> <time_namelookup> <time_connect> <time_appconnect> <time_pretransfer> <time_starttransfer>
15
15
  *
16
16
  * When following redirects, multiple status+header blocks may appear.
17
17
  * We parse the LAST one (the final response).
@@ -19,6 +19,7 @@ export declare const PARE_META_SEPARATOR = "---PARE_HTTP_META---";
19
19
  export declare function parseCurlOutput(stdout: string, _stderr: string, _exitCode: number): HttpResponse;
20
20
  /**
21
21
  * Parses curl output for HEAD requests (no body expected).
22
+ * Extracts contentLength as a numeric field from the Content-Length header.
22
23
  */
23
24
  export declare function parseCurlHeadOutput(stdout: string, stderr: string, exitCode: number): HttpHeadResponse;
24
25
  /**
@@ -32,6 +33,7 @@ export declare function splitHttpBlocks(raw: string): string[];
32
33
  export declare function parseHttpBlock(block: string): {
33
34
  status: number;
34
35
  statusText: string;
36
+ httpVersion: string;
35
37
  headers: Record<string, string>;
36
38
  body: string;
37
39
  };
@@ -1 +1 @@
1
- {"version":3,"file":"parsers.d.ts","sourceRoot":"","sources":["../../src/lib/parsers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE1E,oEAAoE;AACpE,eAAO,MAAM,mBAAmB,yBAAyB,CAAC;AAU1D;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,YAAY,CA+BhG;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,gBAAgB,CAUlB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAsBrD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;CACd,CA0CA"}
1
+ {"version":3,"file":"parsers.d.ts","sourceRoot":"","sources":["../../src/lib/parsers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAiB,MAAM,qBAAqB,CAAC;AAEzF,oEAAoE;AACpE,eAAO,MAAM,mBAAmB,yBAAyB,CAAC;AAqB1D;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,YAAY,CAqDhG;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,gBAAgB,CA2BlB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAsBrD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;CACd,CA2CA"}
@@ -10,7 +10,7 @@ export const PARE_META_SEPARATOR = "---PARE_HTTP_META---";
10
10
  * \r\n
11
11
  * <body>
12
12
  * \n---PARE_HTTP_META---\n
13
- * <time_total> <size_download>
13
+ * <time_total> <size_download> <time_namelookup> <time_connect> <time_appconnect> <time_pretransfer> <time_starttransfer>
14
14
  *
15
15
  * When following redirects, multiple status+header blocks may appear.
16
16
  * We parse the LAST one (the final response).
@@ -27,31 +27,70 @@ export function parseCurlOutput(stdout, _stderr, _exitCode) {
27
27
  const meta = parseMetaSection(metaSection);
28
28
  // When following redirects, curl with -i outputs multiple response blocks.
29
29
  // Each block starts with HTTP/. We want the LAST one.
30
- const blocks = splitHttpBlocks(responsePart);
31
- const lastBlock = blocks.length > 0 ? blocks[blocks.length - 1] : responsePart;
32
- const { status, statusText, headers, body } = parseHttpBlock(lastBlock);
30
+ const blocks = splitHttpBlocks(responsePart).map((block) => parseHttpBlock(block));
31
+ const lastBlock = blocks.length > 0 ? blocks[blocks.length - 1] : parseHttpBlock(responsePart);
32
+ const { status, statusText, headers, body, httpVersion } = lastBlock;
33
33
  const contentType = headers["content-type"];
34
+ const redirectChain = blocks
35
+ .slice(0, -1)
36
+ .map((block) => {
37
+ const location = block.headers["location"];
38
+ if (!location)
39
+ return null;
40
+ return {
41
+ status: block.status,
42
+ location,
43
+ };
44
+ })
45
+ .filter((entry) => entry !== null);
46
+ const timingDetails = buildTimingDetails(meta);
34
47
  return {
35
48
  status,
36
49
  statusText,
50
+ httpVersion: httpVersion || meta.http_version || undefined,
37
51
  headers,
38
52
  body: body || undefined,
39
- timing: { total: meta.time_total },
53
+ timing: {
54
+ total: meta.time_total,
55
+ ...(timingDetails ? { details: timingDetails } : {}),
56
+ },
40
57
  size: meta.size_download,
58
+ uploadSize: meta.size_upload > 0 ? meta.size_upload : undefined,
41
59
  contentType,
60
+ redirectChain: redirectChain.length > 0 ? redirectChain : undefined,
61
+ finalUrl: meta.url_effective || undefined,
62
+ scheme: meta.scheme || undefined,
63
+ tlsVerifyResult: Number.isFinite(meta.ssl_verify_result) ? meta.ssl_verify_result : undefined,
42
64
  };
43
65
  }
44
66
  /**
45
67
  * Parses curl output for HEAD requests (no body expected).
68
+ * Extracts contentLength as a numeric field from the Content-Length header.
46
69
  */
47
70
  export function parseCurlHeadOutput(stdout, stderr, exitCode) {
48
71
  const full = parseCurlOutput(stdout, stderr, exitCode);
72
+ // Extract Content-Length as a numeric field for easy size checking
73
+ const headers = full.headers ?? {};
74
+ const clHeader = headers["content-length"];
75
+ let contentLength;
76
+ if (clHeader !== undefined) {
77
+ const parsed = parseInt(clHeader, 10);
78
+ if (!isNaN(parsed) && parsed >= 0) {
79
+ contentLength = parsed;
80
+ }
81
+ }
49
82
  return {
50
83
  status: full.status,
51
84
  statusText: full.statusText,
85
+ httpVersion: full.httpVersion,
52
86
  headers: full.headers,
53
87
  timing: full.timing,
54
88
  contentType: full.contentType,
89
+ contentLength,
90
+ redirectChain: full.redirectChain,
91
+ finalUrl: full.finalUrl,
92
+ scheme: full.scheme,
93
+ tlsVerifyResult: full.tlsVerifyResult,
55
94
  };
56
95
  }
57
96
  /**
@@ -99,9 +138,10 @@ export function parseHttpBlock(block) {
99
138
  const lines = headerSection.split("\n");
100
139
  const statusLine = lines[0] || "";
101
140
  // Parse status line: HTTP/1.1 200 OK
102
- const statusMatch = statusLine.match(/^HTTP\/[\d.]+\s+(\d+)\s*(.*)/);
103
- const status = statusMatch ? parseInt(statusMatch[1], 10) : 0;
104
- const statusText = statusMatch ? statusMatch[2].trim() : "";
141
+ const statusMatch = statusLine.match(/^HTTP\/([\d.]+)\s+(\d+)\s*(.*)/);
142
+ const status = statusMatch ? parseInt(statusMatch[2], 10) : 0;
143
+ const statusText = statusMatch ? statusMatch[3].trim() : "";
144
+ const httpVersion = statusMatch ? statusMatch[1] : "";
105
145
  // Parse headers
106
146
  const headers = {};
107
147
  for (let i = 1; i < lines.length; i++) {
@@ -115,17 +155,78 @@ export function parseHttpBlock(block) {
115
155
  }
116
156
  // Trim trailing whitespace from body
117
157
  body = body.replace(/\n$/, "");
118
- return { status, statusText, headers, body };
158
+ return { status, statusText, httpVersion, headers, body };
159
+ }
160
+ /**
161
+ * Builds a TimingDetails object from the parsed meta section.
162
+ * Returns undefined if all timing values are zero (no real timing data available).
163
+ */
164
+ function buildTimingDetails(meta) {
165
+ // If namelookup and connect are both 0, we likely have no timing data
166
+ // (e.g. old format or no metadata)
167
+ if (meta.time_namelookup === 0 && meta.time_connect === 0 && meta.time_starttransfer === 0) {
168
+ return undefined;
169
+ }
170
+ const details = {
171
+ namelookup: meta.time_namelookup,
172
+ connect: meta.time_connect,
173
+ };
174
+ // Only include appconnect when it has a meaningful value (> 0 means TLS was used)
175
+ if (meta.time_appconnect > 0) {
176
+ details.appconnect = meta.time_appconnect;
177
+ }
178
+ // Only include pretransfer when available
179
+ if (meta.time_pretransfer > 0) {
180
+ details.pretransfer = meta.time_pretransfer;
181
+ }
182
+ // Only include starttransfer when available
183
+ if (meta.time_starttransfer > 0) {
184
+ details.starttransfer = meta.time_starttransfer;
185
+ }
186
+ return details;
119
187
  }
120
188
  /**
121
189
  * Parses the metadata section appended by curl's -w format string.
122
- * Format: "<time_total> <size_download>"
190
+ * Format: "<time_total> <size_download> <size_upload> <time_namelookup> <time_connect> <time_appconnect> <time_pretransfer> <time_starttransfer> <http_version> <num_redirects> <url_effective> <scheme> <ssl_verify_result>"
191
+ *
192
+ * For backward compatibility, also handles the old 2-field format:
193
+ * "<time_total> <size_download>"
123
194
  */
124
195
  function parseMetaSection(meta) {
125
196
  const parts = meta.trim().split(/\s+/);
197
+ if (parts.length <= 7) {
198
+ // Backward-compatible parser for previous write-out format:
199
+ // <time_total> <size_download> <time_namelookup> <time_connect> <time_appconnect> <time_pretransfer> <time_starttransfer>
200
+ return {
201
+ time_total: parts[0] ? parseFloat(parts[0]) : 0,
202
+ size_download: parts[1] ? parseFloat(parts[1]) : 0,
203
+ size_upload: 0,
204
+ time_namelookup: parts[2] ? parseFloat(parts[2]) : 0,
205
+ time_connect: parts[3] ? parseFloat(parts[3]) : 0,
206
+ time_appconnect: parts[4] ? parseFloat(parts[4]) : 0,
207
+ time_pretransfer: parts[5] ? parseFloat(parts[5]) : 0,
208
+ time_starttransfer: parts[6] ? parseFloat(parts[6]) : 0,
209
+ http_version: "",
210
+ num_redirects: 0,
211
+ url_effective: "",
212
+ scheme: "",
213
+ ssl_verify_result: 0,
214
+ };
215
+ }
126
216
  return {
127
217
  time_total: parts[0] ? parseFloat(parts[0]) : 0,
128
218
  size_download: parts[1] ? parseFloat(parts[1]) : 0,
219
+ size_upload: parts[2] ? parseFloat(parts[2]) : 0,
220
+ time_namelookup: parts[3] ? parseFloat(parts[3]) : 0,
221
+ time_connect: parts[4] ? parseFloat(parts[4]) : 0,
222
+ time_appconnect: parts[5] ? parseFloat(parts[5]) : 0,
223
+ time_pretransfer: parts[6] ? parseFloat(parts[6]) : 0,
224
+ time_starttransfer: parts[7] ? parseFloat(parts[7]) : 0,
225
+ http_version: parts[8] ?? "",
226
+ num_redirects: parts[9] ? parseInt(parts[9], 10) : 0,
227
+ url_effective: parts[10] ?? "",
228
+ scheme: parts[11] ?? "",
229
+ ssl_verify_result: parts[12] ? parseInt(parts[12], 10) : 0,
129
230
  };
130
231
  }
131
232
  //# sourceMappingURL=parsers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"parsers.js","sourceRoot":"","sources":["../../src/lib/parsers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"parsers.js","sourceRoot":"","sources":["../../src/lib/parsers.ts"],"names":[],"mappings":"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"}
@@ -1,53 +1,132 @@
1
1
  import { z } from "zod";
2
2
  /** Zod schema for a single HTTP header key-value pair as a record. */
3
3
  export declare const HttpHeadersSchema: z.ZodRecord<z.ZodString, z.ZodString>;
4
+ /** Zod schema for expanded timing details from curl's -w format variables. */
5
+ export declare const TimingDetailsSchema: z.ZodObject<{
6
+ namelookup: z.ZodNumber;
7
+ connect: z.ZodNumber;
8
+ appconnect: z.ZodOptional<z.ZodNumber>;
9
+ pretransfer: z.ZodOptional<z.ZodNumber>;
10
+ starttransfer: z.ZodOptional<z.ZodNumber>;
11
+ }, z.core.$strip>;
12
+ export type TimingDetails = z.infer<typeof TimingDetailsSchema>;
4
13
  /** Zod schema for HTTP timing information. */
5
14
  export declare const HttpTimingSchema: z.ZodObject<{
6
15
  total: z.ZodNumber;
16
+ details: z.ZodOptional<z.ZodObject<{
17
+ namelookup: z.ZodNumber;
18
+ connect: z.ZodNumber;
19
+ appconnect: z.ZodOptional<z.ZodNumber>;
20
+ pretransfer: z.ZodOptional<z.ZodNumber>;
21
+ starttransfer: z.ZodOptional<z.ZodNumber>;
22
+ }, z.core.$strip>>;
23
+ }, z.core.$strip>;
24
+ export type HttpTiming = z.infer<typeof HttpTimingSchema>;
25
+ /** A single redirect hop captured from intermediate HTTP response headers. */
26
+ export declare const RedirectHopSchema: z.ZodObject<{
27
+ status: z.ZodNumber;
28
+ location: z.ZodString;
7
29
  }, z.core.$strip>;
30
+ export type RedirectHop = z.infer<typeof RedirectHopSchema>;
8
31
  /** Zod schema for the full HTTP response result (used by request, get, post). */
9
32
  export declare const HttpResponseSchema: z.ZodObject<{
10
33
  status: z.ZodNumber;
11
34
  statusText: z.ZodString;
35
+ httpVersion: z.ZodOptional<z.ZodString>;
12
36
  headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
13
37
  body: z.ZodOptional<z.ZodString>;
14
38
  timing: z.ZodObject<{
15
39
  total: z.ZodNumber;
40
+ details: z.ZodOptional<z.ZodObject<{
41
+ namelookup: z.ZodNumber;
42
+ connect: z.ZodNumber;
43
+ appconnect: z.ZodOptional<z.ZodNumber>;
44
+ pretransfer: z.ZodOptional<z.ZodNumber>;
45
+ starttransfer: z.ZodOptional<z.ZodNumber>;
46
+ }, z.core.$strip>>;
16
47
  }, z.core.$strip>;
17
48
  size: z.ZodNumber;
49
+ uploadSize: z.ZodOptional<z.ZodNumber>;
18
50
  contentType: z.ZodOptional<z.ZodString>;
51
+ redirectChain: z.ZodOptional<z.ZodArray<z.ZodObject<{
52
+ status: z.ZodNumber;
53
+ location: z.ZodString;
54
+ }, z.core.$strip>>>;
55
+ finalUrl: z.ZodOptional<z.ZodString>;
56
+ scheme: z.ZodOptional<z.ZodString>;
57
+ tlsVerifyResult: z.ZodOptional<z.ZodNumber>;
19
58
  }, z.core.$strip>;
20
59
  export type HttpResponse = z.infer<typeof HttpResponseSchema>;
21
60
  /** Zod schema for the HEAD-only HTTP response result (no body). */
22
61
  export declare const HttpHeadResponseSchema: z.ZodObject<{
23
62
  status: z.ZodNumber;
24
63
  statusText: z.ZodString;
64
+ httpVersion: z.ZodOptional<z.ZodString>;
25
65
  headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
26
66
  timing: z.ZodObject<{
27
67
  total: z.ZodNumber;
68
+ details: z.ZodOptional<z.ZodObject<{
69
+ namelookup: z.ZodNumber;
70
+ connect: z.ZodNumber;
71
+ appconnect: z.ZodOptional<z.ZodNumber>;
72
+ pretransfer: z.ZodOptional<z.ZodNumber>;
73
+ starttransfer: z.ZodOptional<z.ZodNumber>;
74
+ }, z.core.$strip>>;
28
75
  }, z.core.$strip>;
29
76
  contentType: z.ZodOptional<z.ZodString>;
77
+ contentLength: z.ZodOptional<z.ZodNumber>;
78
+ redirectChain: z.ZodOptional<z.ZodArray<z.ZodObject<{
79
+ status: z.ZodNumber;
80
+ location: z.ZodString;
81
+ }, z.core.$strip>>>;
82
+ finalUrl: z.ZodOptional<z.ZodString>;
83
+ scheme: z.ZodOptional<z.ZodString>;
84
+ tlsVerifyResult: z.ZodOptional<z.ZodNumber>;
30
85
  }, z.core.$strip>;
31
86
  export type HttpHeadResponse = z.infer<typeof HttpHeadResponseSchema>;
32
87
  /** Compact response: status, timing, size. Drop headers and body. */
33
88
  export declare const HttpResponseCompactSchema: z.ZodObject<{
34
89
  status: z.ZodNumber;
35
90
  statusText: z.ZodString;
91
+ httpVersion: z.ZodOptional<z.ZodString>;
36
92
  contentType: z.ZodOptional<z.ZodString>;
37
93
  size: z.ZodNumber;
38
94
  timing: z.ZodObject<{
39
95
  total: z.ZodNumber;
96
+ details: z.ZodOptional<z.ZodObject<{
97
+ namelookup: z.ZodNumber;
98
+ connect: z.ZodNumber;
99
+ appconnect: z.ZodOptional<z.ZodNumber>;
100
+ pretransfer: z.ZodOptional<z.ZodNumber>;
101
+ starttransfer: z.ZodOptional<z.ZodNumber>;
102
+ }, z.core.$strip>>;
40
103
  }, z.core.$strip>;
41
104
  }, z.core.$strip>;
42
105
  export type HttpResponseCompact = z.infer<typeof HttpResponseCompactSchema>;
43
- /** Compact HEAD response: status and timing only. Drop headers. */
106
+ /**
107
+ * Compact HEAD response: status, timing, and key headers.
108
+ * Retains essential headers even in compact mode: content-length, cache-control,
109
+ * etag, last-modified, content-type.
110
+ */
44
111
  export declare const HttpHeadResponseCompactSchema: z.ZodObject<{
45
112
  status: z.ZodNumber;
46
113
  statusText: z.ZodString;
114
+ httpVersion: z.ZodOptional<z.ZodString>;
47
115
  contentType: z.ZodOptional<z.ZodString>;
116
+ contentLength: z.ZodOptional<z.ZodNumber>;
48
117
  timing: z.ZodObject<{
49
118
  total: z.ZodNumber;
119
+ details: z.ZodOptional<z.ZodObject<{
120
+ namelookup: z.ZodNumber;
121
+ connect: z.ZodNumber;
122
+ appconnect: z.ZodOptional<z.ZodNumber>;
123
+ pretransfer: z.ZodOptional<z.ZodNumber>;
124
+ starttransfer: z.ZodOptional<z.ZodNumber>;
125
+ }, z.core.$strip>>;
50
126
  }, z.core.$strip>;
127
+ essentialHeaders: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
51
128
  }, z.core.$strip>;
52
129
  export type HttpHeadResponseCompact = z.infer<typeof HttpHeadResponseCompactSchema>;
130
+ /** Headers that should be preserved in HEAD compact mode. */
131
+ export declare const HEAD_ESSENTIAL_HEADERS: readonly ["content-length", "cache-control", "etag", "last-modified", "content-type"];
53
132
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/schemas/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,sEAAsE;AACtE,eAAO,MAAM,iBAAiB,uCAAmC,CAAC;AAElE,8CAA8C;AAC9C,eAAO,MAAM,gBAAgB;;iBAE3B,CAAC;AAEH,iFAAiF;AACjF,eAAO,MAAM,kBAAkB;;;;;;;;;;iBAQ7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,mEAAmE;AACnE,eAAO,MAAM,sBAAsB;;;;;;;;iBAMjC,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE,qEAAqE;AACrE,eAAO,MAAM,yBAAyB;;;;;;;;iBAMpC,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E,mEAAmE;AACnE,eAAO,MAAM,6BAA6B;;;;;;;iBAKxC,CAAC;AAEH,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/schemas/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,sEAAsE;AACtE,eAAO,MAAM,iBAAiB,uCAAmC,CAAC;AAElE,8EAA8E;AAC9E,eAAO,MAAM,mBAAmB;;;;;;iBAe9B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,8CAA8C;AAC9C,eAAO,MAAM,gBAAgB;;;;;;;;;iBAG3B,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D,8EAA8E;AAC9E,eAAO,MAAM,iBAAiB;;;iBAG5B,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,iFAAiF;AACjF,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;iBAc7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAE9D,mEAAmE;AACnE,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;iBAYjC,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE,qEAAqE;AACrE,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;iBAOpC,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E;;;;GAIG;AACH,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;;;iBAQxC,CAAC;AAEH,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AAEpF,6DAA6D;AAC7D,eAAO,MAAM,sBAAsB,uFAMzB,CAAC"}