Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions packages/core/src/tool/plugin/webfetch.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,9 @@ const acceptHeader = (format: Format) => {
}
}

const headers = (format: Format, userAgent: string) => ({
const headers = (url: string, format: Format, userAgent: string) => ({
"User-Agent": userAgent,
Accept: acceptHeader(format),
Accept: new URL(url).pathname.toLowerCase().endsWith(".md") ? "*/*" : acceptHeader(format),
"Accept-Language": "en-US,en;q=0.9",
})

Expand All @@ -66,7 +66,7 @@ const isCloudflareChallenge = (error: unknown) => {
}

const request = (url: string, format: Format, userAgent = openCodeUserAgent) =>
HttpClientRequest.get(url).pipe(HttpClientRequest.setHeaders(headers(format, userAgent)))
HttpClientRequest.get(url).pipe(HttpClientRequest.setHeaders(headers(url, format, userAgent)))

const assertHttpUrl = (url: URL) => {
if (url.protocol !== "http:" && url.protocol !== "https:") throw new Error("URL must use http:// or https://")
Expand Down
14 changes: 14 additions & 0 deletions packages/core/test/tool-webfetch.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -455,6 +455,20 @@ describe("WebFetchTool registration", () => {
}),
)

it.effect("does not negotiate markdown for .md URLs", () =>
Effect.gen(function* () {
reset()
const registry = yield* Tool.Service
const url = "https://docs.example.com/page.md?source=llms.txt"

yield* Effect.forEach(["markdown", "text", "html"] as const, (format) =>
executeTool(registry, call({ url, format }, `call-webfetch-${format}`)),
)

expect(requests.map((request) => request.headers.accept)).toEqual(["*/*", "*/*", "*/*"])
}),
)

it.effect("accepts localhost URLs with the same requested-URL permission check", () =>
Effect.gen(function* () {
reset()
Expand Down
Loading