• Stars
    star
    23
  • Rank 983,590 (Top 20 %)
  • Language
    Crystal
  • License
    MIT License
  • Created over 6 years ago
  • Updated over 4 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Mount multiple web applications 🚦

HTTP::Multiserver

Built with Crystal Build status API Docs Releases Awesome vladfaust.com Patrons count Gitter chat

The requests dispatcher shard for Crystal.

Supporters

Thanks to all my patrons, I can continue working on beautiful Open Source Software! 🙏

Lauri Jutila, Alexander Maslov, Dainel Vera

You can become a patron too in exchange of prioritized support and other perks

Become Patron

About

HTTP::Multiserver dispatches a server request to another vanilla HTTP::Server depending on its path similar to Ruby's Rack::URLMap.

Installation

Add this to your application's shard.yml:

dependencies:
  http-multiserver:
    github: vladfaust/http-multiserver.cr
    version: ~> 0.2.0

This shard follows Semantic Versioning 2.0.0, so see releases and change the version accordingly.

Usage

Basic example

require "http-multiserver"

simple_server = HTTP::Server.new([HTTP::LogHandler.new]) do |context|
  context.response.print("Hello from Simple Server!")
end

# For example purposes
resque = Resque::Server.new

multiserver = HTTP::Multiserver.new({
  "/resque" => resque,
  "/"       => simple_server,
}, [HTTP::ErrorHandler.new(true)]) do |context|
  # This is an optional custom fallback handler; by default returns "404 Not Found"
  context.response.status_code = 418
  context.response.print("#{context.request.path} not found")
end

multiserver.bind_tcp(5000)
multiserver.listen

HTTP::Multiserver extends from a regular HTTP::Server, so it CAN have its own handlers. Same for underlying servers, they obviously CAN have their own handlers too.

Mapping

Mapping relies on either String or Regex keys; when using String as a key, a slash is automatically appended to it.

Assuming that this map is passed to HTTP::Multiserver initializer:

map = {
  "/foo"   => foo_server,
  %r{/bar} => bar_server,
  "/"      => fallback_server
}

multiserver = HTTP::Multiserver.new(port, map)

This is how the request is dispatched under the hood (simplified):

internal_map = {
  %r{^/foo/} => foo_server,
  %r{/bar}   => bar_server,
  %r{^/}     => fallback_server
}

path = request.path.append_slash # "/foo/abc" turns into "foo/abc/"
server = internal_map.find { |regex, _| regex.match(path) }
server ? server.call(context) : not_found

Please see specs for dispatching specifications.

Performance

As mentioned above, HTTP::Multiserver is just a regular HTTP::Server which dispatches the handling to underlying servers based on super-fast Regex.match. A very tiny impact on the performance is expected if any.

Contributing

  1. Fork it ( https://github.com/vladfaust/http-multiserver.cr/fork )
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create a new Pull Request

Contributors

More Repositories

1

unity-wakatime

WakaTime plugin for Unity ⏱
C#
116
star
2

crystalworld

RealWorld back-end API implementation 👍
Crystal
43
star
3

migrate.cr

A database migration solution 🚜
Crystal
31
star
4

i18n.cr

Internationalization shard 🌍
Crystal
24
star
5

jbuilder-json_api

Jbuilder meets jsonapi.org specifications
Ruby
23
star
6

http-params-serializable

The HTTP params parsing module for Crystal 🤓
Crystal
20
star
7

tarantool.cr

The Tarantool driver (a.k.a. connector) 🕷
Crystal
19
star
8

mini_redis

A light-weight low-level Redis client for Crystal ♨️
Crystal
18
star
9

validations.cr

Validations module for Crystal ✅
Crystal
13
star
10

tele.cr

A convenient Telegram Bot framework 🤖
Crystal
13
star
11

callbacks.cr

Expressive callbacks module for Crystal 🚉
Crystal
12
star
12

background

Fast background job processing
Crystal
11
star
13

stripe.cr

🚧 WIP 🚧 Stripe API wrapper 💳
Crystal
7
star
14

onyx-http-deprecated

Deprecated Onyx module
Crystal
6
star
15

cake-bake

Bake Cakefile into native Crystal code 🍞
Crystal
5
star
16

time-span-humanize

Time::Span#humanize method
Crystal
5
star
17

crack

Alternative Crystal HTTP server implementation
Crystal
5
star
18

timer.cr

A versatile timer module ⏲
Crystal
4
star
19

realworld-benchmark

RealWorld Benchmark
Crystal
3
star
20

onyx-40-loc-distributed-chat

Distributed websocket chat in 40 lines of code
JavaScript
2
star
21

time_format.cr

Time spans formatting made simple ⌚️
Crystal
2
star
22

Expense-Manager-2

Java
1
star
23

attribute_enum

Rails-like enums with ease
Ruby
1
star
24

tele-broadcast.cr

Broadcasting for Tele 📢
Crystal
1
star