apimastery / APISimulator

API Simulator - configuration-driven tool for modeling and running of API simulations
https://apisimulator.io
3 stars 1 forks source link

Unable to reach host specified in callback #13

Closed x80486 closed 2 years ago

x80486 commented 2 years ago

I have a simulation that looks very much like this:

---
simlet: create-character

# ...parameters
character_id:
  from: uuid
  is: parameter

request:
  - header: accept
    equals: application/json
  - header: content-type
    equals: application/json
  - method: POST
  - uriPath: /api/characters

response:
  callback: # https://apisimulator.io/docs/latest/standalone-api-simulator/callback.html
    latency:
      random:
        max: 1000
        min: 250
      timeUnit: milliseconds
    http1:
      body:
        text: |-
          {
            "subscriber_id": ${character_id}
            # ...why we cannot read from JSON request body 😭
          }
        type: text
      from: template
      headers:
        - name: accept
          value: application/json
        - name: content-type
          value: application/json
      method: POST
      template: Simula
      uri:
        host: https://api-simulator.free.beeceptor.com
        path: /api/v1/subscriptions
        scheme: https
  from: template
  headers:
    - name: location
      value: ${_request.uri.path.value}/${character_id}
  status: 201
  template: Simula

This fails with the following error message:

2021-10-06T01:56:49.368+0000|INFO|11|main|[+--------------------------+]
2021-10-06T01:56:49.371+0000|INFO|11|main|[| A P I  S i m u l a t o r |]
2021-10-06T01:56:49.371+0000|INFO|11|main|[+--------------------------+]
2021-10-06T01:56:49.373+0000|INFO|11|main|[API Simulator initialization in progress...]
2021-10-06T01:56:49.374+0000|INFO|11|main|[API Simulator: {java version:"11.0.10+9", jvm name:"OpenJDK 64-Bit Server VM", jvm version:"11.0.10+9", jvm pid:11}]
2021-10-06T01:56:49.374+0000|INFO|11|main|[API Simulator: implementation {title:"API Simulator",version:"1.9"}]
2021-10-06T01:56:49.374+0000|INFO|11|main|[API Simulator: args=[-c, /apisimulator/apisimulator-http-1.9/config, -s, /home/apisimulator/simulations/simlets, /home/apisimulator/simulations, -retain_dsl_models]]
2021-10-06T01:56:49.387+0000|INFO|11|main|[Loading configuration from '/apisimulator/apisimulator-http-1.9/config/apisim.yaml'...]
2021-10-06T01:56:49.427+0000|INFO|11|main|[Loaded admin configuration]
2021-10-06T01:56:49.434+0000|INFO|11|main|[Loaded simulator configuration]
2021-10-06T01:56:49.438+0000|INFO|11|main|[Loaded simulation configuration]
2021-10-06T01:56:49.468+0000|INFO|11|main|[Loaded 2 simlets in 81 ms]
2021-10-06T01:56:49.469+0000|INFO|11|main|[Loading simlets from '/home/apisimulator/simulations/simlets'...]
2021-10-06T01:56:49.948+0000|INFO|11|main|[Loaded 2 simlets in 478 ms]
2021-10-06T01:56:50.402+0000|INFO|11|API-Simulator-Boss-1-1|[API Simulator Server is listening on 0.0.0.0:6090]
2021-10-06T01:56:50.403+0000|INFO|11|main|[API Simulator started]
2021-10-06T01:56:50.438+0000|INFO|11|AdminServer-Boss-6-1|[Admin HTTP Server is listening on 0.0.0.0:6190]
2021-10-06T01:56:57.446+0000|ERROR|11|API-Simlet-3-1|[com.apisimulator.callback.HttpCallbackExecutor.submit(HttpClient, HttpCallbackSpec, HttpRequest): got an exception: com.apisimulator.http.client.HttpClientException: com.apisimulator.http.client.HttpClientException: com.apisimulator.http.netty.HttpClientBase.bootstrapAndConnect(ChannelHandler channelInitializer): Connecting to https://api-simulator.free.beeceptor.com:443 failed: java.net.UnknownHostException: https://api-simulator.free.beeceptor.com: Name or service not known]

A cURL request to the same URI succeeds:

curl --header "accept: application/json" --header "content-type: application/json" --request POST https://api-simulator.free.beeceptor.com/api/v1/subscriptions | jq 
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    16    0    16    0     0      6      0 --:--:--  0:00:02 --:--:--     6
{
  "ok": true
}

You can verify the requests by going to: https://beeceptor.com/console/api-simulator — before start sending them.

x80486 commented 2 years ago

OK, it works if https:// is removed from response.callback.http1.uri.host 😅

Not sure if this is something you might want to explicitly state in the documentation, accept the protocol as part of the hostname, or fail the simlet when it loads because of that 🤔

apisim commented 2 years ago

The documentation for host states that "Host can be a DNS name or an IP address".

It may be hard to predict all possible misconfigurations (e.g. appending a port number as well)...but I can understand how some checks can improve the experience by failing with a descriptive message at startup-time instead of run-time.

apisim commented 2 years ago

This enhancement was included in the just released v1.10.

Give it a try when you get a chance, @x80486. Thanks!

x80486 commented 2 years ago

Great! Now it's much better!

2022-03-21T01:57:43.635+0000|INFO|10|main|[+--------------------------+]
2022-03-21T01:57:43.636+0000|INFO|10|main|[| A P I  S i m u l a t o r |]
2022-03-21T01:57:43.636+0000|INFO|10|main|[+--------------------------+]
2022-03-21T01:57:43.639+0000|INFO|10|main|[API Simulator initialization in progress...]
2022-03-21T01:57:43.639+0000|INFO|10|main|[API Simulator: {java version:"11.0.14.1+1", jvm name:"OpenJDK 64-Bit Server VM", jvm version:"11.0.14.1+1", jvm pid:10}]
2022-03-21T01:57:43.640+0000|INFO|10|main|[API Simulator: implementation {title:"API Simulator",version:"1.10"}]
2022-03-21T01:57:43.640+0000|INFO|10|main|[API Simulator: args=[-c, /apisimulator/apisimulator-http-1.10/config, -s, /home/apisimulator/simulations/simlets, /home/apisimulator/simulations, -retain_dsl_models]]
2022-03-21T01:57:43.655+0000|INFO|10|main|[Loading configuration from '/apisimulator/apisimulator-http-1.10/config/apisim.yaml'...]
2022-03-21T01:57:43.689+0000|INFO|10|main|[Loaded admin configuration]
2022-03-21T01:57:43.693+0000|INFO|10|main|[Loaded simulator configuration]
2022-03-21T01:57:43.696+0000|INFO|10|main|[Loaded simulation configuration]
2022-03-21T01:57:43.726+0000|INFO|10|main|[Loaded 2 simlets in 71 ms]
2022-03-21T01:57:43.728+0000|INFO|10|main|[Loading simlets from '/home/apisimulator/simulations/simlets'...]
2022-03-21T01:57:44.306+0000|ERROR|10|main|[com.apisimulator.http.dsl.HttpSimletDsl.deserialize(DeserializerContext, DslConfig): java.lang.IllegalArgumentException: The URI's host shall not contain scheme or port number. host='https://api-simulator.free.beeceptor.com']
Exception in thread "main" 2022-03-21T01:57:44.306+0000|INFO|10|main|[Loaded 1 simlet in 578 ms]
java.lang.IllegalArgumentException: The URI's host shall not contain scheme or port number. host='https://api-simulator.free.beeceptor.com'
    at com.apisimulator.http.dsl.callback.HttpCallbackDsl.deserialize(Unknown Source)
    at com.apisimulator.http.dsl.callback.Http1CallbackDsl.deserialize(Unknown Source)
    at com.apisimulator.http.dsl.callback.HttpCallbackDispatcher.deserialize(Unknown Source)
    at com.apisimulator.http.dsl.response.HttpResponseDsl.processResponseConfig(Unknown Source)
    at com.apisimulator.http.dsl.response.HttpResponseDsl.processAllResponsesConfig(Unknown Source)
    at com.apisimulator.http.dsl.response.HttpResponseDsl.deserialize(Unknown Source)
    at com.apisimulator.dsl.ConfigurableDslDeserializer.driveMapDeserialization(Unknown Source)
    at com.apisimulator.dsl.ConfigurableDslDeserializer.processObject(Unknown Source)
    at com.apisimulator.dsl.ConfigurableDslDeserializer.deserialize(Unknown Source)
    at com.apisimulator.http.dsl.HttpSimletDsl.deserialize(Unknown Source)
    at com.apisimulator.config.HttpSimletDslMapDeserializer.doDeserialize(Unknown Source)
    at com.apisimulator.dsl.DslConfigMapDeserializerBase.deserialize(Unknown Source)
    at com.apisimulator.http.dsl.HttpSimletDslConfigLoaderBase.loadFromStream(Unknown Source)
    at com.apisimulator.http.dsl.HttpSimletDslConfigLoaderBase.loadFromFile(Unknown Source)
    at com.apisimulator.config.HttpSimletPerFileLoader$1.process(Unknown Source)
    at com.apisimulator.io.DirectoryTreeWalker.walk(Unknown Source)
    at com.apisimulator.io.DirectoryTreeWalker.walk(Unknown Source)
    at com.apisimulator.io.DirectoryTreeWalker.walk(Unknown Source)
    at com.apisimulator.io.DirectoryTreeWalker.walk(Unknown Source)
    at com.apisimulator.io.DirectoryTreeWalker.walkTree(Unknown Source)
    at com.apisimulator.config.HttpSimletPerFileLoader.loadFromDir(Unknown Source)
    at com.apisimulator.HttpAPISimulatorInit.initSimulation(Unknown Source)
    at com.apisimulator.APISimulator.doInit(Unknown Source)
    at com.apisimulator.launcher.AbstractLaunchable.init(Unknown Source)
    at com.apisimulator.launcher.AbstractLaunchable.launch(Unknown Source)
    at com.apisimulator.APISimulator.main(Unknown Source)