Canson
small rack based framework that can run websocket. 20K connections can be handled
Run the example chat app
cd spec/test_app_root
bundle install
bundler exec iodine -p 3000 -t 16 -w 4
open localhost:3000 in browser
Example app
in spec/test_app_root
require 'canson'
class TestApp < Canson::Base
  def self.print_out
    puts 'hijack'
  end
  get '/' do
    print_out
    {results: 'hi'}
  end
  get '/ask' do |params|
    name = params[:name]
    {results: name}
  end
   on_open do
    puts '================================'
    puts 'We have a websocket connection'
    puts '================================'
  end
  on_close do
    puts "Bye Bye... #{count} connections left..."
  end
  on_shutdown do
    write 'The server is shutting down, goodbye.'
  end
  on_message do |params|
    data = params[:data]
    ws = params[:ws]
    nickname = params[:nickname]
    tmp = "#{nickname}: #{data}"
    ws.write tmp
    ws.each { |h| h.write tmp }
    puts '================================'
    puts "got message: #{data} encoded as #{data.encoding}"
    puts "broadcasting #{tmp.bytesize} bytes with encoding #{tmp.encoding}"
    puts '================================'
  end
end
require './test_app.rb'
run TestApp.new
Usage
Given the following piece of ruby code:
# config.ru
require "canson"
get "/index" do
  { results: [1, 2, 3] }
endThe server is run via
bundle exec rackup --port 3000.
When requested with curl http://localhost:3000/bla -i, it should return:
HTTP/1.1 200 OK
Content-Type: application/json
{"results": [1, 2, 3]}
Given the following piece of ruby code:
# config.ru
require "trialday"
get "/bla" do
  { results: [1, 2, 3] }
end
post "/bla" do |params|
  name = params[:name]
  { name: name }
endWhen requested with curl http://localhost:3000/index -i, it should return:
HTTP/1.1 200 OK
Content-Type: application/json
{"results": [1, 2, 3]}
When requested with curl -XPOST http://localhost:3000/bla -i -H "Content-Type: application/json" -d '{"name": "Mario"}', it should return:
HTTP/1.1 200 OK
Content-Type: application/json
{"name": "Mario"}