diff --git a/packages/aws/src/services/lambdaserver.spec.ts b/packages/aws/src/services/lambdaserver.spec.ts index 496ca4061..213429a04 100644 --- a/packages/aws/src/services/lambdaserver.spec.ts +++ b/packages/aws/src/services/lambdaserver.spec.ts @@ -99,6 +99,24 @@ class LambdaHandlerTest extends WebdaAwsTest { assert.strictEqual(res.statusCode, 403); } + @test + async checkRequestRedirect() { + await this.handler.init(); + // @ts-ignore + this.handler._requestFilters = []; + this.ensureGoodCSRF(); + this.evt.queryStringParameters = { test: "Plop" }; + this.handler.registerRequestFilter({ + checkRequest: async () => { + throw new WebdaError.Redirect("Need Auth", "https://google.com") + } + }); + let res = await this.handler.handleRequest(this.evt, this.context); + assert.strictEqual(res.statusCode, 302); + console.log(res); + assert.strictEqual(res.headers.Location, "https://google.com"); + } + @test async handleRequestCustomLaunch() { await this.handler.handleRequest( @@ -313,7 +331,8 @@ class LambdaHandlerTest extends WebdaAwsTest { let res = await this.handler.handleRequest(this.evt, this.context); assert.strictEqual(res.statusCode, 410); this.badCheck = true; - await assert.rejects(() => this.handler.handleRequest(this.evt, this.context), /Unknown/); + res = await this.handler.handleRequest(this.evt, this.context); + assert.strictEqual(res.statusCode, 500); this.newExcept = true; res = await this.handler.handleRequest(this.evt, this.context); assert.strictEqual(res.statusCode, 429); diff --git a/packages/aws/src/services/lambdaserver.ts b/packages/aws/src/services/lambdaserver.ts index c2a8897e4..cf1746f4f 100644 --- a/packages/aws/src/services/lambdaserver.ts +++ b/packages/aws/src/services/lambdaserver.ts @@ -221,17 +221,7 @@ export default class LambdaServer extends Webda { this.log("WARN", "Request refused"); throw 403; } - } catch (err) { - if (typeof err === "number") { - ctx.statusCode = err; - return this.handleLambdaReturn(ctx); - } else if (err instanceof WebdaError.HttpError) { - ctx.statusCode = err.getResponseCode(); - this.log("TRACE", `${err.getResponseCode()}: ${err.message}`); - return this.handleLambdaReturn(ctx); - } - throw err; - } + if (protocol === "https") { // Add the HSTS header ctx.setHeader("Strict-Transport-Security", "max-age=31536000; includeSubDomains; preload"); @@ -258,7 +248,7 @@ export default class LambdaServer extends Webda { return this.handleLambdaReturn(ctx); } await ctx.init(); - try { + await ctx.execute(); return this.handleLambdaReturn(ctx); } catch (err) { @@ -267,6 +257,10 @@ export default class LambdaServer extends Webda { } else if (err instanceof WebdaError.HttpError) { this.log("DEBUG", "Sending error", err.message); ctx.statusCode = err.getResponseCode(); + // Handle redirect + if (err instanceof WebdaError.Redirect) { + ctx.setHeader("Location", err.location); + } } else { this.log("ERROR", err); ctx.statusCode = 500; diff --git a/packages/shell/src/handlers/http.spec.ts b/packages/shell/src/handlers/http.spec.ts index b84f9b181..e3ca959e5 100644 --- a/packages/shell/src/handlers/http.spec.ts +++ b/packages/shell/src/handlers/http.spec.ts @@ -1,5 +1,5 @@ import { suite, test } from "@testdeck/mocha"; -import { HttpContext, ResourceService } from "@webda/core"; +import { HttpContext, ResourceService, WebdaError } from "@webda/core"; import * as assert from "assert"; import * as http from "http"; import { createChecker } from "is-in-subnet"; @@ -99,6 +99,16 @@ class WebdaServerTest { headers: { origin: "bouzouf", "x-forwarded-port": "443" } }); assert.strictEqual(res.status, 404); + stub.callsFake(() => { + throw new WebdaError.Redirect("Need Auth", "https://google.com") + }) + res = await fetch(`http://localhost:${this.port}/test`, { + headers: { origin: "bouzouf", "x-forwarded-port": "443" }, + redirect: "manual" + }); + assert.strictEqual(res.status, 302); + assert.strictEqual(res.headers.get("Location"), "https://google.com/"); + stub.callsFake(() => { throw new Error(); }); @@ -124,6 +134,10 @@ class WebdaServerTest { headers: { origin: "bouzouf", "x-forwarded-port": "443" } }); assert.strictEqual(res.status, 500); + res = await fetch(`http://localhost:${this.port}/test`, { + headers: { origin: "bouzouf", "x-forwarded-port": "443" } + }); + stub.restore(); diff --git a/packages/shell/src/handlers/http.ts b/packages/shell/src/handlers/http.ts index 9601834e5..a3e09a8c5 100644 --- a/packages/shell/src/handlers/http.ts +++ b/packages/shell/src/handlers/http.ts @@ -204,6 +204,10 @@ export class WebdaServer extends Webda { err = typeof err === "number" ? new WebdaError.HttpError("Wrapped", err) : err; if (err instanceof WebdaError.HttpError) { ctx.statusCode = err.getResponseCode(); + // Handle redirect + if (err instanceof WebdaError.Redirect) { + ctx.setHeader("Location", err.location); + } this.log("TRACE", `${err.getResponseCode()}: ${err.message}`); } else { ctx.statusCode = 500;