smocker-dev / smocker

Smocker is a simple and efficient HTTP mock server and proxy
https://smocker.dev
MIT License
1.16k stars 61 forks source link

Ability to offload large payloads with dynamic_response scripts #310

Open gautaz opened 2 weeks ago

gautaz commented 2 weeks ago

Hello,

First things first, smocker is dead simple to start with, keep up the good work!

Lately, I wanted to avoid putting a large piece of JSON directly in a mock definition so I tried to offload it to another file and read it from a Lua's script this way (I am not fluent in Lua by the way):

- request:
    method: GET
    path: /data/666
  dynamic_response:
    engine: lua
    script: >
      local io = require("io")
      local file = io.open("/data/666.json", "rb")
      if not file then return nil end
      local content = file:read "*a"
      file:close()
      return {
        body = content,
        headers = {
          ["Content-Type"] = {"application/json"}
        }
      }

But this fails because it cannot find io (whether I put a require or not).

At first I was wondering if GopherLua even supported file operations but this issue seems to confirm that this is the case.

May anyone shed some light on this particular point?

Thiht commented 2 days ago

Hi! I explicitly disabled the io package, because allowing it would make Smocker's behaviour less predictable: the only way to define mocks is using the API, you can't use files already present on the disk.

There's a real use-case for large files and binary files though, and I'm thinking of a way to allow multipart mock declarations in the future to allow it. In the case of the Lua engine, the files would be injected directly into the Lua context so the io module still wouldn't be needed.

gautaz commented 2 days ago

Hello @Thiht,

Thanks for the details, I totally understand the "less predictable" argument. Is there any other issue tracing this need so we might close this one in favor of and add a link to the right issue?