@@ -37,6 +37,7 @@ import * as HttpRouter from "./HttpRouter.js"
3737import * as HttpServer from "./HttpServer.js"
3838import * as HttpServerRequest from "./HttpServerRequest.js"
3939import * as HttpServerResponse from "./HttpServerResponse.js"
40+ import * as Multipart from "./Multipart.js"
4041import * as OpenApi from "./OpenApi.js"
4142import type { Path } from "./Path.js"
4243import * as UrlParams from "./UrlParams.js"
@@ -525,7 +526,8 @@ export const handler = <
525526
526527const requestPayload = (
527528 request : HttpServerRequest . HttpServerRequest ,
528- urlParams : ReadonlyRecord < string , string | Array < string > >
529+ urlParams : ReadonlyRecord < string , string | Array < string > > ,
530+ multipartLimits : Option . Option < Multipart . withLimits . Options >
529531) : Effect . Effect <
530532 unknown ,
531533 never ,
@@ -542,7 +544,10 @@ const requestPayload = (
542544 if ( contentType . includes ( "application/json" ) ) {
543545 return Effect . orDie ( request . json )
544546 } else if ( contentType . includes ( "multipart/form-data" ) ) {
545- return Effect . orDie ( request . multipart )
547+ return Effect . orDie ( Option . match ( multipartLimits , {
548+ onNone : ( ) => request . multipart ,
549+ onSome : ( limits ) => Multipart . withLimits ( request . multipart , limits )
550+ } ) )
546551 } else if ( contentType . includes ( "x-www-form-urlencoded" ) ) {
547552 return Effect . map ( Effect . orDie ( request . urlParamsBody ) , UrlParams . toRecord )
548553 } else if ( contentType . startsWith ( "text/" ) ) {
@@ -628,9 +633,12 @@ const handlerToRoute = (
628633) : HttpRouter . Route < any , any > => {
629634 const endpoint = endpoint_ as HttpApiEndpoint . HttpApiEndpoint . AnyWithProps
630635 const isMultipartStream = endpoint . payloadSchema . pipe (
631- Option . map ( ( { ast } ) => HttpApiSchema . getMultipartStream ( ast ) ) ,
636+ Option . map ( ( { ast } ) => HttpApiSchema . getMultipartStream ( ast ) !== undefined ) ,
632637 Option . getOrElse ( constFalse )
633638 )
639+ const multipartLimits = endpoint . payloadSchema . pipe (
640+ Option . flatMapNullable ( ( { ast } ) => HttpApiSchema . getMultipart ( ast ) || HttpApiSchema . getMultipartStream ( ast ) )
641+ )
634642 const decodePath = Option . map ( endpoint . pathSchema , Schema . decodeUnknown )
635643 const decodePayload = isFullRequest || isMultipartStream
636644 ? Option . none ( )
@@ -654,11 +662,14 @@ const handlerToRoute = (
654662 }
655663 if ( decodePayload . _tag === "Some" ) {
656664 request . payload = yield * Effect . flatMap (
657- requestPayload ( httpRequest , urlParams ) ,
665+ requestPayload ( httpRequest , urlParams , multipartLimits ) ,
658666 decodePayload . value
659667 )
660668 } else if ( isMultipartStream ) {
661- request . payload = httpRequest . multipartStream
669+ request . payload = Option . match ( multipartLimits , {
670+ onNone : ( ) => httpRequest . multipartStream ,
671+ onSome : ( limits ) => Multipart . withLimitsStream ( httpRequest . multipartStream , limits )
672+ } )
662673 }
663674 if ( decodeHeaders . _tag === "Some" ) {
664675 request . headers = yield * decodeHeaders . value ( httpRequest . headers )
0 commit comments