From 53b9f10ac89dac61fd05ba37f26d2370aafd12eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samy=20Pess=C3=A9?= Date: Wed, 18 Dec 2024 10:05:31 +0100 Subject: [PATCH] Prepare @gitbook/proxy to support serving under sub-directory (#2641) --- .changeset/silly-bananas-serve.md | 5 ++ bun.lockb | Bin 574304 -> 574728 bytes packages/gitbook/src/middleware.ts | 72 ++++++++++++++++----- packages/proxy/.gitignore | 1 + packages/proxy/README.md | 28 +++++++++ packages/proxy/package.json | 28 +++++++++ packages/proxy/src/index.test.ts | 59 ++++++++++++++++++ packages/proxy/src/index.ts | 97 +++++++++++++++++++++++++++++ packages/proxy/tsconfig.json | 23 +++++++ 9 files changed, 298 insertions(+), 15 deletions(-) create mode 100644 .changeset/silly-bananas-serve.md mode change 100644 => 100755 bun.lockb create mode 100644 packages/proxy/.gitignore create mode 100644 packages/proxy/README.md create mode 100644 packages/proxy/package.json create mode 100644 packages/proxy/src/index.test.ts create mode 100644 packages/proxy/src/index.ts create mode 100644 packages/proxy/tsconfig.json diff --git a/.changeset/silly-bananas-serve.md b/.changeset/silly-bananas-serve.md new file mode 100644 index 000000000..e2a70ade5 --- /dev/null +++ b/.changeset/silly-bananas-serve.md @@ -0,0 +1,5 @@ +--- +'@gitbook/proxy': minor +--- + +First version diff --git a/bun.lockb b/bun.lockb old mode 100644 new mode 100755 index 6c00827f058dac47740f49ffaa27dddc759ba3a4..dc1b41c81d75e01fff370c271820741a6039521a GIT binary patch delta 86683 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 delta 86594 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 AeE lookupSpaceForURL(mode, request, inputURL), + () => lookupSiteForURL(mode, request, inputURL), ); if ('error' in resolved) { return new NextResponse(resolved.error.message, { @@ -211,7 +220,10 @@ export async function middleware(request: NextRequest) { } headers.set('x-gitbook-mode', mode); headers.set('x-gitbook-origin-basepath', originBasePath); - headers.set('x-gitbook-basepath', joinPath(originBasePath, resolved.basePath)); + headers.set( + 'x-gitbook-basepath', + mode === 'proxy' ? originBasePath : joinPath(originBasePath, resolved.basePath), + ); headers.set('x-gitbook-content-space', resolved.space); if ('site' in resolved) { headers.set('x-gitbook-content-organization', resolved.organization); @@ -302,7 +314,10 @@ export async function middleware(request: NextRequest) { /** * Compute the input URL the user is trying to access. */ -function getInputURL(request: NextRequest): { url: URL; mode: URLLookupMode } { +function getInputURL(request: NextRequest): { + url: URL; + mode: URLLookupMode; +} { const url = new URL(request.url); let mode: URLLookupMode = (process.env.GITBOOK_MODE as URLLookupMode | undefined) ?? 'multi-path'; @@ -332,27 +347,36 @@ function getInputURL(request: NextRequest): { url: URL; mode: URLLookupMode } { mode = 'multi-id'; } + // When passing a x-gitbook-site-url header, this URL is used instead of the request URL + // to determine the site to serve. + const xGitbookSite = request.headers.get('x-gitbook-site-url'); + if (xGitbookSite) { + mode = 'proxy'; + } + return { url, mode }; } -async function lookupSpaceForURL( +async function lookupSiteForURL( mode: URLLookupMode, request: NextRequest, url: URL, ): Promise { switch (mode) { case 'single': { - return await lookupSpaceInSingleMode(url); + return await lookupSiteInSingleMode(url); } case 'multi': { - return await lookupSpaceInMultiMode(request, url); + return await lookupSiteInMultiMode(request, url); } case 'multi-path': { - return await lookupSpaceInMultiPathMode(request, url); + return await lookupSiteInMultiPathMode(request, url); } case 'multi-id': { return await lookupSiteOrSpaceInMultiIdMode(request, url); } + case 'proxy': + return await lookupSiteInProxy(request, url); default: assertNever(mode); } @@ -362,7 +386,7 @@ async function lookupSpaceForURL( * GITBOOK_MODE=single * When serving a single space, configured using GITBOOK_SPACE_ID and GITBOOK_TOKEN. */ -async function lookupSpaceInSingleMode(url: URL): Promise { +async function lookupSiteInSingleMode(url: URL): Promise { const spaceId = process.env.GITBOOK_SPACE_ID; if (!spaceId) { throw new Error( @@ -386,13 +410,31 @@ async function lookupSpaceInSingleMode(url: URL): Promise { }; } +/** + * GITBOOK_MODE=proxy + * When proxying a site on a different base URL. + */ +async function lookupSiteInProxy(request: NextRequest, url: URL): Promise { + const rawSiteUrl = request.headers.get('x-gitbook-site-url'); + if (!rawSiteUrl) { + throw new Error( + `Missing x-gitbook-site-url header. It should be passed when using GITBOOK_MODE=proxy.`, + ); + } + + const siteUrl = new URL(rawSiteUrl); + siteUrl.pathname = joinPath(siteUrl.pathname, url.pathname); + + return await lookupSiteInMultiMode(request, siteUrl); +} + /** * GITBOOK_MODE=multi * When serving multi spaces based on the current URL. */ -async function lookupSpaceInMultiMode(request: NextRequest, url: URL): Promise { +async function lookupSiteInMultiMode(request: NextRequest, url: URL): Promise { const visitorAuthToken = getVisitorAuthToken(request, url); - const lookup = await lookupSpaceByAPI(url, visitorAuthToken); + const lookup = await lookupSiteByAPI(url, visitorAuthToken); return { ...lookup, ...('basePath' in lookup && visitorAuthToken @@ -557,7 +599,7 @@ async function lookupSiteOrSpaceInMultiIdMode( * GITBOOK_MODE=multi-path * When serving multi spaces with the url passed in the path. */ -async function lookupSpaceInMultiPathMode(request: NextRequest, url: URL): Promise { +async function lookupSiteInMultiPathMode(request: NextRequest, url: URL): Promise { // Skip useless requests if ( url.pathname === '/favicon.ico' || @@ -596,7 +638,7 @@ async function lookupSpaceInMultiPathMode(request: NextRequest, url: URL): Promi const visitorAuthToken = getVisitorAuthToken(request, target); - const lookup = await lookupSpaceByAPI(target, visitorAuthToken); + const lookup = await lookupSiteByAPI(target, visitorAuthToken); if ('error' in lookup) { return lookup; } @@ -632,7 +674,7 @@ async function lookupSpaceInMultiPathMode(request: NextRequest, url: URL): Promi * Lookup a space by its URL using the GitBook API. * To optimize caching, we try multiple lookup alternatives and return the first one that matches. */ -async function lookupSpaceByAPI( +async function lookupSiteByAPI( lookupURL: URL, visitorAuthToken: ReturnType, ): Promise { diff --git a/packages/proxy/.gitignore b/packages/proxy/.gitignore new file mode 100644 index 000000000..849ddff3b --- /dev/null +++ b/packages/proxy/.gitignore @@ -0,0 +1 @@ +dist/ diff --git a/packages/proxy/README.md b/packages/proxy/README.md new file mode 100644 index 000000000..e9e609601 --- /dev/null +++ b/packages/proxy/README.md @@ -0,0 +1,28 @@ +# `@gitbook/proxy` + +Host a GitBook site on your own domain as a subpath. + +## Usage + +```ts +import { proxyToGitBook } from '@gitbook/proxy'; + +const site = proxyToGitBook(event.request, { + site: 'mycompany.gitbook.io/site/', + basePath: '/docs', +}); + +export default { + async fetch(request) { + // If the requst matches the basePath /docs, we serve from GitBook + if (site.match(request)) { + return site.fetch(request); + } + + // Otherwise we do something else. + return new Response('Not found', { + statusCode: 404, + }); + }, +}; +``` diff --git a/packages/proxy/package.json b/packages/proxy/package.json new file mode 100644 index 000000000..6fcee7d5d --- /dev/null +++ b/packages/proxy/package.json @@ -0,0 +1,28 @@ +{ + "name": "@gitbook/proxy", + "description": "Host a GitBook site on your own domain as a subpath", + "version": "0.0.0", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "development": "./src/index.ts", + "default": "./dist/index.js" + } + }, + "dependencies": {}, + "devDependencies": { + "typescript": "^5.5.3" + }, + "scripts": { + "build": "tsc", + "typecheck": "tsc --noEmit", + "clean": "rm -rf ./dist", + "unit": "bun test" + }, + "files": [ + "dist", + "src", + "README.md", + "CHANGELOG.md" + ] +} diff --git a/packages/proxy/src/index.test.ts b/packages/proxy/src/index.test.ts new file mode 100644 index 000000000..b645106e2 --- /dev/null +++ b/packages/proxy/src/index.test.ts @@ -0,0 +1,59 @@ +import { describe, expect, it } from 'bun:test'; +import { proxyToGitBook } from '.'; + +describe('.match', () => { + it('should return true if the request is below the base path', () => { + const site = proxyToGitBook({ site: 'https://org.gitbook.io/example/', basePath: '/docs' }); + expect(site.match('/docs')).toBe(true); + expect(site.match('/docs/')).toBe(true); + expect(site.match('/docs/hello')).toBe(true); + expect(site.match('/docs/hello/world')).toBe(true); + + expect(site.match('/hello/world')).toBe(false); + expect(site.match('/')).toBe(false); + }); +}); + +describe('.request', () => { + it('should compute a proper request for a sub-path', () => { + const site = proxyToGitBook({ site: 'https://org.gitbook.io/example/', basePath: '/docs' }); + const request = new Request('https://example.com/docs/hello/world'); + + const proxiedRequest = site.request(request); + expect(proxiedRequest.url).toBe('https://hosting.gitbook.io/docs/hello/world'); + expect(proxiedRequest.headers.get('Host')).toBe('hosting.gitbook.io'); + expect(proxiedRequest.headers.get('X-Forwarded-Host')).toBe('example.com'); + expect(proxiedRequest.headers.get('X-GitBook-BasePath')).toBe('/docs'); + expect(proxiedRequest.headers.get('X-GitBook-Site-URL')).toBe( + 'https://org.gitbook.io/example/', + ); + }); + + it('should compute a proper request on the root', () => { + const site = proxyToGitBook({ site: 'https://org.gitbook.io/example/', basePath: '/docs' }); + const request = new Request('https://example.com/docs'); + + const proxiedRequest = site.request(request); + expect(proxiedRequest.url).toBe('https://hosting.gitbook.io/docs'); + expect(proxiedRequest.headers.get('Host')).toBe('hosting.gitbook.io'); + expect(proxiedRequest.headers.get('X-Forwarded-Host')).toBe('example.com'); + expect(proxiedRequest.headers.get('X-GitBook-BasePath')).toBe('/docs'); + expect(proxiedRequest.headers.get('X-GitBook-Site-URL')).toBe( + 'https://org.gitbook.io/example/', + ); + }); + + it('should normalize the basepath', () => { + const site = proxyToGitBook({ site: 'https://org.gitbook.io/example/', basePath: 'docs/' }); + const request = new Request('https://example.com/docs/hello/world'); + + const proxiedRequest = site.request(request); + expect(proxiedRequest.url).toBe('https://hosting.gitbook.io/docs/hello/world'); + expect(proxiedRequest.headers.get('Host')).toBe('hosting.gitbook.io'); + expect(proxiedRequest.headers.get('X-Forwarded-Host')).toBe('example.com'); + expect(proxiedRequest.headers.get('X-GitBook-BasePath')).toBe('/docs'); + expect(proxiedRequest.headers.get('X-GitBook-Site-URL')).toBe( + 'https://org.gitbook.io/example/', + ); + }); +}); diff --git a/packages/proxy/src/index.ts b/packages/proxy/src/index.ts new file mode 100644 index 000000000..7d2d50dc0 --- /dev/null +++ b/packages/proxy/src/index.ts @@ -0,0 +1,97 @@ +export interface ProxyToGitBookOptions { + /** + * The URL of the published site. + * @example "https://mycompany.gitbook.io/docs" + */ + site: string; + + /** + * Base path to serve the site on. + * @example "/docs" + */ + basePath: string; + + /** + * Hostname used by GitBook to serve content. + * Do not set this option unless you know what you are doing. + */ + gitbookHost?: string; +} + +export interface ProxySite { + /** + * Test if the request should be proxied to this site. + */ + match(request: Request | string): boolean; + + /** + * Get the proxied request for a given request. + */ + request(request: Request): Request; + + /** + * Fetch the request from the site. + */ + fetch(request: Request): Promise; +} + +/** + * Proxies requests to a GitBook site. + */ +export function proxyToGitBook(options: ProxyToGitBookOptions): ProxySite { + const { gitbookHost = 'hosting.gitbook.io' } = options; + + const siteUrl = new URL(options.site); + const rawSiteUrl = siteUrl.toString(); + + const basePath = normalizeBasePath(options.basePath); + + const site: ProxySite = { + match: (request) => { + const pathname = typeof request === 'string' ? request : new URL(request.url).pathname; + return pathname === basePath || pathname.startsWith(basePath + '/'); + }, + + request: (originRequest) => { + const originUrl = new URL(originRequest.url); + + const url = new URL(originUrl); + url.hostname = gitbookHost; + + const proxyRequest = new Request(url, originRequest); + proxyRequest.headers.set('Host', gitbookHost); + + // Pass the original host and protocol + proxyRequest.headers.set('X-Forwarded-Host', originUrl.hostname); + proxyRequest.headers.set('X-Forwarded-Proto', 'https'); + + // Pass the basepath on the original URL + proxyRequest.headers.set('X-GitBook-BasePath', basePath); + + // Pass the site URL + proxyRequest.headers.set('X-GitBook-Site-URL', rawSiteUrl); + + return proxyRequest; + }, + + fetch: async (originRequest) => { + return fetch(site.request(originRequest)); + }, + }; + + return site; +} + +function normalizeBasePath(basePath: string): string { + let result = withLeadingSlash(basePath); + result = withoutTrailingSlash(result); + return result; +} + +function withLeadingSlash(path: string): string { + return path.startsWith('/') ? path : '/' + path; +} + +function withoutTrailingSlash(path: string): string { + return path.endsWith('/') ? path.slice(0, -1) : path; +} diff --git a/packages/proxy/tsconfig.json b/packages/proxy/tsconfig.json new file mode 100644 index 000000000..aa63c0ef4 --- /dev/null +++ b/packages/proxy/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "target": "esnext", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": false, + "declaration": true, + "outDir": "dist", + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "incremental": true, + "types": [ + "bun-types" // add Bun global + ] + }, + "include": ["src/**/*.ts"], + "exclude": ["node_modules"] +}