Openstatus www.openstatus.dev

fix: checker request body (#739)

authored by

Maximilian Kaske and committed by
GitHub
e3ba32d0 ac3462f5

+34 -5
+1
apps/web/src/app/api/checker/test/route.ts
··· 31 31 if (url === "https://www.openstatus.dev/api/checker/test") { 32 32 return NextResponse.json({ success: true }, { status: 200 }); 33 33 } 34 + 34 35 const res = await checkRegion(url, region, { method, headers, body }); 35 36 36 37 return NextResponse.json(res);
+1 -1
apps/web/src/app/play/checker/[id]/utils.ts
··· 104 104 [key]: value, 105 105 }; 106 106 }, {}), 107 - body: opts?.body, 107 + body: opts?.body ? JSON.parse(opts.body) : undefined, 108 108 }), 109 109 next: { revalidate: 0 }, 110 110 });
+31 -3
apps/web/src/components/forms/monitor/form.tsx
··· 126 126 }); 127 127 }; 128 128 129 - const pingEndpoint = async (region?: MonitorFlyRegion) => { 130 - const { url, body, method, headers, statusAssertions, headerAssertions } = 131 - form.getValues(); 129 + const validateJSON = (value?: string) => { 130 + if (!value) return; 131 + try { 132 + const obj = JSON.parse(value) as Record<string, unknown>; 133 + form.clearErrors("body"); 134 + return obj; 135 + } catch (e) { 136 + form.setError("body", { 137 + message: "Not a valid JSON object", 138 + }); 139 + return false; 140 + } 141 + }; 132 142 143 + const pingEndpoint = async (region?: MonitorFlyRegion) => { 133 144 try { 145 + const { url, body, method, headers, statusAssertions, headerAssertions } = 146 + form.getValues(); 147 + 148 + if (body && body !== "") { 149 + const validJSON = validateJSON(body); 150 + if (!validJSON) { 151 + return { error: "Not a valid JSON object.", data: undefined }; 152 + } 153 + } 154 + 134 155 const res = await fetch(`/api/checker/test`, { 135 156 method: "POST", 136 157 headers: new Headers({ ··· 139 160 body: JSON.stringify({ url, body, method, headers, region }), 140 161 signal: AbortSignal.timeout(ABORT_TIMEOUT), 141 162 }); 163 + 164 + if (!res.ok) { 165 + return { 166 + error: "Something went wrong. Please try again.", 167 + }; 168 + } 142 169 143 170 const as = assertions.deserialize( 144 171 JSON.stringify([ ··· 175 202 176 203 return { data, error: undefined }; 177 204 } catch (error) { 205 + console.error(error); 178 206 if (error instanceof Error && error.name === "AbortError") { 179 207 return { 180 208 error: `Abort error: request takes more then ${formatDuration(
+1 -1
apps/web/src/components/forms/monitor/section-requests.tsx
··· 32 32 } from "@openstatus/ui"; 33 33 34 34 import { SectionHeader } from "../shared/section-header"; 35 - import { RequestTestButton } from "./request-test-button"; 36 35 37 36 interface Props { 38 37 form: UseFormReturn<InsertMonitor>; ··· 207 206 </TooltipProvider> 208 207 </div> 209 208 <FormControl> 209 + {/* FIXME: cannot enter 'Enter' */} 210 210 <Textarea 211 211 rows={8} 212 212 placeholder='{ "hello": "world" }'