Skip to content

Commit 2a970f3

Browse files
committed
fix: isolate docs markdown negotiation
1 parent 93382be commit 2a970f3

4 files changed

Lines changed: 37 additions & 9 deletions

File tree

src/routes/$libraryId/$version.docs.$.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { loadDocs, resolveDocsRedirect } from '~/utils/docs'
44
import { findLibrary, getBranch, getLibrary } from '~/libraries'
55
import { DocContainer } from '~/components/DocContainer'
66
import type { ConfigSchema } from '~/utils/config'
7+
import { docsContentNegotiationVaryHeader } from '~/utils/http'
78
import {
89
notFound,
910
redirect,
@@ -91,14 +92,14 @@ export const Route = createFileRoute('/$libraryId/$version/docs/$')({
9192
'cache-control': 'public, max-age=60, must-revalidate',
9293
'cdn-cache-control':
9394
'max-age=600, stale-while-revalidate=3600, durable',
94-
vary: 'Accept-Encoding',
95+
vary: docsContentNegotiationVaryHeader,
9596
}
9697
} else {
9798
return {
9899
'cache-control': 'public, max-age=3600, must-revalidate',
99100
'cdn-cache-control':
100101
'max-age=86400, stale-while-revalidate=604800, durable',
101-
vary: 'Accept-Encoding',
102+
vary: docsContentNegotiationVaryHeader,
102103
}
103104
}
104105
},

src/routes/$libraryId/$version.docs.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { DocsLayout } from '~/components/DocsLayout'
88
import { findLibrary } from '~/libraries'
99
import { seo } from '~/utils/seo'
1010
import type { ConfigSchema } from '~/utils/config'
11+
import { docsContentNegotiationVaryHeader } from '~/utils/http'
1112

1213
export const Route = createFileRoute('/$libraryId/$version/docs')({
1314
head: (ctx) => {
@@ -30,6 +31,7 @@ export const Route = createFileRoute('/$libraryId/$version/docs')({
3031
return {
3132
'cache-control': 'public, max-age=0, must-revalidate',
3233
'cdn-cache-control': 'max-age=300, stale-while-revalidate=300, durable',
34+
vary: docsContentNegotiationVaryHeader,
3335
}
3436
},
3537
})

src/server.ts

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,29 @@ import {
1010
logRequestStart,
1111
runWithRequestDiagnostics,
1212
} from '~/utils/prod-diagnostics.server'
13+
import { docsContentNegotiationVaryHeader } from '~/utils/http'
1314

1415
installProductionFetchProbe()
1516
installProductionProcessProbe()
1617

18+
function isBrowserDocumentRequest(request: Request) {
19+
return (
20+
request.headers.get('Sec-Fetch-Dest') === 'document' ||
21+
request.headers.get('Sec-Fetch-Mode') === 'navigate'
22+
)
23+
}
24+
25+
function shouldRewriteDocsRequestToMarkdown(request: Request, url: URL) {
26+
const acceptHeader = request.headers.get('Accept') || ''
27+
28+
return (
29+
acceptHeader.includes('text/markdown') &&
30+
url.pathname.includes('/docs/') &&
31+
!url.pathname.endsWith('.md') &&
32+
!isBrowserDocumentRequest(request)
33+
)
34+
}
35+
1736
export default createServerEntry(
1837
wrapFetchWithSentry({
1938
async fetch(request) {
@@ -22,20 +41,24 @@ export default createServerEntry(
2241
logRequestStart(context)
2342

2443
try {
25-
const acceptHeader = request.headers.get('Accept') || ''
26-
if (
27-
acceptHeader.includes('text/markdown') &&
28-
url.pathname.includes('/docs/') &&
29-
!url.pathname.endsWith('.md')
30-
) {
44+
if (shouldRewriteDocsRequestToMarkdown(request, url)) {
3145
const mdUrl = new URL(request.url)
3246
mdUrl.pathname = `${url.pathname}.md`
3347
const mdRequest = new Request(mdUrl, request)
3448
const mdResponse = await handler.fetch(mdRequest)
49+
const markdownHeaders = new Headers(mdResponse.headers)
50+
markdownHeaders.set('Vary', docsContentNegotiationVaryHeader)
51+
52+
const markdownResponse = new Response(mdResponse.body, {
53+
status: mdResponse.status,
54+
statusText: mdResponse.statusText,
55+
headers: markdownHeaders,
56+
})
57+
3558
logRequestEnd(context, mdResponse.status, {
3659
rewrittenToMarkdown: true,
3760
})
38-
return mdResponse
61+
return markdownResponse
3962
}
4063

4164
const response = await handler.fetch(request)

src/utils/http.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export const docsContentNegotiationVaryHeader =
2+
'Accept, Accept-Encoding, Sec-Fetch-Dest, Sec-Fetch-Mode'

0 commit comments

Comments
 (0)