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] }
end
The 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 }
end
When 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"}