turn Coquelicot into a gem
[coquelicot.git] / config.ru
1 # Coquelicot: "one-click" file sharing with a focus on users' privacy.
2 # Copyright © 2010-2012 potager.org <jardiniers@potager.org>
3 #           © 2011 mh / immerda.ch <mh+coquelicot@immerda.ch>
4 #
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License as
7 # published by the Free Software Foundation, either version 3 of the
8 # License, or (at your option) any later version.
9 #
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 # GNU Affero General Public License for more details.
14 #
15 # You should have received a copy of the GNU Affero General Public License
16 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
17
18 require 'rubygems'
19 require 'bundler'
20
21 Bundler.require
22
23 $:.unshift File.join(File.dirname(__FILE__), 'lib')
24 require 'coquelicot'
25
26 if defined? Rainbows::Client
27   # This implements the behaviour outlined in Section 8 of
28   # <http://ftp.ics.uci.edu/pub/ietf/http/draft-ietf-http-connection-00.txt>.
29   #
30   # Half-closing the write part first and draining our input makes sure the
31   # client will properly receive an error message instead of TCP RST (a.k.a.
32   # "Connection reset by peer") when we interrupt it in the middle of a POST
33   # request.
34   #
35   # Thanks Eric Wong for these few lines. See
36   # <http://rubyforge.org/pipermail/rainbows-talk/2012-February/000328.html> for
37   # the discussion that lead him to propose what follows.
38   class Rainbows::Client
39     def close
40       close_write
41       buf = ""
42       loop do
43         kgio_wait_readable(2)
44         break unless kgio_tryread(512, buf)
45       end
46     ensure
47       super
48     end
49   end
50 end
51
52 run Coquelicot::Application