diff --git a/src/node/plugin.ts b/src/node/plugin.ts index 70220103..07998100 100644 --- a/src/node/plugin.ts +++ b/src/node/plugin.ts @@ -4,6 +4,7 @@ import * as fs from "fs" import * as path from "path" import * as semver from "semver" import * as pluginapi from "../../typings/pluginapi" +import { HttpCode, HttpError } from "../common/http" import { version } from "./constants" import { replaceTemplates } from "./http" import { proxy } from "./proxy" @@ -22,6 +23,8 @@ require("module")._load = function (request: string, parent: object, isMain: boo return { express, field, + HttpCode, + HttpError, Level, proxy, replaceTemplates, diff --git a/test/plugin.test.ts b/test/plugin.test.ts index 139885da..b5bfb763 100644 --- a/test/plugin.test.ts +++ b/test/plugin.test.ts @@ -2,6 +2,7 @@ import { logger } from "@coder/logger" import * as express from "express" import * as fs from "fs" import * as path from "path" +import { HttpCode } from "../src/common/http" import { PluginAPI } from "../src/node/plugin" import * as apps from "../src/node/routes/apps" import * as httpserver from "./httpserver" @@ -81,4 +82,9 @@ describe("plugin", () => { ws.terminate() expect(message).toBe("hello") }) + + it("/test-plugin/error", async () => { + const resp = await s.fetch("/test-plugin/error") + expect(resp.status).toBe(HttpCode.LargePayload) + }) }) diff --git a/test/test-plugin/src/index.ts b/test/test-plugin/src/index.ts index 211ddf0d..592ad372 100644 --- a/test/test-plugin/src/index.ts +++ b/test/test-plugin/src/index.ts @@ -19,6 +19,9 @@ export const plugin: cs.Plugin = { r.get("/goland/icon.svg", (_, res) => { res.sendFile(fspath.resolve(__dirname, "../public/icon.svg")) }) + r.get("/error", () => { + throw new cs.HttpError("error", cs.HttpCode.LargePayload) + }) return r }, diff --git a/typings/pluginapi.d.ts b/typings/pluginapi.d.ts index fbac3af9..383bf962 100644 --- a/typings/pluginapi.d.ts +++ b/typings/pluginapi.d.ts @@ -82,6 +82,20 @@ import Websocket from "ws" * ] */ +export enum HttpCode { + Ok = 200, + Redirect = 302, + NotFound = 404, + BadRequest = 400, + Unauthorized = 401, + LargePayload = 413, + ServerError = 500, +} + +export declare class HttpError extends Error { + constructor(message: string, status: HttpCode, details?: object) +} + export interface WebsocketRequest extends express.Request { ws: net.Socket head: Buffer