@continuedev/fetch 1.0.10 → 1.0.11
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/fetch.js +70 -1
- package/package.json +1 -1
- package/src/fetch.ts +89 -2
package/dist/fetch.js
CHANGED
|
@@ -5,6 +5,61 @@ import fetch, { Response } from "node-fetch";
|
|
|
5
5
|
import { getAgentOptions } from "./getAgentOptions.js";
|
|
6
6
|
import { getProxyFromEnv, shouldBypassProxy } from "./util.js";
|
|
7
7
|
const { http, https } = followRedirects.default;
|
|
8
|
+
function logRequest(method, url, headers, body, proxy, shouldBypass) {
|
|
9
|
+
console.log("=== FETCH REQUEST ===");
|
|
10
|
+
console.log(`Method: ${method}`);
|
|
11
|
+
console.log(`URL: ${url.toString()}`);
|
|
12
|
+
// Log headers in curl format
|
|
13
|
+
console.log("Headers:");
|
|
14
|
+
for (const [key, value] of Object.entries(headers)) {
|
|
15
|
+
console.log(` -H '${key}: ${value}'`);
|
|
16
|
+
}
|
|
17
|
+
// Log proxy information
|
|
18
|
+
if (proxy && !shouldBypass) {
|
|
19
|
+
console.log(`Proxy: ${proxy}`);
|
|
20
|
+
}
|
|
21
|
+
// Log body
|
|
22
|
+
if (body) {
|
|
23
|
+
console.log(`Body: ${body}`);
|
|
24
|
+
}
|
|
25
|
+
// Generate equivalent curl command
|
|
26
|
+
let curlCommand = `curl -X ${method}`;
|
|
27
|
+
for (const [key, value] of Object.entries(headers)) {
|
|
28
|
+
curlCommand += ` -H '${key}: ${value}'`;
|
|
29
|
+
}
|
|
30
|
+
if (body) {
|
|
31
|
+
curlCommand += ` -d '${body}'`;
|
|
32
|
+
}
|
|
33
|
+
if (proxy && !shouldBypass) {
|
|
34
|
+
curlCommand += ` --proxy '${proxy}'`;
|
|
35
|
+
}
|
|
36
|
+
curlCommand += ` '${url.toString()}'`;
|
|
37
|
+
console.log(`Equivalent curl: ${curlCommand}`);
|
|
38
|
+
console.log("=====================");
|
|
39
|
+
}
|
|
40
|
+
async function logResponse(resp) {
|
|
41
|
+
console.log("=== FETCH RESPONSE ===");
|
|
42
|
+
console.log(`Status: ${resp.status} ${resp.statusText}`);
|
|
43
|
+
console.log("Response Headers:");
|
|
44
|
+
resp.headers.forEach((value, key) => {
|
|
45
|
+
console.log(` ${key}: ${value}`);
|
|
46
|
+
});
|
|
47
|
+
// Clone response to read body without consuming it
|
|
48
|
+
const respClone = resp.clone();
|
|
49
|
+
try {
|
|
50
|
+
const responseText = await respClone.text();
|
|
51
|
+
console.log(`Response Body: ${responseText}`);
|
|
52
|
+
}
|
|
53
|
+
catch (e) {
|
|
54
|
+
console.log("Could not read response body:", e);
|
|
55
|
+
}
|
|
56
|
+
console.log("======================");
|
|
57
|
+
}
|
|
58
|
+
function logError(error) {
|
|
59
|
+
console.log("=== FETCH ERROR ===");
|
|
60
|
+
console.log(`Error: ${error}`);
|
|
61
|
+
console.log("===================");
|
|
62
|
+
}
|
|
8
63
|
export async function fetchwithRequestOptions(url_, init, requestOptions) {
|
|
9
64
|
const url = typeof url_ === "string" ? new URL(url_) : url_;
|
|
10
65
|
if (url.host === "localhost") {
|
|
@@ -52,14 +107,24 @@ export async function fetchwithRequestOptions(url_, init, requestOptions) {
|
|
|
52
107
|
catch (e) {
|
|
53
108
|
console.log("Unable to parse HTTP request body: ", e);
|
|
54
109
|
}
|
|
110
|
+
const finalBody = updatedBody ?? init?.body;
|
|
111
|
+
const method = init?.method || "GET";
|
|
112
|
+
// Verbose logging for debugging - log request details
|
|
113
|
+
if (process.env.VERBOSE_FETCH) {
|
|
114
|
+
logRequest(method, url, headers, finalBody, proxy, shouldBypass);
|
|
115
|
+
}
|
|
55
116
|
// fetch the request with the provided options
|
|
56
117
|
try {
|
|
57
118
|
const resp = await fetch(url, {
|
|
58
119
|
...init,
|
|
59
|
-
body:
|
|
120
|
+
body: finalBody,
|
|
60
121
|
headers: headers,
|
|
61
122
|
agent: agent,
|
|
62
123
|
});
|
|
124
|
+
// Verbose logging for debugging - log response details
|
|
125
|
+
if (process.env.VERBOSE_FETCH) {
|
|
126
|
+
await logResponse(resp);
|
|
127
|
+
}
|
|
63
128
|
if (!resp.ok) {
|
|
64
129
|
const requestId = resp.headers.get("x-request-id");
|
|
65
130
|
if (requestId) {
|
|
@@ -69,6 +134,10 @@ export async function fetchwithRequestOptions(url_, init, requestOptions) {
|
|
|
69
134
|
return resp;
|
|
70
135
|
}
|
|
71
136
|
catch (error) {
|
|
137
|
+
// Verbose logging for errors
|
|
138
|
+
if (process.env.VERBOSE_FETCH) {
|
|
139
|
+
logError(error);
|
|
140
|
+
}
|
|
72
141
|
if (error instanceof Error && error.name === "AbortError") {
|
|
73
142
|
// Return a Response object that streamResponse etc can handle
|
|
74
143
|
return new Response(null, {
|
package/package.json
CHANGED
package/src/fetch.ts
CHANGED
|
@@ -2,12 +2,81 @@ import { RequestOptions } from "@continuedev/config-types";
|
|
|
2
2
|
import * as followRedirects from "follow-redirects";
|
|
3
3
|
import { HttpProxyAgent } from "http-proxy-agent";
|
|
4
4
|
import { HttpsProxyAgent } from "https-proxy-agent";
|
|
5
|
-
import fetch, { RequestInit, Response } from "node-fetch";
|
|
5
|
+
import fetch, { BodyInit, RequestInit, Response } from "node-fetch";
|
|
6
6
|
import { getAgentOptions } from "./getAgentOptions.js";
|
|
7
7
|
import { getProxyFromEnv, shouldBypassProxy } from "./util.js";
|
|
8
8
|
|
|
9
9
|
const { http, https } = (followRedirects as any).default;
|
|
10
10
|
|
|
11
|
+
function logRequest(
|
|
12
|
+
method: string,
|
|
13
|
+
url: URL,
|
|
14
|
+
headers: { [key: string]: string },
|
|
15
|
+
body: BodyInit | null | undefined,
|
|
16
|
+
proxy?: string,
|
|
17
|
+
shouldBypass?: boolean,
|
|
18
|
+
) {
|
|
19
|
+
console.log("=== FETCH REQUEST ===");
|
|
20
|
+
console.log(`Method: ${method}`);
|
|
21
|
+
console.log(`URL: ${url.toString()}`);
|
|
22
|
+
|
|
23
|
+
// Log headers in curl format
|
|
24
|
+
console.log("Headers:");
|
|
25
|
+
for (const [key, value] of Object.entries(headers)) {
|
|
26
|
+
console.log(` -H '${key}: ${value}'`);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Log proxy information
|
|
30
|
+
if (proxy && !shouldBypass) {
|
|
31
|
+
console.log(`Proxy: ${proxy}`);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Log body
|
|
35
|
+
if (body) {
|
|
36
|
+
console.log(`Body: ${body}`);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Generate equivalent curl command
|
|
40
|
+
let curlCommand = `curl -X ${method}`;
|
|
41
|
+
for (const [key, value] of Object.entries(headers)) {
|
|
42
|
+
curlCommand += ` -H '${key}: ${value}'`;
|
|
43
|
+
}
|
|
44
|
+
if (body) {
|
|
45
|
+
curlCommand += ` -d '${body}'`;
|
|
46
|
+
}
|
|
47
|
+
if (proxy && !shouldBypass) {
|
|
48
|
+
curlCommand += ` --proxy '${proxy}'`;
|
|
49
|
+
}
|
|
50
|
+
curlCommand += ` '${url.toString()}'`;
|
|
51
|
+
console.log(`Equivalent curl: ${curlCommand}`);
|
|
52
|
+
console.log("=====================");
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
async function logResponse(resp: Response) {
|
|
56
|
+
console.log("=== FETCH RESPONSE ===");
|
|
57
|
+
console.log(`Status: ${resp.status} ${resp.statusText}`);
|
|
58
|
+
console.log("Response Headers:");
|
|
59
|
+
resp.headers.forEach((value, key) => {
|
|
60
|
+
console.log(` ${key}: ${value}`);
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
// Clone response to read body without consuming it
|
|
64
|
+
const respClone = resp.clone();
|
|
65
|
+
try {
|
|
66
|
+
const responseText = await respClone.text();
|
|
67
|
+
console.log(`Response Body: ${responseText}`);
|
|
68
|
+
} catch (e) {
|
|
69
|
+
console.log("Could not read response body:", e);
|
|
70
|
+
}
|
|
71
|
+
console.log("======================");
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function logError(error: unknown) {
|
|
75
|
+
console.log("=== FETCH ERROR ===");
|
|
76
|
+
console.log(`Error: ${error}`);
|
|
77
|
+
console.log("===================");
|
|
78
|
+
}
|
|
79
|
+
|
|
11
80
|
export async function fetchwithRequestOptions(
|
|
12
81
|
url_: URL | string,
|
|
13
82
|
init?: RequestInit,
|
|
@@ -68,15 +137,28 @@ export async function fetchwithRequestOptions(
|
|
|
68
137
|
console.log("Unable to parse HTTP request body: ", e);
|
|
69
138
|
}
|
|
70
139
|
|
|
140
|
+
const finalBody = updatedBody ?? init?.body;
|
|
141
|
+
const method = init?.method || "GET";
|
|
142
|
+
|
|
143
|
+
// Verbose logging for debugging - log request details
|
|
144
|
+
if (process.env.VERBOSE_FETCH) {
|
|
145
|
+
logRequest(method, url, headers, finalBody, proxy, shouldBypass);
|
|
146
|
+
}
|
|
147
|
+
|
|
71
148
|
// fetch the request with the provided options
|
|
72
149
|
try {
|
|
73
150
|
const resp = await fetch(url, {
|
|
74
151
|
...init,
|
|
75
|
-
body:
|
|
152
|
+
body: finalBody,
|
|
76
153
|
headers: headers,
|
|
77
154
|
agent: agent,
|
|
78
155
|
});
|
|
79
156
|
|
|
157
|
+
// Verbose logging for debugging - log response details
|
|
158
|
+
if (process.env.VERBOSE_FETCH) {
|
|
159
|
+
await logResponse(resp);
|
|
160
|
+
}
|
|
161
|
+
|
|
80
162
|
if (!resp.ok) {
|
|
81
163
|
const requestId = resp.headers.get("x-request-id");
|
|
82
164
|
if (requestId) {
|
|
@@ -86,6 +168,11 @@ export async function fetchwithRequestOptions(
|
|
|
86
168
|
|
|
87
169
|
return resp;
|
|
88
170
|
} catch (error) {
|
|
171
|
+
// Verbose logging for errors
|
|
172
|
+
if (process.env.VERBOSE_FETCH) {
|
|
173
|
+
logError(error);
|
|
174
|
+
}
|
|
175
|
+
|
|
89
176
|
if (error instanceof Error && error.name === "AbortError") {
|
|
90
177
|
// Return a Response object that streamResponse etc can handle
|
|
91
178
|
return new Response(null, {
|