Sha256: 1698b2f8c24b163ed17e38ea7fd6b8077ae00a8020b7c375b3bd9adff4287a17

Contents?: true

Size: 998 Bytes

Versions: 2

Compression:

Stored size: 998 Bytes

Contents

# frozen_string_literal: true

require 'bundler/inline'

gemfile do
  source 'https://rubygems.org'
  gem 'http_parser.rb'
  gem 'polyphony', path: '.'
end

require 'polyphony'
require 'http_parser.rb'

def handle_client(conn)
  spin do
    parser = Http::Parser.new
    done = false
    headers = nil
    parser.on_headers_complete = proc do |h|
      headers = h
      headers[':method'] = parser.http_method
      headers[':path'] = parser.request_url
    end
    parser.on_message_complete = proc { done = true }

    while true # assuming persistent connection
      conn.read_loop do |msg|
        parser << msg
        break if done
      end
  
      conn << "HTTP/1.1 200 OK\r\nContent-Length: 14\r\n\r\nHello, world!\n"
      done = false
      headers = nil
    end
  rescue Errno::ECONNRESET, Errno::EPIPE
    # ignore
  ensure
    parser = nil
    conn.close rescue nil
  end
end

puts "Serving HTTP on port 1234..."
TCPServer.new('0.0.0.0', 1234).accept_loop { |c| handle_client(c) }

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
polyphony-1.6 examples/pipes/http_server2.rb
polyphony-1.5 examples/pipes/http_server2.rb