Sha256: ea3c5042b16097dd83922f499641377fab4c17d027efb07910f312e0405f883b

Contents?: true

Size: 1.48 KB

Versions: 44

Compression:

Stored size: 1.48 KB

Contents

# frozen_string_literal: true

require 'bundler/setup'
require 'polyphony'
require 'http/parser'
require 'rack'

module RackAdapter
  class << self
    def run(app)
      ->(socket, req) { respond(socket, req, app.(env(req))) }
    end

    def env(req)
      {}
    end
    
    def respond(socket, request, (status_code, headers, body))
      body = body.join
      headers = "Content-Type: text/plain\r\nContent-Length: #{body.bytesize}\r\n"
      socket.write "HTTP/1.1 #{status_code}\r\n#{headers}\r\n#{body}"
    end
  end
end

$connection_count = 0

def handle_client(socket, &handler)
  $connection_count += 1
  parser = Http::Parser.new
  reqs = []
  parser.on_message_complete = proc do |env|
    reqs << Object.new # parser
  end
  socket.read_loop do |data|
    parser << data
    while (req = reqs.shift)
      handler.call(socket, req)
      req = nil
    end
  end
rescue IOError, SystemCallError => e
  # do nothing
ensure
  $connection_count -= 1
  socket&.close
end

def handle_request(client, parser)
  status_code = "200 OK"
  data = "Hello world!\n"
  headers = "Content-Type: text/plain\r\nContent-Length: #{data.bytesize}\r\n"
  client.write "HTTP/1.1 #{status_code}\r\n#{headers}\r\n#{data}"
end

server = TCPServer.open('0.0.0.0', 1234)
puts "pid #{Process.pid}"
puts "listening on port 1234"

app = RackAdapter.run(lambda { |env|
  [
    200,
    {"Content-Type" => "text/plain"},
    ["Hello, world!\n"]
  ]
})

loop do
  client = server.accept
  spin { handle_client(client, &app) }
end

Version data entries

44 entries across 44 versions & 1 rubygems

Version Path
polyphony-0.71 examples/io/rack_server.rb
polyphony-0.70 examples/io/rack_server.rb
polyphony-0.69 examples/io/rack_server.rb
polyphony-0.68 examples/io/rack_server.rb
polyphony-0.67 examples/io/rack_server.rb
polyphony-0.66 examples/io/rack_server.rb
polyphony-0.65 examples/io/rack_server.rb
polyphony-0.64 examples/io/rack_server.rb
polyphony-0.63 examples/io/rack_server.rb
polyphony-0.62 examples/io/rack_server.rb
polyphony-0.61 examples/io/rack_server.rb
polyphony-0.60 examples/io/rack_server.rb
polyphony-0.59.1 examples/io/rack_server.rb
polyphony-0.59 examples/io/rack_server.rb
polyphony-0.58 examples/io/rack_server.rb
polyphony-0.57.0 examples/io/rack_server.rb
polyphony-0.56.0 examples/io/rack_server.rb
polyphony-0.55.0 examples/io/rack_server.rb
polyphony-0.54.0 examples/io/rack_server.rb
polyphony-0.53.2 examples/io/rack_server.rb