| 542 | // internal |
| 543 | |
| 544 | const requestPayload = ( |
| 545 | request: HttpServerRequest.HttpServerRequest, |
| 546 | urlParams: ReadonlyRecord<string, string | Array<string>>, |
| 547 | multipartLimits: Option.Option<Multipart.withLimits.Options> |
| 548 | ): Effect.Effect< |
| 549 | unknown, |
| 550 | never, |
| 551 | | FileSystem |
| 552 | | Path |
| 553 | | Scope |
| 554 | > => { |
| 555 | if (!HttpMethod.hasBody(request.method)) { |
| 556 | return Effect.succeed(urlParams) |
| 557 | } |
| 558 | const contentType = request.headers["content-type"] |
| 559 | ? request.headers["content-type"].toLowerCase().trim() |
| 560 | : "application/json" |
| 561 | if (contentType.includes("application/json")) { |
| 562 | return Effect.orDie(request.json) |
| 563 | } else if (contentType.includes("multipart/form-data")) { |
| 564 | return Effect.orDie(Option.match(multipartLimits, { |
| 565 | onNone: () => request.multipart, |
| 566 | onSome: (limits) => Multipart.withLimits(request.multipart, limits) |
| 567 | })) |
| 568 | } else if (contentType.includes("x-www-form-urlencoded")) { |
| 569 | return Effect.map(Effect.orDie(request.urlParamsBody), UrlParams.toRecord) |
| 570 | } else if (contentType.startsWith("text/")) { |
| 571 | return Effect.orDie(request.text) |
| 572 | } |
| 573 | return Effect.map(Effect.orDie(request.arrayBuffer), (buffer) => new Uint8Array(buffer)) |
| 574 | } |
| 575 | |
| 576 | type MiddlewareMap = Map<string, { |
| 577 | readonly tag: HttpApiMiddleware.TagClassAny |