Coder Social home page Coder Social logo

serverless-redis-http's People

Contributors

hiett avatar jahands avatar trentonsnyder avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

serverless-redis-http's Issues

Multi-execs from concurrent users not working

The following code snippet works towards actual Upstash but not towards serverless-redis-http

Repro

import { Redis } from '@upstash/redis'

const redis = Redis.fromEnv()

await Promise.all(['a', 'b', 'c'].map(async (key) => {
  const multi = redis.multi()
  multi.set(key, 'foo')
  await multi.exec()
}))

console.log(await redis.mget('a', 'b', 'c'))

Expected

[ "foo", "foo", "foo" ]

Observed

UpstashError: ERR MULTI calls can not be nested, command was: [["set","b","foo"]]
      at new u (/Users/sam/redis-http-repro/node_modules/@upstash/redis/chunk-DKKYFKP2.mjs:1:42)
      at /Users/sam/redis-http-repro/node_modules/@upstash/redis/chunk-DKKYFKP2.mjs:1:1597

Seeing this error when running on cloudflare SyntaxError: Unexpected token 'e', "error code: 1003" is not valid JSON

The same code works when tested locally.

This is the code which works locally

import { Redis } from "@upstash/redis";

export const redis = new Redis({
    url: "http://<myserver>:8080",
    token: "helius",
});

async function run() {
  const key = "key";
  const value = { hello: "world" };

  const res1 = await redis.set(key, value);
  console.log(res1);

  const res2 = await redis.get(key);
  console.log(typeof res2, res2);

  if (JSON.stringify(value) != JSON.stringify(res2)) {
    throw new Error("value not equal");
  }
}

run();

Running the same code on CF gives me an error

import { Redis } from "@upstash/redis/cloudflare"

                try {
                    const redis = new Redis({
                        url: "http://<myserver>:8080",
                        token: "helius",
                    })

                    // string
                    const key = "key";
                    const value = { hello: "world" };

                    const res1 = await redis.set(key, value);
                    console.log(res1);

                    const res2 = await redis.get(key);
                    console.log(typeof res2, res2);
                } catch (e) {
                    console.error('Error running Redis commands:', e);
                }

I don't see any error logs on the SRH container. Only difference is in the import path which uses redis from CF.

The error I am seeing is

Error running Redis commands: SyntaxError: Unexpected token 'e', "error code: 1003" is not valid JSON

Expose server on IPv6 interface

First of all, thank you for developing such a useful tool to expose Redis to serverless environments. It's been incredibly helpful!

I am currently trying to deploy the server on Fly.io, which requires services to accept connections on IPv6. I've encountered an issue where the application does not seem to support listening on IPv6 addresses.

Could you please let me know if there is a way to configure the Elixir application to listen on a specific interface using an environment variable? Or if not, are there any plans to add IPv6 support in the near future?

Thank you.

Incorrect encoding in response

I have a simple key in my Redis instance:

127.0.0.1:6379> set foo bar
OK
127.0.0.1:6379> get foo
"bar"

When I configure @upstash/redis to use serverless-redis-http, I get back a corrupted value:

await redis.get('foo')
'm�'

That second character is the Unicode replacement character. This suggests @upstash/redis is expecting UTF-8, but serverless-redis-http is returning something else.

I do notice that the content-type doesn't have an encoding marker.

Trying to run in Docker Compose

I started working to get this running in docker-compose and ran into an error when running up. I exec into the container and it looks like the file is mounted in the correct place in app/srh-config/tokens.json

I thought it would be cool to get compose instructions in the readme or at least help to figure out how to support it. I might just have some network config wrong. I know there's a lot of things that could be wrong with my set up and not necessarily this repo. But any tips would be appreciated.

Error:
qemu: uncaught target signal 11 (Segmentation fault) - core dumped

tokens.json

{
  "development-token": {
    "srh_id": "some_unique_identifier",
    "connection_string": "redis:6379",
    "max_connections": 3
  }
}

docker-compose.yaml

  redis:
    image: redis
    ports:
      - '6379:6379'
    expose:
      - 6379
    volumes:
      - ./packages/must-stash/volume:/data
  serverless-redis-http:
    ports:
      - '8079:80'
    image: 'hiett/serverless-redis-http:latest'
    volumes:
      - ./packages/must-stash/local-config/tokens.json:/app/srh-config/tokens.json

I then cloned the repo and built the image ran up pointed to my local image and wasn't getting the same error. It seemed to stay up ok. Then I tried hitting http://localhost:8079 with '@upstash/redis' doing a set and hset and got an Elixir error. So, I got a little closer.

Screen Shot 2022-10-04 at 9 12 07 AM

RedisJSON warning and differences

Readme states following:

The Upstash implementation of RedisJSON contains a number of subtle differences in what is returned in responses. For this reason, it is not advisable to use SRH with Redis Stack if you are testing your Upstash implementation that uses JSON commands.

Is it possible to specify those "subtle differences"? Upstash in their official docs states compatibility for whole JSON module.

Unicode encoding issues and sorted sets

I'm using a sorted set to order some keys and running into some issues

I am using encodeURIComponent / decodeURIComponent to prevent mangling of keys - something like:

zadd<string>(this.zKey, { score: 0, member: encodeURIComponent(key) })

Then I use zrange to get the ordered keys. The problem is that the encoding changes the lexical order of the keys. For example, if I put these keys in:

[ '', '\t', '🐄', '12', '2', 'a', 'a🐄', 'b', 'd', 'e', 'f', 'ff', '~']

The correct lexical ordering should be:

[ '', '\t', '12', '2', 'a', 'a🐄', 'b', 'd', 'e', 'f', 'ff', '~', '🐄']

But if I encode the keys, the order is:

[ '', '\t', '🐄', '12', '2', 'a', 'a🐄', 'b', 'd', 'e', 'f', 'ff', '~']

If I don't encode the values, the keys get mangled:

[ '', '\t', '12', '2', 'a', 'a=\x04', 'b', 'd', 'e', 'f', 'ff', '~', '=\x04']

I have confirmed that this does not happen when using a real @upstash redis instance.

If the Redis server goes down, and a :closed is returned, the pool isn't properly destroyed

If the remote Redis server goes down, whereby a :closed is returned for a command, the pool isn't destroyed. It is destroyed after the 15 seconds, but if there are frequent commands to SRH this timout is likely to be reached. This means that a broken pool will exist, with the only way to fix it being to restart SRH itself (or not have any commands for 15 seconds).

Error overhaul

Continuing from #13 making all the errors follow the JSON error schema, and improved logging in SRH for those errors

Entirely removing the json option (making it always enabled), and instead having the map able to provide an error that gets encoded into the format

Issue: Message Not Found

I'm encountering these errors with this simple script.

Docker is running both redis and hiett/serverless-redis-http:latest containers.

Is the issue that url in the client is using http instead of https?

app.js

import { Redis } from "@upstash/redis";

const redisClient = new Redis({
  url: "http://localhost:8080",
  token: "123456789",
});

await redisClient.set('key', 'value');

redis (docker)

Possible SECURITY ATTACK detected. It looks like somebody is sending POST or Host: commands to Redis. This is likely due to an attacker attempting to use Cross Protocol Scripting to compromise your Redis instance. Connection aborted.

node output:

(node:13255) ExperimentalWarning: The Fetch API is an experimental feature. This feature could change at any time
(Use `node --trace-warnings ...` to show where the warning was created)
undefined:1


SyntaxError: Unexpected end of JSON input
    at JSON.parse (<anonymous>)
    at Response.json (node:internal/deps/undici/undici:6160:23)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async HttpClient.request (file:///node_modules/.pnpm/@[email protected]/node_modules/@upstash/redis/esm/pkg/http.js:99:23)
    at async SetCommand.exec (file://node_modules/.pnpm/@[email protected]/node_modules/@upstash/redis/esm/pkg/commands/command.js:55:35)

srh log output:

16:25:13.857 [error] #PID<0.1106.0> running Srh.Http.BaseRouter (connection #PID<0.1105.0>, stream id 1) terminated
Server: localhost:8080 (http)
Request: POST /
** (exit) an exception was raised:
    ** (KeyError) key :message not found in: %Redix.ConnectionError{reason: :closed}
        (srh 0.1.0) lib/srh/http/command_handler.ex:160: Srh.Http.CommandHandler.dispatch_command/2
        (srh 0.1.0) lib/srh/http/base_router.ex:16: anonymous fn/2 in Srh.Http.BaseRouter.do_match/4
        (srh 0.1.0) lib/plug/router.ex:246: anonymous fn/4 in Srh.Http.BaseRouter.dispatch/2
        (telemetry 1.1.0) /app/deps/telemetry/src/telemetry.erl:320: :telemetry.span/3
        (srh 0.1.0) lib/plug/router.ex:242: Srh.Http.BaseRouter.dispatch/2
        (srh 0.1.0) lib/srh/http/base_router.ex:1: Srh.Http.BaseRouter.plug_builder_call/2
        (plug_cowboy 2.5.2) lib/plug/cowboy/handler.ex:12: Plug.Cowboy.Handler.init/2
        (cowboy 2.9.0) /app/deps/cowboy/src/cowboy_handler.erl:37: :cowboy_handler.execute/2

node
18.12.1

Docker commands

$ docker run --name my-redis -p 6379:6379 -d redis
$ docker run -it -d -p 8080:80 --name srh --mount type=bind,source=$(pwd)/srh-config/tokens.json,target=/app/srh-config/tokens.json hiett/serverless-redis-http:latest

any pre-compiled binary to use?

Hi,

Is it possible to use the server without docker? I mean, involving docker seems to be overkilled. Could you please consider providing some pre-compiled binary so that users can just run something like ./server —redisaddr http://localhost:8079 —user aaa —password bbb?

I would like to compile the binary by myself but unfortunately I don’t know anything about Elixir…

Thank you so much!

Make port configurable

I want to run SRH in Cloud Run as a sidecar container, and it just feels weird that the redis connector blocks port 80 per default.

I tried to configure the port with SRH_PORT and PORT env vars, but for both SRH started with Using port 80. I saw in the code that in some case you're getting it from the env, but I guess not in the prod configuration.

Do you think it makes sense to make the port configurable, best case with the PORT env var?

And, thanks for the great project!

Docker noob here, help? -- could not read file "srh-config/tokens.json":

sudo docker run hiett/serverless-redis-http                                                                                               10:23:01 
Using port 80
Token resolver started

01:23:16.555 [notice] Application srh exited: Srh.start(:normal, []) returned an error: shutdown: failed to start child: :token_resolver
    ** (EXIT) an exception was raised:
        ** (File.Error) could not read file "srh-config/tokens.json": no such file or directory
            (elixir 1.13.4) lib/file.ex:355: File.read!/1
            (srh 0.1.0) lib/srh/auth/token_resolver.ex:56: Srh.Auth.TokenResolver.do_init_load/1
            (srh 0.1.0) lib/srh/auth/token_resolver.ex:27: Srh.Auth.TokenResolver.init/1
            (stdlib 3.17.2.4) gen_server.erl:423: :gen_server.init_it/2
            (stdlib 3.17.2.4) gen_server.erl:390: :gen_server.init_it/6
            (stdlib 3.17.2.4) proc_lib.erl:226: :proc_lib.init_p_do_apply/3
{"Kernel pid terminated",application_controller,"{application_start_failure,srh,{{shutdown,{failed_to_start_child,token_resolver,{#{'__exception__' => true,'__struct__' => 'Elixir.File.Error',action => <<\"read file\">>,path => <<\"srh-config/tokens.json\">>,reason => enoent},[{'Elixir.File','read!',1,[{file,\"lib/file.ex\"},{line,355}]},{'Elixir.Srh.Auth.TokenResolver',do_init_load,1,[{file,\"lib/srh/auth/token_resolver.ex\"},{line,56}]},{'Elixir.Srh.Auth.TokenResolver',init,1,[{file,\"lib/srh/auth/token_resolver.ex\"},{line,27}]},{gen_server,init_it,2,[{file,\"gen_server.erl\"},{line,423}]},{gen_server,init_it,6,[{file,\"gen_server.erl\"},{line,390}]},{proc_lib,init_p_do_apply,3,[{file,\"proc_lib.erl\"},{line,226}]}]}}},{'Elixir.Srh',start,[normal,[]]}}}"}

I understand this is just some configuration I haven't done correctly on my part :P

First, I ran this and worked perfectly. SRH server was up:

sudo docker run \
    -it -d -p 8080:80 --name srh \
    -e SRH_MODE=env \
    -e SRH_TOKEN=your_token_here \
    -e SRH_CONNECTION_STRING="redis://localhost:6379" \
    hiett/serverless-redis-http:latest

But, for some reason the SRH server couldn't reach my redis instance running on 127.0.0.1:6379. I thought that maybe changing the connection_string to 127.0.0.1 instead of localhost would fix it. I then killed my running container and tried running the command / image again. But no luck.

Is there a way to configure the server? I'm guessing I need to create this tokens.json but I don't know how.

Running SRH on bare metal alongside Redis

Is it possible to run SRH as a standalone binary outside of docker on the same server as Redis? This would be for intensive workloads which require a lot of resources so probably would be better to run outside of docker.

Invalid SRH token returns 500 error

Heya! Super cool project :)
One thing I noticed is that sending a request with an invalid token using @upstash/redis returns a 500 error, with this in the SRH logs:

Using port 80
Token resolver started
Loaded config from env. 1 entries.
00:33:22.502 [error] #PID<0.1202.0> running Srh.Http.BaseRouter (connection #PID<0.1201.0>, stream id 1) terminated
Server: redis.uuid.rocks:80 (http)
Request: POST /
** (exit) an exception was raised:
** (FunctionClauseError) no function clause matching in Srh.Http.ResultEncoder.encode_response/1
(srh 0.1.0) lib/srh/http/result_encoder.ex:4: Srh.Http.ResultEncoder.encode_response({:not_authorized, "Invalid token"})
(srh 0.1.0) lib/srh/http/base_router.ex:36: Srh.Http.BaseRouter.do_command_request/2
(srh 0.1.0) lib/plug/router.ex:246: anonymous fn/4 in Srh.Http.BaseRouter.dispatch/2
(telemetry 1.1.0) /app/deps/telemetry/src/telemetry.erl:320: :telemetry.span/3
(srh 0.1.0) lib/plug/router.ex:242: Srh.Http.BaseRouter.dispatch/2
(srh 0.1.0) lib/srh/http/base_router.ex:1: Srh.Http.BaseRouter.plug_builder_call/2
(plug_cowboy 2.5.2) lib/plug/cowboy/handler.ex:12: Plug.Cowboy.Handler.init/2
(cowboy 2.9.0) /app/deps/cowboy/src/cowboy_handler.erl:37: :cowboy_handler.execute/2

Not a big deal, though.
Looked into fixing it, but elixir is very new to me. If you can point me in the right direction, I'd be happy to try fixing it!

Connection refused does not return an error

I noticed that when SRH is unable to connect to redis, it does not return an error, making the @upstash/redis client return nothing, but not throw an error.

In the SRH logs, I see this:

17:16:16.075 [error] #PID<0.3067.0> running Srh.Http.BaseRouter (connection #PID<0.2318.0>, stream id 298) terminated
Server: redis.example.com:80 (http)
Request: POST /
** (exit) an exception was raised:
    ** (KeyError) key :message not found in: %Redix.ConnectionError{reason: :closed}
        (srh 0.1.0) lib/srh/http/command_handler.ex:160: Srh.Http.CommandHandler.dispatch_command/2
        (srh 0.1.0) lib/srh/http/base_router.ex:35: Srh.Http.BaseRouter.do_command_request/2
        (srh 0.1.0) lib/plug/router.ex:246: anonymous fn/4 in Srh.Http.BaseRouter.dispatch/2
        (telemetry 1.1.0) /app/deps/telemetry/src/telemetry.erl:320: :telemetry.span/3
        (srh 0.1.0) lib/plug/router.ex:242: Srh.Http.BaseRouter.dispatch/2
        (srh 0.1.0) lib/srh/http/base_router.ex:1: Srh.Http.BaseRouter.plug_builder_call/2
        (plug_cowboy 2.5.2) lib/plug/cowboy/handler.ex:12: Plug.Cowboy.Handler.init/2
        (cowboy 2.9.0) /app/deps/cowboy/src/cowboy_handler.erl:37: :cowboy_handler.execute/2

This can be repro'd by specifying the wrong redis port

SSL Error When Connecting to REDIS via Python <upstash-redis>

Attempting to establish a connection to REDIS using the serverless-redis-http server results in an SSL error. The error message received is as follows:

requests.exceptions.SSLError: HTTPSConnectionPool(host='localhost', port=8079): Max retries exceeded with url: / (Caused by SSLError(SSLError(1, '[SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1000)')))

Below are the steps to reproduce the error:

from upstash_redis import Redis
r = Redis(url="https://localhost:8079", token="example_token")
r.ping()

...and here's the error traceback:

Traceback (most recent call last):
  File "F:\code\whereisthegooglecar\bot\env\Lib\site-packages\urllib3\connectionpool.py", line 468, in _make_request
    self._validate_conn(conn)
  File "F:\code\whereisthegooglecar\bot\env\Lib\site-packages\urllib3\connectionpool.py", line 1097, in _validate_conn
    conn.connect()
  File "F:\code\whereisthegooglecar\bot\env\Lib\site-packages\urllib3\connection.py", line 642, in connect
    sock_and_verified = _ssl_wrap_socket_and_match_hostname(
                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "F:\code\whereisthegooglecar\bot\env\Lib\site-packages\urllib3\connection.py", line 783, in _ssl_wrap_socket_and_match_hostname
    ssl_sock = ssl_wrap_socket(
               ^^^^^^^^^^^^^^^^
  File "F:\code\whereisthegooglecar\bot\env\Lib\site-packages\urllib3\util\ssl_.py", line 471, in ssl_wrap_socket
    ssl_sock = _ssl_wrap_socket_impl(sock, context, tls_in_tls, server_hostname)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "F:\code\whereisthegooglecar\bot\env\Lib\site-packages\urllib3\util\ssl_.py", line 515, in _ssl_wrap_socket_impl
    return ssl_context.wrap_socket(sock, server_hostname=server_hostname)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Program Files\Python312\Lib\ssl.py", line 455, in wrap_socket
    return self.sslsocket_class._create(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Program Files\Python312\Lib\ssl.py", line 1046, in _create
    self.do_handshake()
  File "C:\Program Files\Python312\Lib\ssl.py", line 1321, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLError: [SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1000)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "F:\code\whereisthegooglecar\bot\env\Lib\site-packages\urllib3\connectionpool.py", line 791, in urlopen
    response = self._make_request(
               ^^^^^^^^^^^^^^^^^^^
  File "F:\code\whereisthegooglecar\bot\env\Lib\site-packages\urllib3\connectionpool.py", line 492, in _make_request
    raise new_e
urllib3.exceptions.SSLError: [SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1000)

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "F:\code\whereisthegooglecar\bot\env\Lib\site-packages\requests\adapters.py", line 486, in send
    resp = conn.urlopen(
           ^^^^^^^^^^^^^
  File "F:\code\whereisthegooglecar\bot\env\Lib\site-packages\urllib3\connectionpool.py", line 845, in urlopen
    retries = retries.increment(
              ^^^^^^^^^^^^^^^^^^
  File "F:\code\whereisthegooglecar\bot\env\Lib\site-packages\urllib3\util\retry.py", line 515, in increment
    raise MaxRetryError(_pool, url, reason) from reason  # type: ignore[arg-type]
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='localhost', port=8079): Max retries exceeded with url: / (Caused by SSLError(SSLError(1, '[SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1000)')))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "F:\code\whereisthegooglecar\bot\env\Lib\site-packages\upstash_redis\commands.py", line 218, in ping
    return self.execute(command)
           ^^^^^^^^^^^^^^^^^^^^^
  File "F:\code\whereisthegooglecar\bot\env\Lib\site-packages\upstash_redis\client.py", line 110, in execute
    res = sync_execute(
          ^^^^^^^^^^^^^
  File "F:\code\whereisthegooglecar\bot\env\Lib\site-packages\upstash_redis\http.py", line 141, in sync_execute
    raise last_error
  File "F:\code\whereisthegooglecar\bot\env\Lib\site-packages\upstash_redis\http.py", line 129, in sync_execute
    response = session.post(url, headers=headers, json=command).json()
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "F:\code\whereisthegooglecar\bot\env\Lib\site-packages\requests\sessions.py", line 637, in post
    return self.request("POST", url, data=data, json=json, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "F:\code\whereisthegooglecar\bot\env\Lib\site-packages\requests\sessions.py", line 589, in request
    resp = self.send(prep, **send_kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "F:\code\whereisthegooglecar\bot\env\Lib\site-packages\requests\sessions.py", line 703, in send
    r = adapter.send(request, **kwargs)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "F:\code\whereisthegooglecar\bot\env\Lib\site-packages\requests\adapters.py", line 517, in send
    raise SSLError(e, request=request)
requests.exceptions.SSLError: HTTPSConnectionPool(host='localhost', port=8079): Max retries exceeded with url: / (Caused by SSLError(SSLError(1, '[SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1000)')))

Unhandled Redix error

It seems like this error is caused by trying to access a key that doesn't exist, at least acording to my quick digging. If its any help to you, we are using https://github.com/upstash/ratelimit.

10:42:46.423 [error] #PID<0.14839.0> running Srh.Http.BaseRouter (connection #PID<0.14837.0>, stream id 1) terminated
Server: example.example.svc.cluster.local:80 (http)
Request: POST /
** (exit) an exception was raised:
    ** (KeyError) key :message not found in: %Redix.ConnectionError{reason: :closed}
        (srh 0.1.0) lib/srh/http/command_handler.ex:160: Srh.Http.CommandHandler.dispatch_command/2
        (srh 0.1.0) lib/srh/http/base_router.ex:16: anonymous fn/2 in Srh.Http.BaseRouter.do_match/4
        (srh 0.1.0) lib/plug/router.ex:246: anonymous fn/4 in Srh.Http.BaseRouter.dispatch/2
        (telemetry 1.1.0) /app/deps/telemetry/src/telemetry.erl:320: :telemetry.span/3
        (srh 0.1.0) lib/plug/router.ex:242: Srh.Http.BaseRouter.dispatch/2
        (srh 0.1.0) lib/srh/http/base_router.ex:1: Srh.Http.BaseRouter.plug_builder_call/2
        (plug_cowboy 2.5.2) lib/plug/cowboy/handler.ex:12: Plug.Cowboy.Handler.init/2
        (cowboy 2.9.0) /app/deps/cowboy/src/cowboy_handler.erl:37: :cowboy_handler.execute/2

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.