cloudflare/vinext

Public

mirrored from https://github.com/cloudflare/vinextAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
v0.0.9

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

tests/fixtures/app-basic/middleware.ts

92lines · modecode

1import { NextRequest, NextResponse } from "next/server";
2
3/**
4 * App Router middleware that uses NextRequest-specific APIs.
5 * This tests that the middleware receives a NextRequest (not a plain Request).
6 *
7 * Also covers OpenNext compat tests (ON-11):
8 * - Redirect with cookie setting
9 * - Rewrite (URL stays, content from another page)
10 * - Rewrite with custom status code
11 * - Block with 403
12 * - Search params forwarding
13 */
14export function middleware(request: NextRequest) {
15 // Test NextRequest.nextUrl - this would fail with TypeError if request is plain Request
16 const { pathname } = request.nextUrl;
17
18 // Test NextRequest.cookies - this would fail with TypeError if request is plain Request
19 const sessionToken = request.cookies.get("session");
20
21 const response = NextResponse.next();
22
23 // Add headers to prove middleware ran and NextRequest APIs worked
24 response.headers.set("x-middleware-pathname", pathname);
25 response.headers.set("x-middleware-ran", "true");
26
27 if (sessionToken) {
28 response.headers.set("x-middleware-has-session", "true");
29 }
30
31 // Redirect /middleware-redirect to /about (with cookie, like OpenNext)
32 // Ref: opennextjs-cloudflare middleware.ts — redirect with set-cookie header
33 if (pathname === "/middleware-redirect") {
34 return NextResponse.redirect(new URL("/about", request.url), {
35 headers: { "set-cookie": "middleware-redirect=success; Path=/" },
36 });
37 }
38
39 // Rewrite /middleware-rewrite to render / content (URL stays the same)
40 // Ref: opennextjs-cloudflare middleware.ts — NextResponse.rewrite
41 if (pathname === "/middleware-rewrite") {
42 return NextResponse.rewrite(new URL("/", request.url));
43 }
44
45 // Rewrite with custom status code
46 // Ref: opennextjs-cloudflare middleware.ts — NextResponse.rewrite with status
47 if (pathname === "/middleware-rewrite-status") {
48 return NextResponse.rewrite(new URL("/", request.url), {
49 status: 403,
50 });
51 }
52
53 // Block /middleware-blocked with custom response
54 if (pathname === "/middleware-blocked") {
55 return new Response("Blocked by middleware", { status: 403 });
56 }
57
58 // Throw an error to test that middleware errors return 500, not bypass auth
59 if (pathname === "/middleware-throw") {
60 throw new Error("middleware crash");
61 }
62
63 // Forward search params as a header for RSC testing
64 // Ref: opennextjs-cloudflare middleware.ts — search-params header
65 const requestHeaders = new Headers(request.headers);
66 requestHeaders.set(
67 "x-search-params",
68 `mw/${request.nextUrl.searchParams.get("searchParams") || ""}`,
69 );
70 const r = NextResponse.next({
71 request: { headers: requestHeaders },
72 });
73 r.headers.set("x-middleware-pathname", pathname);
74 r.headers.set("x-middleware-ran", "true");
75 if (sessionToken) {
76 r.headers.set("x-middleware-has-session", "true");
77 }
78 return r;
79}
80
81export const config = {
82 matcher: [
83 "/about",
84 "/middleware-redirect",
85 "/middleware-rewrite",
86 "/middleware-rewrite-status",
87 "/middleware-blocked",
88 "/middleware-throw",
89 "/search-query",
90 "/",
91 ],
92};
93