unicorn-camilo 4.8.2.5.19 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/.document +0 -1
  3. data/.gitignore +2 -2
  4. data/{.wrongdoc.yml → .olddoc.yml} +7 -2
  5. data/Documentation/unicorn.1.txt +9 -2
  6. data/Documentation/unicorn_rails.1.txt +2 -2
  7. data/FAQ +9 -1
  8. data/GIT-VERSION-GEN +1 -1
  9. data/GNUmakefile +31 -46
  10. data/HACKING +13 -27
  11. data/ISSUES +80 -16
  12. data/KNOWN_ISSUES +10 -10
  13. data/Links +10 -7
  14. data/PHILOSOPHY +1 -1
  15. data/README +8 -13
  16. data/Rakefile +0 -44
  17. data/Sandbox +1 -1
  18. data/TUNING +6 -3
  19. data/archive/.gitignore +3 -0
  20. data/archive/slrnpull.conf +4 -0
  21. data/bin/unicorn +1 -1
  22. data/bin/unicorn_rails +1 -1
  23. data/examples/unicorn.conf.rb +11 -0
  24. data/ext/unicorn_http/httpdate.c +1 -1
  25. data/ext/unicorn_http/unicorn_http.rl +48 -150
  26. data/lib/unicorn.rb +9 -15
  27. data/lib/unicorn/configurator.rb +3 -20
  28. data/lib/unicorn/const.rb +2 -25
  29. data/lib/unicorn/http_request.rb +4 -1
  30. data/lib/unicorn/http_response.rb +1 -3
  31. data/lib/unicorn/http_server.rb +85 -86
  32. data/lib/unicorn/socket_helper.rb +33 -67
  33. data/lib/unicorn/tee_input.rb +8 -1
  34. data/lib/unicorn/tmpio.rb +2 -4
  35. data/lib/unicorn/util.rb +1 -0
  36. data/lib/unicorn/worker.rb +1 -13
  37. data/t/GNUmakefile +1 -5
  38. data/t/README +1 -1
  39. data/t/t0002-parser-error.sh +3 -3
  40. data/test/exec/test_exec.rb +1 -1
  41. data/test/test_helper.rb +2 -2
  42. data/test/unit/test_http_parser.rb +3 -3
  43. data/test/unit/test_http_parser_ng.rb +8 -117
  44. data/test/unit/test_request.rb +1 -1
  45. data/test/unit/test_response.rb +3 -9
  46. data/test/unit/test_server.rb +3 -3
  47. data/test/unit/test_signals.rb +1 -1
  48. data/test/unit/test_socket_helper.rb +5 -5
  49. data/test/unit/test_tee_input.rb +10 -0
  50. data/test/unit/test_upload.rb +1 -1
  51. data/test/unit/test_util.rb +1 -1
  52. data/unicorn.gemspec +7 -10
  53. metadata +15 -33
  54. data/examples/git.ru +0 -13
  55. data/lib/unicorn/app/exec_cgi.rb +0 -154
  56. data/lib/unicorn/app/inetd.rb +0 -109
  57. data/lib/unicorn/ssl_client.rb +0 -11
  58. data/lib/unicorn/ssl_configurator.rb +0 -104
  59. data/lib/unicorn/ssl_server.rb +0 -42
  60. data/local.mk.sample +0 -59
  61. data/script/isolate_for_tests +0 -31
  62. data/t/t0016-trust-x-forwarded-false.sh +0 -30
  63. data/t/t0017-trust-x-forwarded-true.sh +0 -30
  64. data/test/unit/test_http_parser_xftrust.rb +0 -38
  65. data/test/unit/test_sni_hostnames.rb +0 -47
data/KNOWN_ISSUES CHANGED
@@ -17,16 +17,6 @@ acceptable solution. Those issues are documented here.
17
17
  have builtin workarounds for Kernel#rand and OpenSSL::Random users,
18
18
  but applications may use other PRNGs.
19
19
 
20
- * Under some versions of Ruby 1.8, it is necessary to call +srand+ in an
21
- after_fork hook to get correct random number generation. We have a builtin
22
- workaround for this starting with \Unicorn 3.6.1
23
-
24
- See http://redmine.ruby-lang.org/issues/show/4338
25
-
26
- * On Ruby 1.8 prior to Ruby 1.8.7-p248, *BSD platforms have a broken
27
- stdio that causes failure for file uploads larger than 112K. Upgrade
28
- your version of Ruby or continue using Unicorn 1.x/3.4.x.
29
-
30
20
  * For notes on sandboxing tools such as Bundler or Isolate,
31
21
  see the {Sandbox}[link:Sandbox.html] page.
32
22
 
@@ -44,6 +34,16 @@ acceptable solution. Those issues are documented here.
44
34
 
45
35
  == Known Issues (Old)
46
36
 
37
+ * Under some versions of Ruby 1.8, it is necessary to call +srand+ in an
38
+ after_fork hook to get correct random number generation. We have a builtin
39
+ workaround for this starting with \Unicorn 3.6.1
40
+
41
+ See http://redmine.ruby-lang.org/issues/show/4338
42
+
43
+ * On Ruby 1.8 prior to Ruby 1.8.7-p248, *BSD platforms have a broken
44
+ stdio that causes failure for file uploads larger than 112K. Upgrade
45
+ your version of Ruby or continue using Unicorn 1.x/3.4.x.
46
+
47
47
  * Under Ruby 1.9.1, methods like Array#shuffle and Array#sample will
48
48
  segfault if called after forking. Upgrade to Ruby 1.9.2 or call
49
49
  "Kernel.rand" in your after_fork hook to reinitialize the random
data/Links CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  If you're interested in \Unicorn, you may be interested in some of the projects
4
4
  listed below. If you have any links to add/change/remove, please tell us at
5
- mailto:mongrel-unicorn@rubyforge.org!
5
+ mailto:unicorn-public@bogomips.org!
6
6
 
7
7
  == Disclaimer
8
8
 
@@ -31,10 +31,10 @@ or services behind them.
31
31
 
32
32
  === \Unicorn is written to work with
33
33
 
34
- * {Rack}[http://rack.rubyforge.org/] - a minimal interface between webservers
34
+ * {Rack}[http://rack.github.io/] - a minimal interface between webservers
35
35
  supporting Ruby and Ruby frameworks
36
36
 
37
- * {Ruby}[http://ruby-lang.org/] - the programming language of Rack and \Unicorn
37
+ * {Ruby}[http://www.ruby-lang.org/] - the programming language of Rack and \Unicorn
38
38
 
39
39
  * {nginx}[http://nginx.org/] - the reverse proxy for use with \Unicorn
40
40
 
@@ -44,13 +44,16 @@ or services behind them.
44
44
 
45
45
  * {Green Unicorn}[http://gunicorn.org/] - a Python version of \Unicorn
46
46
 
47
- * {Rainbows!}[http://rainbows.rubyforge.org/] - \Unicorn for sleepy
48
- apps and slow clients.
47
+ * {Rainbows!}[http://rainbows.bogomips.org/] - \Unicorn for sleepy
48
+ apps and slow clients (historical).
49
+
50
+ * {yahns}[http://yahns.yhbt.net/] - like Rainbows!, but with fewer options
51
+ and designed for energy efficiency on idle sites.
49
52
 
50
53
  === Prior Work
51
54
 
52
- * {Mongrel}[http://mongrel.rubyforge.org/] - the awesome webserver \Unicorn is
53
- based on
55
+ * {Mongrel}[http://rubygems.org/gems/mongrel] - the awesome webserver
56
+ unicorn is based on
54
57
 
55
58
  * {david}[http://bogomips.org/david.git] - a tool to explain why you need
56
59
  nginx in front of \Unicorn
data/PHILOSOPHY CHANGED
@@ -138,7 +138,7 @@ where the HTTP connection spends a large amount of time idle.
138
138
  Nevertheless, the ease of troubleshooting, debugging, and management of
139
139
  unicorn may still outweigh the drawbacks for these applications.
140
140
 
141
- The {Rainbows!}[http://rainbows.rubyforge.org/] aims to fill the gap for
141
+ The {Rainbows!}[http://rainbows.bogomips.org/] aims to fill the gap for
142
142
  odd corner cases where the nginx + unicorn combination is not enough.
143
143
  While Rainbows! management/administration is largely identical to
144
144
  unicorn, Rainbows! is far more ambitious and has seen little real-world
data/README CHANGED
@@ -10,9 +10,10 @@ both the the request and response in between \Unicorn and slow clients.
10
10
 
11
11
  * Designed for Rack, Unix, fast clients, and ease-of-debugging. We
12
12
  cut out everything that is better supported by the operating system,
13
- {nginx}[http://nginx.net/] or {Rack}[http://rack.rubyforge.org/].
13
+ {nginx}[http://nginx.net/] or {Rack}[http://rack.github.io/].
14
14
 
15
- * Compatible with both Ruby 1.8 and 1.9. Rubinius support is in-progress.
15
+ * Compatible with Ruby 1.9.3 and later.
16
+ unicorn 4.8.x will remain supported for Ruby 1.8 users.
16
17
 
17
18
  * Process management: \Unicorn will reap and restart workers that
18
19
  die from broken apps. There is no need to manage multiple processes
@@ -74,12 +75,7 @@ See the included LICENSE file for details.
74
75
  The library consists of a C extension so you'll need a C compiler
75
76
  and Ruby development libraries/headers.
76
77
 
77
- You may download the tarball from the Mongrel project page on Rubyforge
78
- and run setup.rb after unpacking it:
79
-
80
- http://rubyforge.org/frs/?group_id=1306
81
-
82
- You may also install it via RubyGems on RubyGems.org:
78
+ You may install it via RubyGems on RubyGems.org:
83
79
 
84
80
  gem install unicorn
85
81
 
@@ -100,13 +96,13 @@ from git.
100
96
 
101
97
  == Usage
102
98
 
103
- === non-Rails Rack applications
99
+ === Rack (including Rails 3+) applications
104
100
 
105
101
  In APP_ROOT, run:
106
102
 
107
103
  unicorn
108
104
 
109
- === for Rails applications (should work for all 1.2 or later versions)
105
+ === Ancient Rails 1.2 - 2.x versions
110
106
 
111
107
  In RAILS_ROOT, run:
112
108
 
@@ -127,8 +123,7 @@ The default settings are designed for maximum out-of-the-box
127
123
  compatibility with existing applications.
128
124
 
129
125
  Most command-line options for other Rack applications (above) are also
130
- supported. Run `unicorn -h` or `unicorn_rails -h` to see command-line
131
- options.
126
+ supported. Run `unicorn -h` to see command-line options.
132
127
 
133
128
  == Disclaimer
134
129
 
@@ -143,7 +138,7 @@ regarding this.
143
138
 
144
139
  All feedback (bug reports, user/development dicussion, patches, pull
145
140
  requests) go to the mailing list/newsgroup. See the ISSUES document for
146
- information on the {mailing list}[mailto:mongrel-unicorn@rubyforge.org].
141
+ information on the {mailing list}[mailto:unicorn-public@bogomips.org].
147
142
 
148
143
  For the latest on \Unicorn releases, you may also finger us at
149
144
  unicorn@bogomips.org or check our NEWS page (and subscribe to our Atom
data/Rakefile CHANGED
@@ -1,47 +1,3 @@
1
- # -*- encoding: binary -*-
2
- autoload :Gem, 'rubygems'
3
- require 'wrongdoc'
4
-
5
- cgit_url = Wrongdoc.config[:cgit_url]
6
- git_url = Wrongdoc.config[:git_url]
7
-
8
- desc "post to FM"
9
- task :fm_update do
10
- require 'tempfile'
11
- require 'net/http'
12
- require 'net/netrc'
13
- require 'json'
14
- version = ENV['VERSION'] or abort "VERSION= needed"
15
- uri = URI.parse('https://freecode.com/projects/unicorn/releases.json')
16
- rc = Net::Netrc.locate('unicorn-fm') or abort "~/.netrc not found"
17
- api_token = rc.password
18
- _, subject, body = `git cat-file tag v#{version}`.split(/\n\n/, 3)
19
- tmp = Tempfile.new('fm-changelog')
20
- tmp.puts subject
21
- tmp.puts
22
- tmp.puts body
23
- tmp.flush
24
- system(ENV["VISUAL"], tmp.path) or abort "#{ENV["VISUAL"]} failed: #$?"
25
- changelog = File.read(tmp.path).strip
26
-
27
- req = {
28
- "auth_code" => api_token,
29
- "release" => {
30
- "tag_list" => "Experimental",
31
- "version" => version,
32
- "changelog" => changelog,
33
- },
34
- }.to_json
35
-
36
- if ! changelog.strip.empty? && version =~ %r{\A[\d\.]+\d+\z}
37
- Net::HTTP.start(uri.host, uri.port, :use_ssl => true) do |http|
38
- p http.post(uri.path, req, {'Content-Type'=>'application/json'})
39
- end
40
- else
41
- warn "not updating freshmeat for v#{version}"
42
- end
43
- end
44
-
45
1
  # optional rake-compiler support in case somebody needs to cross compile
46
2
  begin
47
3
  mk = "ext/unicorn_http/Makefile"
data/Sandbox CHANGED
@@ -86,7 +86,7 @@ For now workarounds include doing one of the following:
86
86
 
87
87
  3. Explicitly setting RUBYLIB or $LOAD_PATH to include any gem path
88
88
  where the unicorn gem is installed
89
- (e.g. /usr/lib/ruby/gems/1.9.1/gems/unicorn-VERSION/lib)
89
+ (e.g. /usr/lib/ruby/gems/1.9.3/gems/unicorn-VERSION/lib)
90
90
 
91
91
  === RUBYOPT pollution from SIGUSR2 upgrades
92
92
 
data/TUNING CHANGED
@@ -17,9 +17,12 @@ See Unicorn::Configurator for details on the config file format.
17
17
  \Unicorn is NOT for serving slow clients, that is the job of nginx.
18
18
 
19
19
  * worker_processes should be *at* *least* the number of CPU cores on
20
- a dedicated server. If your application has occasionally slow
21
- responses that are /not/ CPU-intensive, you may increase this to
22
- workaround those inefficiencies.
20
+ a dedicated server (unless you do not have enough memory).
21
+ If your application has occasionally slow responses that are /not/
22
+ CPU-intensive, you may increase this to workaround those inefficiencies.
23
+
24
+ * Under Ruby 2.2 or later, Etc.nprocessors may be used to determine
25
+ the number of CPU cores present.
23
26
 
24
27
  * worker_processes may be increased for Unicorn::OobGC users to provide
25
28
  more consistent response times.
@@ -0,0 +1,3 @@
1
+ /data
2
+ /news
3
+ /requests
@@ -0,0 +1,4 @@
1
+ # group_name max expire headers_only
2
+ gmane.comp.lang.ruby.unicorn.general 1000000000 1000000000 0
3
+
4
+ # usage: slrnpull -d $PWD -h news.gmane.org --no-post
data/bin/unicorn CHANGED
@@ -29,7 +29,7 @@ op = OptionParser.new("", 24, ' ') do |opts|
29
29
 
30
30
  opts.on("-I", "--include PATH",
31
31
  "specify $LOAD_PATH (may be used more than once)") do |path|
32
- $LOAD_PATH.unshift(*path.split(/:/))
32
+ $LOAD_PATH.unshift(*path.split(':'))
33
33
  end
34
34
 
35
35
  opts.on("-r", "--require LIBRARY",
data/bin/unicorn_rails CHANGED
@@ -30,7 +30,7 @@ op = OptionParser.new("", 24, ' ') do |opts|
30
30
 
31
31
  opts.on("-I", "--include PATH",
32
32
  "specify $LOAD_PATH (may be used more than once)") do |path|
33
- $LOAD_PATH.unshift(*path.split(/:/))
33
+ $LOAD_PATH.unshift(*path.split(':'))
34
34
  end
35
35
 
36
36
  opts.on("-r", "--require LIBRARY",
@@ -54,12 +54,23 @@ GC.respond_to?(:copy_on_write_friendly=) and
54
54
  # fast LAN.
55
55
  check_client_connection false
56
56
 
57
+ # local variable to guard against running a hook multiple times
58
+ run_once = true
59
+
57
60
  before_fork do |server, worker|
58
61
  # the following is highly recomended for Rails + "preload_app true"
59
62
  # as there's no need for the master process to hold a connection
60
63
  defined?(ActiveRecord::Base) and
61
64
  ActiveRecord::Base.connection.disconnect!
62
65
 
66
+ # Occasionally, it may be necessary to run non-idempotent code in the
67
+ # master before forking. Keep in mind the above disconnect! example
68
+ # is idempotent and does not need a guard.
69
+ if run_once
70
+ # do_something_once_here ...
71
+ run_once = false # prevent from firing again
72
+ end
73
+
63
74
  # The following is only recommended for memory/DB-constrained
64
75
  # installations. It is not needed if your system can house
65
76
  # twice as many worker_processes as you have configured.
@@ -66,7 +66,7 @@ static VALUE httpdate(VALUE self)
66
66
 
67
67
  void init_unicorn_httpdate(void)
68
68
  {
69
- VALUE mod = rb_const_get(rb_cObject, rb_intern("Unicorn"));
69
+ VALUE mod = rb_define_module("Unicorn");
70
70
  mod = rb_define_module_under(mod, "HttpResponse");
71
71
 
72
72
  buf = rb_str_new(0, buf_capa - 1);
@@ -29,82 +29,27 @@ void init_unicorn_httpdate(void);
29
29
  /* all of these flags need to be set for keepalive to be supported */
30
30
  #define UH_FL_KEEPALIVE (UH_FL_KAVERSION | UH_FL_REQEOF | UH_FL_HASHEADER)
31
31
 
32
- /*
33
- * whether or not to trust X-Forwarded-Proto and X-Forwarded-SSL when
34
- * setting rack.url_scheme
35
- */
36
- static VALUE trust_x_forward = Qtrue;
37
-
38
- static unsigned long keepalive_requests = 100; /* same as nginx */
39
-
40
- /*
41
- * Returns the maximum number of keepalive requests a client may make
42
- * before the parser refuses to continue.
43
- */
44
- static VALUE ka_req(VALUE self)
45
- {
46
- return ULONG2NUM(keepalive_requests);
47
- }
48
-
49
- /*
50
- * Sets the maximum number of keepalive requests a client may make.
51
- * A special value of +nil+ causes this to be the maximum value
52
- * possible (this is architecture-dependent).
53
- */
54
- static VALUE set_ka_req(VALUE self, VALUE val)
55
- {
56
- keepalive_requests = NIL_P(val) ? ULONG_MAX : NUM2ULONG(val);
57
-
58
- return ka_req(self);
59
- }
60
-
61
- /*
62
- * Sets whether or not the parser will trust X-Forwarded-Proto and
63
- * X-Forwarded-SSL headers and set "rack.url_scheme" to "https" accordingly.
64
- * Rainbows!/Zbatery installations facing untrusted clients directly
65
- * should set this to +false+
66
- */
67
- static VALUE set_xftrust(VALUE self, VALUE val)
68
- {
69
- if (Qtrue == val || Qfalse == val)
70
- trust_x_forward = val;
71
- else
72
- rb_raise(rb_eTypeError, "must be true or false");
73
-
74
- return val;
75
- }
76
-
77
- /*
78
- * returns whether or not the parser will trust X-Forwarded-Proto and
79
- * X-Forwarded-SSL headers and set "rack.url_scheme" to "https" accordingly
80
- */
81
- static VALUE xftrust(VALUE self)
82
- {
83
- return trust_x_forward;
84
- }
85
-
86
- static size_t MAX_HEADER_LEN = 1024 * (80 + 32); /* same as Mongrel */
32
+ static unsigned int MAX_HEADER_LEN = 1024 * (80 + 32); /* same as Mongrel */
87
33
 
88
34
  /* this is only intended for use with Rainbows! */
89
35
  static VALUE set_maxhdrlen(VALUE self, VALUE len)
90
36
  {
91
- return SIZET2NUM(MAX_HEADER_LEN = NUM2SIZET(len));
37
+ return UINT2NUM(MAX_HEADER_LEN = NUM2UINT(len));
92
38
  }
93
39
 
94
40
  /* keep this small for Rainbows! since every client has one */
95
41
  struct http_parser {
96
42
  int cs; /* Ragel internal state */
97
43
  unsigned int flags;
98
- unsigned long nr_requests;
99
- size_t mark;
100
- size_t offset;
44
+ unsigned int mark;
45
+ unsigned int offset;
101
46
  union { /* these 2 fields don't nest */
102
- size_t field;
103
- size_t query;
47
+ unsigned int field;
48
+ unsigned int query;
104
49
  } start;
105
50
  union {
106
- size_t field_len; /* only used during header processing */
107
- size_t dest_offset; /* only used during body processing */
51
+ unsigned int field_len; /* only used during header processing */
52
+ unsigned int dest_offset; /* only used during body processing */
108
53
  } s;
109
54
  VALUE buf;
110
55
  VALUE env;
@@ -124,13 +69,25 @@ static void parser_raise(VALUE klass, const char *msg)
124
69
  VALUE exc = rb_exc_new2(klass, msg);
125
70
  VALUE bt = rb_ary_new();
126
71
 
127
- rb_funcall(exc, id_set_backtrace, 1, bt);
128
- rb_exc_raise(exc);
72
+ rb_funcall(exc, id_set_backtrace, 1, bt);
73
+ rb_exc_raise(exc);
74
+ }
75
+
76
+ static inline unsigned int ulong2uint(unsigned long n)
77
+ {
78
+ unsigned int i = (unsigned int)n;
79
+
80
+ if (sizeof(unsigned int) != sizeof(unsigned long)) {
81
+ if ((unsigned long)i != n) {
82
+ rb_raise(rb_eRangeError, "too large to be 32-bit uint: %lu", n);
83
+ }
84
+ }
85
+ return i;
129
86
  }
130
87
 
131
88
  #define REMAINING (unsigned long)(pe - p)
132
- #define LEN(AT, FPC) (FPC - buffer - hp->AT)
133
- #define MARK(M,FPC) (hp->M = (FPC) - buffer)
89
+ #define LEN(AT, FPC) (ulong2uint(FPC - buffer) - hp->AT)
90
+ #define MARK(M,FPC) (hp->M = ulong2uint((FPC) - buffer))
134
91
  #define PTR_TO(F) (buffer + hp->F)
135
92
  #define STR_NEW(M,FPC) rb_str_new(PTR_TO(M), LEN(M, FPC))
136
93
  #define STRIPPED_STR_NEW(M,FPC) stripped_str_new(PTR_TO(M), LEN(M, FPC))
@@ -466,7 +423,7 @@ http_parser_execute(struct http_parser *hp, char *buffer, size_t len)
466
423
  post_exec: /* "_out:" also goes here */
467
424
  if (hp->cs != http_parser_error)
468
425
  hp->cs = cs;
469
- hp->offset = p - buffer;
426
+ hp->offset = ulong2uint(p - buffer);
470
427
 
471
428
  assert(p <= pe && "buffer overflow after parsing execute");
472
429
  assert(hp->offset <= len && "offset longer than length");
@@ -491,26 +448,29 @@ static void set_url_scheme(VALUE env, VALUE *server_port)
491
448
  VALUE scheme = rb_hash_aref(env, g_rack_url_scheme);
492
449
 
493
450
  if (NIL_P(scheme)) {
494
- if (trust_x_forward == Qfalse) {
495
- scheme = g_http;
451
+ /*
452
+ * would anybody be horribly opposed to removing the X-Forwarded-SSL
453
+ * and X-Forwarded-Proto handling from this parser? We've had it
454
+ * forever and nobody has said anything against it, either.
455
+ * Anyways, please send comments to our public mailing list:
456
+ * unicorn-public@bogomips.org (no HTML mail, no subscription necessary)
457
+ */
458
+ scheme = rb_hash_aref(env, g_http_x_forwarded_ssl);
459
+ if (!NIL_P(scheme) && STR_CSTR_EQ(scheme, "on")) {
460
+ *server_port = g_port_443;
461
+ scheme = g_https;
496
462
  } else {
497
- scheme = rb_hash_aref(env, g_http_x_forwarded_ssl);
498
- if (!NIL_P(scheme) && STR_CSTR_EQ(scheme, "on")) {
499
- *server_port = g_port_443;
500
- scheme = g_https;
463
+ scheme = rb_hash_aref(env, g_http_x_forwarded_proto);
464
+ if (NIL_P(scheme)) {
465
+ scheme = g_http;
501
466
  } else {
502
- scheme = rb_hash_aref(env, g_http_x_forwarded_proto);
503
- if (NIL_P(scheme)) {
504
- scheme = g_http;
467
+ long len = RSTRING_LEN(scheme);
468
+ if (len >= 5 && !memcmp(RSTRING_PTR(scheme), "https", 5)) {
469
+ if (len != 5)
470
+ scheme = g_https;
471
+ *server_port = g_port_443;
505
472
  } else {
506
- long len = RSTRING_LEN(scheme);
507
- if (len >= 5 && !memcmp(RSTRING_PTR(scheme), "https", 5)) {
508
- if (len != 5)
509
- scheme = g_https;
510
- *server_port = g_port_443;
511
- } else {
512
- scheme = g_http;
513
- }
473
+ scheme = g_http;
514
474
  }
515
475
  }
516
476
  }
@@ -608,7 +568,6 @@ static VALUE HttpParser_init(VALUE self)
608
568
  http_parser_init(hp);
609
569
  hp->buf = rb_str_new(NULL, 0);
610
570
  hp->env = rb_hash_new();
611
- hp->nr_requests = keepalive_requests;
612
571
 
613
572
  return self;
614
573
  }
@@ -631,55 +590,6 @@ static VALUE HttpParser_clear(VALUE self)
631
590
  return self;
632
591
  }
633
592
 
634
- /**
635
- * call-seq:
636
- * parser.dechunk! => parser
637
- *
638
- * Resets the parser to a state suitable for dechunking response bodies
639
- *
640
- */
641
- static VALUE HttpParser_dechunk_bang(VALUE self)
642
- {
643
- struct http_parser *hp = data_get(self);
644
-
645
- http_parser_init(hp);
646
-
647
- /*
648
- * we don't care about trailers in dechunk-only mode,
649
- * but if we did we'd set UH_FL_HASTRAILER and clear hp->env
650
- */
651
- if (0) {
652
- rb_funcall(hp->env, id_clear, 0);
653
- hp->flags = UH_FL_HASTRAILER;
654
- }
655
-
656
- hp->flags |= UH_FL_HASBODY | UH_FL_INBODY | UH_FL_CHUNKED;
657
- hp->cs = http_parser_en_ChunkedBody;
658
-
659
- return self;
660
- }
661
-
662
- /**
663
- * call-seq:
664
- * parser.reset => nil
665
- *
666
- * Resets the parser to it's initial state so that you can reuse it
667
- * rather than making new ones.
668
- *
669
- * This method is deprecated and to be removed in Unicorn 4.x
670
- */
671
- static VALUE HttpParser_reset(VALUE self)
672
- {
673
- static int warned;
674
-
675
- if (!warned) {
676
- rb_warn("Unicorn::HttpParser#reset is deprecated; "
677
- "use Unicorn::HttpParser#clear instead");
678
- }
679
- HttpParser_clear(self);
680
- return Qnil;
681
- }
682
-
683
593
  static void advance_str(VALUE str, off_t nr)
684
594
  {
685
595
  long len = RSTRING_LEN(str);
@@ -842,15 +752,13 @@ static VALUE HttpParser_keepalive(VALUE self)
842
752
  * parser.next? => true or false
843
753
  *
844
754
  * Exactly like HttpParser#keepalive?, except it will reset the internal
845
- * parser state on next parse if it returns true. It will also respect
846
- * the maximum *keepalive_requests* value and return false if that is
847
- * reached.
755
+ * parser state on next parse if it returns true.
848
756
  */
849
757
  static VALUE HttpParser_next(VALUE self)
850
758
  {
851
759
  struct http_parser *hp = data_get(self);
852
760
 
853
- if ((HP_FL_ALL(hp, KEEPALIVE)) && (hp->nr_requests-- != 0)) {
761
+ if (HP_FL_ALL(hp, KEEPALIVE)) {
854
762
  HP_FL_SET(hp, TO_CLEAR);
855
763
  return Qtrue;
856
764
  }
@@ -969,7 +877,7 @@ void Init_unicorn_http(void)
969
877
  {
970
878
  VALUE mUnicorn, cHttpParser;
971
879
 
972
- mUnicorn = rb_const_get(rb_cObject, rb_intern("Unicorn"));
880
+ mUnicorn = rb_define_module("Unicorn");
973
881
  cHttpParser = rb_define_class_under(mUnicorn, "HttpParser", rb_cObject);
974
882
  eHttpParserError =
975
883
  rb_define_class_under(mUnicorn, "HttpParserError", rb_eIOError);
@@ -982,8 +890,6 @@ void Init_unicorn_http(void)
982
890
  rb_define_alloc_func(cHttpParser, HttpParser_alloc);
983
891
  rb_define_method(cHttpParser, "initialize", HttpParser_init, 0);
984
892
  rb_define_method(cHttpParser, "clear", HttpParser_clear, 0);
985
- rb_define_method(cHttpParser, "reset", HttpParser_reset, 0);
986
- rb_define_method(cHttpParser, "dechunk!", HttpParser_dechunk_bang, 0);
987
893
  rb_define_method(cHttpParser, "parse", HttpParser_parse, 0);
988
894
  rb_define_method(cHttpParser, "add_parse", HttpParser_add_parse, 1);
989
895
  rb_define_method(cHttpParser, "headers", HttpParser_headers, 2);
@@ -1012,14 +918,6 @@ void Init_unicorn_http(void)
1012
918
  */
1013
919
  rb_define_const(cHttpParser, "LENGTH_MAX", OFFT2NUM(UH_OFF_T_MAX));
1014
920
 
1015
- /* default value for keepalive_requests */
1016
- rb_define_const(cHttpParser, "KEEPALIVE_REQUESTS_DEFAULT",
1017
- ULONG2NUM(keepalive_requests));
1018
-
1019
- rb_define_singleton_method(cHttpParser, "keepalive_requests", ka_req, 0);
1020
- rb_define_singleton_method(cHttpParser, "keepalive_requests=", set_ka_req, 1);
1021
- rb_define_singleton_method(cHttpParser, "trust_x_forwarded=", set_xftrust, 1);
1022
- rb_define_singleton_method(cHttpParser, "trust_x_forwarded?", xftrust, 0);
1023
921
  rb_define_singleton_method(cHttpParser, "max_header_len=", set_maxhdrlen, 1);
1024
922
 
1025
923
  init_common_fields();