summaryrefslogtreecommitdiffstats
path: root/examples
diff options
context:
space:
mode:
authorKazuki Yamaguchi <k@rhe.jp>2015-08-14 17:31:33 +0900
committerKazuki Yamaguchi <k@rhe.jp>2015-08-14 17:31:33 +0900
commit881f8c942d450e28db1bc85928068a22ce37a656 (patch)
tree489528238e7258ca95b515017e51e256e32ba40d /examples
parentcdebfcf496dd65cff5d52667b625d49d1643bf16 (diff)
downloadplum-881f8c942d450e28db1bc85928068a22ce37a656.tar.gz
add support for HTTP/2 over TCP ('http' URI scheme)
Diffstat (limited to 'examples')
-rw-r--r--examples/local_server.rb1
-rw-r--r--examples/non_tls_server.rb115
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("<", "&lt;").gsub(">", "&gt;")}<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