about summary refs log tree commit homepage
diff options
context:
space:
mode:
-rw-r--r--examples/init.sh44
-rw-r--r--ext/unicorn_http/unicorn_http_common.rl2
-rw-r--r--test/unit/test_http_parser.rb18
3 files changed, 55 insertions, 9 deletions
diff --git a/examples/init.sh b/examples/init.sh
index 1f0e035..4ef6cdc 100644
--- a/examples/init.sh
+++ b/examples/init.sh
@@ -1,7 +1,16 @@
 #!/bin/sh
 set -e
+### BEGIN INIT INFO
+# Provides:          unicorn
+# Required-Start:    $local_fs $network
+# Required-Stop:     $local_fs $network
+# Default-Start:     2 3 4 5
+# Default-Stop:      0 1 6
+# Short-Description: Start/stop unicorn Rack app server
+### END INIT INFO
+
 # Example init script, this can be used with nginx, too,
-# since nginx and unicorn accept the same signals
+# since nginx and unicorn accept the same signals.
 
 # Feel free to change any of the following variables for your app:
 TIMEOUT=${TIMEOUT-60}
@@ -9,21 +18,22 @@ APP_ROOT=/home/x/my_app/current
 PID=$APP_ROOT/tmp/pids/unicorn.pid
 CMD="/usr/bin/unicorn -D -c $APP_ROOT/config/unicorn.rb"
 INIT_CONF=$APP_ROOT/config/init.conf
+UPGRADE_DELAY=${UPGRADE_DELAY-2}
 action="$1"
 set -u
 
 test -f "$INIT_CONF" && . $INIT_CONF
 
-old_pid="$PID.oldbin"
+OLD="$PID.oldbin"
 
 cd $APP_ROOT || exit 1
 
 sig () {
-        test -s "$PID" && kill -$1 `cat $PID`
+        test -s "$PID" && kill -$1 $(cat $PID)
 }
 
 oldsig () {
-        test -s $old_pid && kill -$1 `cat $old_pid`
+        test -s "$OLD" && kill -$1 $(cat $OLD)
 }
 
 case $action in
@@ -45,18 +55,36 @@ restart|reload)
         $CMD
         ;;
 upgrade)
-        if sig USR2 && sleep 2 && sig 0 && oldsig QUIT
+        if oldsig 0
+        then
+                echo >&2 "Old upgraded process still running with $OLD"
+                exit 1
+        fi
+
+        cur_pid=
+        if test -s "$PID"
+        then
+                cur_pid=$(cat $PID)
+        fi
+
+        if test -n "$cur_pid" &&
+                        kill -USR2 "$cur_pid" &&
+                        sleep $UPGRADE_DELAY &&
+                        new_pid=$(cat $PID) &&
+                        test x"$new_pid" != x"$cur_pid" &&
+                        kill -0 "$new_pid" &&
+                        kill -QUIT "$cur_pid"
         then
                 n=$TIMEOUT
-                while test -s $old_pid && test $n -ge 0
+                while kill -0 "$cur_pid" 2>/dev/null && test $n -ge 0
                 do
                         printf '.' && sleep 1 && n=$(( $n - 1 ))
                 done
                 echo
 
-                if test $n -lt 0 && test -s $old_pid
+                if test $n -lt 0 && kill -0 "$cur_pid" 2>/dev/null
                 then
-                        echo >&2 "$old_pid still exists after $TIMEOUT seconds"
+                        echo >&2 "$cur_pid still running after $TIMEOUT seconds"
                         exit 1
                 fi
                 exit 0
diff --git a/ext/unicorn_http/unicorn_http_common.rl b/ext/unicorn_http/unicorn_http_common.rl
index cc1d455..0988b54 100644
--- a/ext/unicorn_http/unicorn_http_common.rl
+++ b/ext/unicorn_http/unicorn_http_common.rl
@@ -4,7 +4,7 @@
 
 #### HTTP PROTOCOL GRAMMAR
 # line endings
-  CRLF = "\r\n";
+  CRLF = ("\r\n" | "\n");
 
 # character types
   CTL = (cntrl | 127);
diff --git a/test/unit/test_http_parser.rb b/test/unit/test_http_parser.rb
index c72f7f2..7cbc0f8 100644
--- a/test/unit/test_http_parser.rb
+++ b/test/unit/test_http_parser.rb
@@ -230,6 +230,24 @@ class HttpParserTest < Test::Unit::TestCase
     assert_equal expect, req['HTTP_X_SSL_BULLSHIT']
   end
 
+  def test_multiline_header_0d0a
+    parser = HttpParser.new
+    parser.buf << "GET / HTTP/1.0\r\n" \
+      "X-Multiline-Header: foo bar\r\n\tcha cha\r\n\tzha zha\r\n\r\n"
+    req = parser.env
+    assert_equal req, parser.parse
+    assert_equal 'foo bar cha cha zha zha', req['HTTP_X_MULTILINE_HEADER']
+  end
+
+  def test_multiline_header_0a
+    parser = HttpParser.new
+    parser.buf << "GET / HTTP/1.0\n" \
+      "X-Multiline-Header: foo bar\n\tcha cha\n\tzha zha\n\n"
+    req = parser.env
+    assert_equal req, parser.parse
+    assert_equal 'foo bar cha cha zha zha', req['HTTP_X_MULTILINE_HEADER']
+  end
+
   def test_continuation_eats_leading_spaces
     parser = HttpParser.new
     header = "GET / HTTP/1.1\r\n" \