Skip to content

Commit 548348c

Browse files
committed
update: add fetch to do the http requests
1 parent 8950354 commit 548348c

File tree

8 files changed

+147
-7
lines changed

8 files changed

+147
-7
lines changed

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,7 @@
268268
"test": "vscode-test"
269269
},
270270
"devDependencies": {
271+
"@types/http-string-parser": "^0.0.33",
271272
"@types/mocha": "^10.0.10",
272273
"@types/node": "~20.19.1",
273274
"@types/vscode": "^1.101.0",
@@ -284,6 +285,7 @@
284285
"webpack-cli": "^6.0.1"
285286
},
286287
"dependencies": {
288+
"http-string-parser": "^0.0.6",
287289
"table": "^6.9.0",
288290
"vscode-variables": "^1.0.1",
289291
"yaml": "^2.8.0"

pnpm-lock.yaml

Lines changed: 16 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/codelens/httpreapter/base.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import * as vscode from "vscode";
22
import { logger } from "../../global/log";
33

44
export type MarkdownHTTPCodeLensGenerator = (
5-
post: string,
5+
post: string[],
66
startLine: number,
77
document: vscode.TextDocument
88
) => vscode.CodeLens[];
@@ -21,7 +21,7 @@ export class MarkdownHTTPCodeLensProvider implements vscode.CodeLensProvider {
2121
const lines = document.getText().split("\n");
2222

2323
let inYaml = false;
24-
let currentPost = "";
24+
let currentPost = [];
2525
let yamlStartLine = 0;
2626

2727
for (let i = 0; i < lines.length; i++) {
@@ -38,9 +38,9 @@ export class MarkdownHTTPCodeLensProvider implements vscode.CodeLensProvider {
3838
}
3939
}
4040
inYaml = false;
41-
currentPost = "";
41+
currentPost = [];
4242
} else {
43-
currentPost += line + "\n";
43+
currentPost.push(line);
4444
}
4545
} else if (line.startsWith("```http")) {
4646
inYaml = true;

src/codelens/httpreapter/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
import { MarkdownHTTPCodeLensProvider } from "./base";
2+
import { httpRepeaterCodeLens } from "./send";
23

3-
export const httpRepeater = new MarkdownHTTPCodeLensProvider();
4+
export const httpRepeater = new MarkdownHTTPCodeLensProvider(httpRepeaterCodeLens);

src/codelens/httpreapter/send.ts

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,44 @@
11
import { MarkdownHTTPCodeLensGenerator } from "./base";
2+
import * as vscode from "vscode";
23

4+
export const httpRepeaterCodeLens: MarkdownHTTPCodeLensGenerator = (post: string[], startLine: number, document: vscode.TextDocument): vscode.CodeLens[] => {
5+
const codeLenses: vscode.CodeLens[] = [];
6+
const cmd: vscode.Command = {
7+
title: "Send HTTP Request",
8+
command: "weapon.http_raw_request",
9+
arguments: [
10+
{
11+
request: post.join("\r\n"),
12+
isHTTPS: false,
13+
},
14+
],
15+
};
16+
let cmd2: vscode.Command = {
17+
title: "Send HTTPS Request",
18+
command: "weapon.http_raw_request",
19+
arguments: [
20+
{
21+
request: post.join("\r\n"),
22+
isHTTPS: true,
23+
},
24+
],
25+
};
26+
codeLenses.push(
27+
new vscode.CodeLens(
28+
new vscode.Range(
29+
new vscode.Position(startLine, 0),
30+
new vscode.Position(startLine + 1, 0)
31+
),
32+
cmd
33+
),
34+
new vscode.CodeLens(
35+
new vscode.Range(
36+
new vscode.Position(startLine, 0),
37+
new vscode.Position(startLine + 1, 0)
38+
),
39+
cmd2
40+
)
41+
);
342

43+
return codeLenses;
44+
};

src/codelens/index.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { targetFilePattern } from "../global/const";
33
import { markdownCodelens } from "./yamlconfig";
44
import { CommandCodeLensProvider } from "./command/commandProvider";
55
import { NoteCreationProvider } from "./newnote/noteProvider";
6+
import { httpRepeater } from "./httpreapter";
67

78
export function registerCodeLensProviders(context: vscode.ExtensionContext) {
89
context.subscriptions.push(
@@ -18,5 +19,9 @@ export function registerCodeLensProviders(context: vscode.ExtensionContext) {
1819
{ language: "markdown", scheme: "file", pattern: targetFilePattern },
1920
new NoteCreationProvider()
2021
),
22+
vscode.languages.registerCodeLensProvider(
23+
{ language: "markdown", scheme: "file", pattern: targetFilePattern },
24+
httpRepeater
25+
)
2126
);
2227
}

src/commands/http/request.ts

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
import { callback } from "../utils";
2+
import { parseRequest, ParseRequestResult } from "http-string-parser";
3+
import * as vscode from "vscode";
4+
import { logger } from "../../global/log";
5+
6+
export const rawHTTPRequest: callback = async (args) => {
7+
let request: string | undefined = args.request ? args.request : undefined;
8+
if (!request) {
9+
vscode.window.showErrorMessage("No request provided");
10+
return;
11+
}
12+
let isHTTPS = args.isHTTPS ? args.isHTTPS : false;
13+
14+
let res: ParseRequestResult;
15+
try {
16+
res = parseRequest(request);
17+
if (!res) {
18+
logger.error("Failed to parse request", request);
19+
vscode.window.showErrorMessage("Invalid request format");
20+
return;
21+
}
22+
} catch (e: any) {
23+
logger.error("raise Error parsing request", e);
24+
vscode.window.showErrorMessage(`Error parsing request: ${e.message}`);
25+
return;
26+
}
27+
try {
28+
const { method, uri, headers, body } = res;
29+
var url = headers["Host"]
30+
? `${isHTTPS ? "https" : "http"}://${headers["Host"]}${uri}`
31+
: uri;
32+
logger.debug(
33+
`sending request: ${method} ${url}, headers: ${JSON.stringify(
34+
headers
35+
)}, body: ${body ? body : "none"}`
36+
);
37+
let response: Response | undefined = undefined;
38+
if (method === "GET" || method === "HEAD") {
39+
// For GET and HEAD requests, we should not send a body
40+
response = await fetch(url, {
41+
method,
42+
headers,
43+
});
44+
} else {
45+
response = await fetch(url, {
46+
method,
47+
headers,
48+
body,
49+
});
50+
}
51+
let responseText: string = `HTTP/1.1 ${response.status} ${response.statusText}\n`;
52+
for (const [key, value] of response.headers.entries()) {
53+
responseText += `${key}: ${value}\n`;
54+
}
55+
responseText += "\n" + (await response.text());
56+
57+
await vscode.window.showTextDocument(
58+
vscode.Uri.parse(
59+
"weaponized-editor:response.http?" + encodeURIComponent(responseText)
60+
),
61+
{
62+
preview: false,
63+
viewColumn: vscode.ViewColumn.Beside,
64+
}
65+
);
66+
} catch (e: any) {
67+
logger.error("raise Error fetching request", e);
68+
vscode.window.showErrorMessage(`Error fetching request: ${e.message}`);
69+
return;
70+
}
71+
};

src/commands/index.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { switchActiveHost } from "./switch/host";
1111
import { switchActiveUser } from "./switch/user";
1212
import { cyberChefMagicDecoder } from "./decoder/cyberchef";
1313
import { copyCommand } from "./copy/copy";
14+
import { rawHTTPRequest } from "./http/request";
1415

1516
export function registerCommandsPackage(context: vscode.ExtensionContext) {
1617
context.subscriptions.push(
@@ -42,6 +43,9 @@ export function registerCommandsPackage(context: vscode.ExtensionContext) {
4243
vscode.workspace.registerTextDocumentContentProvider(
4344
"weaponized-editor",
4445
new ReadOnlyProvider()
45-
)
46-
);
46+
),
47+
vscode.commands.registerCommand(
48+
"weapon.http_raw_request",
49+
rawHTTPRequest
50+
));
4751
}

0 commit comments

Comments
 (0)