diff options
author | Kazuki Yamaguchi <k@rhe.jp> | 2015-08-14 17:31:33 +0900 |
---|---|---|
committer | Kazuki Yamaguchi <k@rhe.jp> | 2015-08-14 17:31:33 +0900 |
commit | 881f8c942d450e28db1bc85928068a22ce37a656 (patch) | |
tree | 489528238e7258ca95b515017e51e256e32ba40d /examples | |
parent | cdebfcf496dd65cff5d52667b625d49d1643bf16 (diff) | |
download | plum-881f8c942d450e28db1bc85928068a22ce37a656.tar.gz |
add support for HTTP/2 over TCP ('http' URI scheme)
Diffstat (limited to 'examples')
-rw-r--r-- | examples/local_server.rb | 1 | ||||
-rw-r--r-- | examples/non_tls_server.rb | 115 |
2 files changed, 116 insertions, 0 deletions
diff --git a/examples/local_server.rb b/examples/local_server.rb index c844a87..a777174 100644 --- a/examples/local_server.rb +++ b/examples/local_server.rb @@ -11,6 +11,7 @@ CONTENT_TYPES = { /\.jpg$/ => "image/jpeg", /\.css$/ => "text/css", /\.js$/ => "application/javascript", + /\.atom$/ => "application/atom+xml", } $LOAD_PATH << File.expand_path("../../lib", __FILE__) diff --git a/examples/non_tls_server.rb b/examples/non_tls_server.rb new file mode 100644 index 0000000..804e3d2 --- /dev/null +++ b/examples/non_tls_server.rb @@ -0,0 +1,115 @@ +$LOAD_PATH << File.expand_path("../../lib", __FILE__) +require "plum" +require "socket" +require "cgi" + +def log(con, stream, s) + prefix = "[%02x;%02x] " % [con, stream] + if s.is_a?(Enumerable) + puts s.map {|a| prefix + a.to_s }.join("\n") + else + puts prefix + s.to_s + end +end + +tcp_server = TCPServer.new("0.0.0.0", 40080) + +loop do + begin + sock = tcp_server.accept + id = sock.fileno + puts "#{id}: accept!" + rescue => e + STDERR.puts e + next + end + + plum = Plum::HTTPConnection.new(sock) + + plum.on(:frame) do |frame| + log(id, frame.stream_id, "recv: #{frame.inspect}") + end + + plum.on(:send_frame) do |frame| + log(id, frame.stream_id, "send: #{frame.inspect}") + end + + plum.on(:connection_error) do |exception| + puts exception + puts exception.backtrace + end + + plum.on(:stream) do |stream| + stream.on(:stream_error) do |exception| + puts exception + puts exception.backtrace + end + + stream.on(:send_deferred) do |frame| + log(id, frame.stream_id, "send (deferred): #{frame.inspect}") + end + + headers = data = nil + + stream.on(:open) do + headers = nil + data = "" + end + + stream.on(:headers) do |headers_| + log(id, stream.id, headers_.map {|name, value| "#{name}: #{value}" }) + headers = headers_.to_h + end + + stream.on(:data) do |data_| + log(id, stream.id, data_) + data << data_ + end + + stream.on(:end_stream) do + case [headers[":method"], headers[":path"]] + when ["GET", "/"] + body = "Hello World! <a href=/abc.html>ABC</a> <a href=/fgsd>Not found</a>" + body << <<-EOF + <form action=post.page method=post> + <input type=text name=key value=default_value> + <input type=submit> + </form> + EOF + stream.respond({ + ":status": "200", + "server": "plum", + "content-type": "text/html", + "content-length": body.size + }, body) + when ["POST", "/post.page"] + body = "Posted value is: #{CGI.unescape(data).gsub("<", "<").gsub(">", ">")}<br> <a href=/>Back to top page</a>" + stream.respond({ + ":status": "200", + "server": "plum", + "content-type": "text/html", + "content-length": body.size + }, body) + else + body = "Page not found! <a href=/>Back to top page</a>" + stream.respond({ + ":status": "404", + "server": "plum", + "content-type": "text/html", + "content-length": body.size + }, body) + end + end + end + + Thread.new { + begin + plum.run + rescue + puts $! + puts $!.backtrace + ensure + sock.close + end + } +end |