about summary refs log tree commit homepage
path: root/examples/echo.ru
diff options
context:
space:
mode:
Diffstat (limited to 'examples/echo.ru')
-rw-r--r--examples/echo.ru27
1 files changed, 27 insertions, 0 deletions
diff --git a/examples/echo.ru b/examples/echo.ru
new file mode 100644
index 0000000..c79cb7b
--- /dev/null
+++ b/examples/echo.ru
@@ -0,0 +1,27 @@
+#\-E none
+#
+# Example application that echoes read data back to the HTTP client.
+# This emulates the old echo protocol people used to run.
+#
+# An example of using this in a client would be to run:
+#   curl --no-buffer -T- http://host:port/
+#
+# Then type random stuff in your terminal to watch it get echoed back!
+
+class EchoBody < Struct.new(:input)
+
+  def each(&block)
+    while buf = input.read(4096)
+      yield buf
+    end
+    self
+  end
+
+end
+
+use Rack::Chunked
+run lambda { |env|
+  /\A100-continue\z/ =~ env['HTTP_EXPECT'] and return [100, {}, []]
+  [ 200, { 'Content-Type' => 'application/octet-stream' },
+    EchoBody.new(env['rack.input']) ]
+}