testinggospels / camouflage

Camouflage is a backend mocking tool for HTTP, gRPC, Websockets and Thrift protocols, which helps you carry out your front end prototyping, unit testing, functional/performance testing in silos, in absence of one or more Microservices/APIs.
https://testinggospels.github.io/camouflage/
MIT License
270 stars 26 forks source link

`express.text()` middleware overrides other content types #232

Closed cat-ninja closed 1 year ago

cat-ninja commented 1 year ago

Describe the bug While trying to integrate a middleware for requests with multipart/form-data content type I kept seeing PayloadTooLargeError: request entity too large error coming from express despite it had multer middleware installed and configured to accept files of any size.

Here is the stack trace:

PayloadTooLargeError: request entity too large
    at readStream (/Users/test/.nvm/versions/node/v20.2.0/lib/node_modules/camouflage-server/node_modules/raw-body/index.js:156:17)
    at getRawBody (/Users/test/.nvm/versions/node/v20.2.0/lib/node_modules/camouflage-server/node_modules/raw-body/index.js:109:12)
    at read (/Users/test/.nvm/versions/node/v20.2.0/lib/node_modules/camouflage-server/node_modules/body-parser/lib/read.js:79:3)
    at textParser (/Users/test/.nvm/versions/node/v20.2.0/lib/node_modules/camouflage-server/node_modules/body-parser/lib/types/text.js:86:5)
    at Layer.handle [as handle_request] (/Users/test/.nvm/versions/node/v20.2.0/lib/node_modules/camouflage-server/node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (/Users/test/.nvm/versions/node/v20.2.0/lib/node_modules/camouflage-server/node_modules/express/lib/router/index.js:328:13)
    at /Users/test/.nvm/versions/node/v20.2.0/lib/node_modules/camouflage-server/node_modules/express/lib/router/index.js:286:9
    at Function.process_params (/Users/test/.nvm/versions/node/v20.2.0/lib/node_modules/camouflage-server/node_modules/express/lib/router/index.js:346:12)
    at next (/Users/test/.nvm/versions/node/v20.2.0/lib/node_modules/camouflage-server/node_modules/express/lib/router/index.js:280:10)
    at urlencodedParser (/Users/test/.nvm/versions/node/v20.2.0/lib/node_modules/camouflage-server/node_modules/body-parser/lib/types/urlencoded.js:100:7)
    at Layer.handle [as handle_request] (/Users/test/.nvm/versions/node/v20.2.0/lib/node_modules/camouflage-server/node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (/Users/test/.nvm/versions/node/v20.2.0/lib/node_modules/camouflage-server/node_modules/express/lib/router/index.js:328:13)
    at /Users/test/.nvm/versions/node/v20.2.0/lib/node_modules/camouflage-server/node_modules/express/lib/router/index.js:286:9
    at Function.process_params (/Users/test/.nvm/versions/node/v20.2.0/lib/node_modules/camouflage-server/node_modules/express/lib/router/index.js:346:12)
    at next (/Users/test/.nvm/versions/node/v20.2.0/lib/node_modules/camouflage-server/node_modules/express/lib/router/index.js:280:10)
    at jsonParser (/Users/test/.nvm/versions/node/v20.2.0/lib/node_modules/camouflage-server/node_modules/body-parser/lib/types/json.js:119:7)

At the 4th line from the top I noticed the error is coming from textParser, which, I assume, is called internally by the text() middleware. Going trough the sources I noticed that type configuration for the text middleware is configured to return true by default. So right now this middleware will be responsible for processing everything that is not application/json or application/x-www-form-urlencoded.

I see two possible solutions here:

  1. Change the type to a wildcard such as text/*, so it wont override any other content types middlewares.
  2. Add a limit option to the text middleware with some size (ie limit: '100mb') so it'll be possible to accept relatively big files.

@shubhendumadhukar what do you think?

To Reproduce Steps to reproduce the behavior:

  1. Create a POST mock that'll return anything
    
    HTTP/1.1 200 OK
    Content-Type: application/json

{}


2. Create a GET mock with content

HTTP/1.1 200 OK Content-Type: text/html



3. Open the url of your GET mock in the browser and try to upload a file bigger than 100kb
4. Check the camouflage logs
cat-ninja commented 1 year ago

@shubhendumadhukar do you feel comfortable switching the text middleware config to a wildcard? I can prepare a PR.

shubhendumadhukar commented 1 year ago

Sure, go ahead. I was actually looking into ways to make it a configurable input, but haven't been able to give it much thought.

cat-ninja commented 1 year ago

https://github.com/testinggospels/camouflage/pull/234

github-actions[bot] commented 1 year ago

:tada: This issue has been resolved in version 0.14.3 :tada:

The release is available on:

Your semantic-release bot :package::rocket: