@@ -7,19 +7,19 @@ import {
77} from 'aws-lambda' ;
88import mime from 'mime' ;
99import { InternalResources } from './resources/index' ;
10+ import { resolveError , resolveUri } from './utils/api' ;
1011import { getResource , listResources } from './utils/data/repositories/ResourceRepository' ;
11- import { cutTooLongString , generateSimpleHash } from './utils/helpers' ;
12+ import { cutTooLongString , decodeBase64 , generateSimpleHash , parseRequestInputParams } from './utils/helpers' ;
1213import { storeToS3 } from './utils/lib/S3Bucket' ;
1314import { Environment , getInternalResourceInfo } from './utils/runtime' ;
1415
1516async function engageResourcesRouter (
1617 resourceURI : string ,
17- queryParams : string
18+ params : Record < string , string >
1819) : Promise < {
1920 response : CloudFrontResultResponse | undefined ;
2021 cacheable ?: { filepath : string ; data : string ; mime : string } ;
2122} > {
22- const urlParams = Object . fromEntries ( new URLSearchParams ( queryParams || '' ) ) ;
2323 const resourceName = resourceURI . replace ( '/resources' , '' ) . replace ( '/' , '' ) ; // First occurence of "/" is removed
2424 if ( ! resourceName ) {
2525 // On a requets path /resources, return a list of resources
@@ -35,15 +35,15 @@ async function engageResourcesRouter(
3535 const resource = getResource ( resourceName ) ;
3636 if ( resource ) {
3737 console . log ( 'Resource: ' , resource . name ) ;
38- const resourceResponse = await resource . retrieve ( urlParams ) ;
38+ const resourceResponse = await resource . retrieve ( params ) ;
3939
4040 // If resource size is larger than 1MB, store it in S3 and redirect to it instead
4141 // This is a workaround to avoid CloudFront cache limit
4242 // @see : https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/edge-functions-restrictions.html#lambda-at-edge-function-restrictions
4343 console . log ( 'Size: ' , resourceResponse . size , 'bytes' ) ;
4444 if ( resourceResponse . size > 1024 * 1024 ) {
4545 const extension = mime . getExtension ( resourceResponse . mime ) ;
46- const cachedName = `/cached/${ resource . name } -${ generateSimpleHash ( urlParams ) } .${ extension } ` ;
46+ const cachedName = `/cached/${ resource . name } -${ generateSimpleHash ( params ) } .${ extension } ` ;
4747
4848 return {
4949 response : undefined ,
@@ -96,15 +96,26 @@ async function engageResourcesRouter(
9696export async function handler ( event : CloudFrontRequestEvent ) : Promise < CloudFrontRequestResult > {
9797 try {
9898 const request = event . Records [ 0 ] . cf . request ;
99- let uri = request . uri ;
100- const queryParams = request . querystring ;
99+ let uri = resolveUri ( request . uri ) ;
100+ const params = Object . fromEntries ( new URLSearchParams ( request . querystring || '' ) ) ;
101+ if ( request . method === 'POST' && typeof request . body ?. data === 'string' ) {
102+ try {
103+ const body = JSON . parse ( decodeBase64 ( request . body . data ) ) ;
104+ if ( typeof body === 'object' ) {
105+ Object . assign ( params , parseRequestInputParams ( body ) ) ;
106+ }
107+ } catch ( error ) {
108+ //
109+ }
110+ }
111+
101112 console . log ( 'Request: ' , {
102113 uri,
103- queryParams ,
114+ params ,
104115 } ) ;
105116
106117 if ( uri . startsWith ( '/resources' ) ) {
107- const routerResponse = await engageResourcesRouter ( uri , queryParams ) ;
118+ const routerResponse = await engageResourcesRouter ( uri , params ) ;
108119 if ( routerResponse . response ) {
109120 console . log ( 'Response: ' , {
110121 ...routerResponse . response ,
@@ -130,14 +141,30 @@ export async function handler(event: CloudFrontRequestEvent): Promise<CloudFront
130141 }
131142 }
132143
144+ if ( request . method === 'POST' ) {
145+ // If the request is POST, we need to use a redirect for the cache to work
146+ return {
147+ status : '302' ,
148+ statusDescription : 'Found' ,
149+ headers : {
150+ location : [
151+ {
152+ key : 'Location' ,
153+ value : uri ,
154+ } ,
155+ ] ,
156+ } ,
157+ } ;
158+ }
159+
133160 request . uri = uri ; // Pass through to origin
134161 return request ;
135162 } catch ( error : any ) {
136- console . log ( error ?. message , error ?. stack ) ;
163+ const errorPackage = resolveError ( error ) ;
137164 return {
138- status : '500' ,
139- statusDescription : 'Internal Server Error' ,
140- body : JSON . stringify ( { message : error ?. message } ) ,
165+ status : errorPackage . statusCode . toString ( ) ,
166+ statusDescription : errorPackage . description ,
167+ body : errorPackage . body ,
141168 } ;
142169 }
143170}
@@ -153,15 +180,26 @@ export async function offlineHandler(event: APIGatewayProxyEventV2): Promise<API
153180 Environment . isLocal = true ;
154181
155182 const handle = async ( event : APIGatewayProxyEventV2 ) => {
156- let uri = event . rawPath ;
157- const queryParams = event . rawQueryString ;
183+ let uri = resolveUri ( event . rawPath ) ;
184+ const params = Object . fromEntries ( new URLSearchParams ( event . rawQueryString || '' ) ) ;
185+ if ( event . requestContext . http . method === 'POST' ) {
186+ try {
187+ const body = JSON . parse ( event . body || '{}' ) ;
188+ if ( typeof body === 'object' ) {
189+ Object . assign ( params , parseRequestInputParams ( body ) ) ;
190+ }
191+ } catch ( error ) {
192+ //
193+ }
194+ }
195+
158196 console . log ( 'Request: ' , {
159197 uri,
160- queryParams ,
198+ params ,
161199 } ) ;
162200
163201 if ( uri . startsWith ( '/resources' ) ) {
164- const routerResponse : any = await engageResourcesRouter ( uri , queryParams ) ;
202+ const routerResponse : any = await engageResourcesRouter ( uri , params ) ;
165203 if ( routerResponse . response ) {
166204 return {
167205 statusCode : parseInt ( routerResponse . response . status ) ,
@@ -209,10 +247,6 @@ export async function offlineHandler(event: APIGatewayProxyEventV2): Promise<API
209247
210248 return await Promise . race ( [ handle ( event ) , internalTimeoutEnforcer ( ) as any ] ) ; // Return the first to resolve
211249 } catch ( error : any ) {
212- console . log ( error ?. message , error ?. stack ) ;
213- return {
214- statusCode : 500 ,
215- body : JSON . stringify ( { message : error ?. message } ) ,
216- } ;
250+ return resolveError ( error ) ;
217251 }
218252}
0 commit comments