Skip to content
Browse files

Merge commit 'upstream/0.14.5'

* commit 'upstream/0.14.5':
  Imported Upstream version 0.14.5
  • Loading branch information...
2 parents de7e494 + cbe652e commit ac8c426409d1a7a2889673a67307b73b78fdd5d1 @lamby committed Jul 2, 2012
Showing with 550 additions and 278 deletions.
  1. +1 −0 .gitignore
  2. +9 −0 .travis.yml
  3. +6 −0 README.rst
  4. +2 −0 THANKS
  5. +65 −54 doc/htdocs/configure.html
  6. +23 −23 doc/htdocs/css/index.css
  7. +23 −23 doc/htdocs/css/style.css
  8. +1 −13 doc/htdocs/deploy.html
  9. +15 −12 doc/htdocs/index.html
  10. +4 −2 doc/htdocs/install.html
  11. +85 −63 doc/htdocs/news.html
  12. +6 −4 doc/site/install.rst
  13. +19 −0 doc/site/news.rst
  14. +95 −0 examples/frameworks/pylonstest/development2.ini
  15. +1 −1 examples/supervisor.conf
  16. +1 −1 gunicorn/__init__.py
  17. +1 −6 gunicorn/app/base.py
  18. +11 −8 gunicorn/app/djangoapp.py
  19. +2 −1 gunicorn/app/pasterapp.py
  20. +11 −5 gunicorn/arbiter.py
  21. +23 −8 gunicorn/config.py
  22. +1 −1 gunicorn/http/errors.py
  23. +23 −13 gunicorn/http/message.py
  24. +2 −0 gunicorn/workers/async.py
  25. +7 −5 gunicorn/workers/base.py
  26. +2 −2 gunicorn/workers/geventlet.py
  27. +2 −1 gunicorn/workers/ggevent.py
  28. +4 −2 gunicorn/workers/gtornado.py
  29. +2 −0 gunicorn/workers/sync.py
  30. +8 −4 tests/001-test-valid-requests.py
  31. +13 −3 tests/002-test-invalid-requests.py
  32. +1 −1 tests/requests/invalid/008.http
  33. +3 −0 tests/requests/invalid/010.http
  34. +6 −0 tests/requests/invalid/010.py
  35. +5 −0 tests/requests/invalid/011.http
  36. +6 −0 tests/requests/invalid/011.py
  37. +5 −0 tests/requests/invalid/012.http
  38. +6 −0 tests/requests/invalid/012.py
  39. +4 −0 tests/requests/invalid/013.http
  40. +6 −0 tests/requests/invalid/013.py
  41. +3 −0 tests/requests/valid/024.http
  42. +16 −0 tests/requests/valid/024.py
  43. +10 −22 tests/treq.py
  44. +11 −0 tox.ini
View
1 .gitignore
@@ -23,3 +23,4 @@ html/
examples/frameworks/pylonstest/PasteScript*
examples/frameworks/pylonstest/pylonstest.egg-info/
examples/frameworks/django/testing/testdb.sql
+.tox
View
9 .travis.yml
@@ -0,0 +1,9 @@
+language: python
+
+python:
+ - 2.6
+ - 2.7
+ - pypy
+
+install: python setup.py install
+script: nosetests
View
6 README.rst
@@ -8,6 +8,12 @@ resource usage, and fairly speedy.
Feel free to join us in `#gunicorn`_ on freenode_.
+.. image::
+ https://secure.travis-ci.org/benoitc/gunicorn.png?branch=master
+ :alt: Build Status
+ :target: https://secure.travis-ci.org/benoitc/gunicorn
+
+
Installation
------------
View
2 THANKS
@@ -41,3 +41,5 @@ Maxim Kamenkov <mkamenkov@gmail.com>
Konstantin Kapustin <sirkonst@gmail.com>
Djoume Salvetti <djoume@freshbooks.com>
ZheFu Peng (CMGS) <ilskdw@gmail.com>
+Caleb Brown <git@calebbrown.id.au>
+Marc Abramowitz <marc@marc-abramowitz.com>
View
119 doc/htdocs/configure.html
@@ -225,6 +225,17 @@
workers it just means that the worker process is still communicating and
is not tied to the length of time required to handle a single request.</p>
</div>
+<div class="section" id="graceful-timeout">
+<h4><a class="toc-backref" href="#contents">graceful_timeout</a></h4>
+<ul class="simple">
+<li><tt class="docutils literal"><span class="pre">--graceful-timeout</span> INT</tt></li>
+<li><tt class="docutils literal">30</tt></li>
+</ul>
+<p>Timeout for graceful workers restart.</p>
+<p>Generally set to thirty seconds. How max time worker can handle
+request after got restart signal. If the time is up worker will
+be force killed.</p>
+</div>
<div class="section" id="keepalive">
<h4><a class="toc-backref" href="#contents">keepalive</a></h4>
<ul class="simple">
@@ -250,8 +261,8 @@
restriction on the length of a request-URI allowed for a request
on the server. A server needs this value to be large enough to
hold any of its resource names, including any information that
-might be passed in the query part of a GET request. By default
-this value is 4094 and can't be larger than 8190.</p>
+might be passed in the query part of a GET request. Value is a number
+from 0 (unlimited) to 8190.</p>
<p>This parameter can be used to prevent any DDOS attack.</p>
</div>
<div class="section" id="limit-request-fields">
@@ -261,10 +272,10 @@
<li><tt class="docutils literal">100</tt></li>
</ul>
<p>Limit the number of HTTP headers fields in a request.</p>
-<p>Value is a number from 0 (unlimited) to 32768. This parameter is
-used to limit the number of headers in a request to prevent DDOS
-attack. Used with the <cite>limit_request_field_size</cite> it allows more
-safety.</p>
+<p>This parameter is used to limit the number of headers in a request to
+prevent DDOS attack. Used with the <cite>limit_request_field_size</cite> it allows
+more safety. By default this value is 100 and can't be larger than
+32768.</p>
</div>
<div class="section" id="limit-request-field-size">
<h4><a class="toc-backref" href="#contents">limit_request_field_size</a></h4>
@@ -344,7 +355,7 @@
<h4><a class="toc-backref" href="#contents">user</a></h4>
<ul class="simple">
<li><tt class="docutils literal"><span class="pre">-u</span> USER, <span class="pre">--user</span> USER</tt></li>
-<li><tt class="docutils literal">501</tt></li>
+<li><tt class="docutils literal">1000</tt></li>
</ul>
<p>Switch worker processes to run as this user.</p>
<p>A valid user id (as an integer) or the name of a user that can be
@@ -355,7 +366,7 @@
<h4><a class="toc-backref" href="#contents">group</a></h4>
<ul class="simple">
<li><tt class="docutils literal"><span class="pre">-g</span> GROUP, <span class="pre">--group</span> GROUP</tt></li>
-<li><tt class="docutils literal">20</tt></li>
+<li><tt class="docutils literal">1000</tt></li>
</ul>
<p>Switch worker process to run as this group.</p>
<p>A valid group id (as an integer) or the name of a user that can be
@@ -419,7 +430,7 @@
<li><tt class="docutils literal">None</tt></li>
</ul>
<p>The Access log file to write to.</p>
-<p>&quot;-&quot; means log to stdout.</p>
+<p>&quot;-&quot; means log to stderr.</p>
</div>
<div class="section" id="access-log-format">
<h4><a class="toc-backref" href="#contents">access_log_format</a></h4>
@@ -452,7 +463,7 @@
<li><tt class="docutils literal">-</tt></li>
</ul>
<p>The Error log file to write to.</p>
-<p>&quot;-&quot; means log to stdout.</p>
+<p>&quot;-&quot; means log to stderr.</p>
</div>
<div class="section" id="loglevel">
<h4><a class="toc-backref" href="#contents">loglevel</a></h4>
@@ -560,8 +571,7 @@
<ul>
<li><pre class="first literal-block">
def on_reload(server):
- for i in range(server.app.cfg.workers):
- server.spawn_worker()
+ pass
</pre>
</li>
</ul>
@@ -688,62 +698,63 @@
<li><a class="reference internal" href="#worker-connections" id="id15">worker_connections</a></li>
<li><a class="reference internal" href="#max-requests" id="id16">max_requests</a></li>
<li><a class="reference internal" href="#timeout" id="id17">timeout</a></li>
-<li><a class="reference internal" href="#keepalive" id="id18">keepalive</a></li>
+<li><a class="reference internal" href="#graceful-timeout" id="id18">graceful_timeout</a></li>
+<li><a class="reference internal" href="#keepalive" id="id19">keepalive</a></li>
</ul>
</li>
-<li><a class="reference internal" href="#security" id="id19">Security</a><ul>
-<li><a class="reference internal" href="#limit-request-line" id="id20">limit_request_line</a></li>
-<li><a class="reference internal" href="#limit-request-fields" id="id21">limit_request_fields</a></li>
-<li><a class="reference internal" href="#limit-request-field-size" id="id22">limit_request_field_size</a></li>
+<li><a class="reference internal" href="#security" id="id20">Security</a><ul>
+<li><a class="reference internal" href="#limit-request-line" id="id21">limit_request_line</a></li>
+<li><a class="reference internal" href="#limit-request-fields" id="id22">limit_request_fields</a></li>
+<li><a class="reference internal" href="#limit-request-field-size" id="id23">limit_request_field_size</a></li>
</ul>
</li>
-<li><a class="reference internal" href="#debugging" id="id23">Debugging</a><ul>
-<li><a class="reference internal" href="#debug" id="id24">debug</a></li>
-<li><a class="reference internal" href="#spew" id="id25">spew</a></li>
-<li><a class="reference internal" href="#check-config" id="id26">check_config</a></li>
+<li><a class="reference internal" href="#debugging" id="id24">Debugging</a><ul>
+<li><a class="reference internal" href="#debug" id="id25">debug</a></li>
+<li><a class="reference internal" href="#spew" id="id26">spew</a></li>
+<li><a class="reference internal" href="#check-config" id="id27">check_config</a></li>
</ul>
</li>
-<li><a class="reference internal" href="#server-mechanics" id="id27">Server Mechanics</a><ul>
-<li><a class="reference internal" href="#preload-app" id="id28">preload_app</a></li>
-<li><a class="reference internal" href="#daemon" id="id29">daemon</a></li>
-<li><a class="reference internal" href="#pidfile" id="id30">pidfile</a></li>
-<li><a class="reference internal" href="#user" id="id31">user</a></li>
-<li><a class="reference internal" href="#group" id="id32">group</a></li>
-<li><a class="reference internal" href="#umask" id="id33">umask</a></li>
-<li><a class="reference internal" href="#tmp-upload-dir" id="id34">tmp_upload_dir</a></li>
-<li><a class="reference internal" href="#secure-scheme-headers" id="id35">secure_scheme_headers</a></li>
-<li><a class="reference internal" href="#x-forwarded-for-header" id="id36">x_forwarded_for_header</a></li>
+<li><a class="reference internal" href="#server-mechanics" id="id28">Server Mechanics</a><ul>
+<li><a class="reference internal" href="#preload-app" id="id29">preload_app</a></li>
+<li><a class="reference internal" href="#daemon" id="id30">daemon</a></li>
+<li><a class="reference internal" href="#pidfile" id="id31">pidfile</a></li>
+<li><a class="reference internal" href="#user" id="id32">user</a></li>
+<li><a class="reference internal" href="#group" id="id33">group</a></li>
+<li><a class="reference internal" href="#umask" id="id34">umask</a></li>
+<li><a class="reference internal" href="#tmp-upload-dir" id="id35">tmp_upload_dir</a></li>
+<li><a class="reference internal" href="#secure-scheme-headers" id="id36">secure_scheme_headers</a></li>
+<li><a class="reference internal" href="#x-forwarded-for-header" id="id37">x_forwarded_for_header</a></li>
</ul>
</li>
-<li><a class="reference internal" href="#logging" id="id37">Logging</a><ul>
-<li><a class="reference internal" href="#accesslog" id="id38">accesslog</a></li>
-<li><a class="reference internal" href="#access-log-format" id="id39">access_log_format</a></li>
-<li><a class="reference internal" href="#errorlog" id="id40">errorlog</a></li>
-<li><a class="reference internal" href="#loglevel" id="id41">loglevel</a></li>
-<li><a class="reference internal" href="#logger-class" id="id42">logger_class</a></li>
-<li><a class="reference internal" href="#logconfig" id="id43">logconfig</a></li>
+<li><a class="reference internal" href="#logging" id="id38">Logging</a><ul>
+<li><a class="reference internal" href="#accesslog" id="id39">accesslog</a></li>
+<li><a class="reference internal" href="#access-log-format" id="id40">access_log_format</a></li>
+<li><a class="reference internal" href="#errorlog" id="id41">errorlog</a></li>
+<li><a class="reference internal" href="#loglevel" id="id42">loglevel</a></li>
+<li><a class="reference internal" href="#logger-class" id="id43">logger_class</a></li>
+<li><a class="reference internal" href="#logconfig" id="id44">logconfig</a></li>
</ul>
</li>
-<li><a class="reference internal" href="#process-naming" id="id44">Process Naming</a><ul>
-<li><a class="reference internal" href="#proc-name" id="id45">proc_name</a></li>
-<li><a class="reference internal" href="#default-proc-name" id="id46">default_proc_name</a></li>
+<li><a class="reference internal" href="#process-naming" id="id45">Process Naming</a><ul>
+<li><a class="reference internal" href="#proc-name" id="id46">proc_name</a></li>
+<li><a class="reference internal" href="#default-proc-name" id="id47">default_proc_name</a></li>
</ul>
</li>
-<li><a class="reference internal" href="#django" id="id47">Django</a><ul>
-<li><a class="reference internal" href="#django-settings" id="id48">django_settings</a></li>
-<li><a class="reference internal" href="#pythonpath" id="id49">pythonpath</a></li>
+<li><a class="reference internal" href="#django" id="id48">Django</a><ul>
+<li><a class="reference internal" href="#django-settings" id="id49">django_settings</a></li>
+<li><a class="reference internal" href="#pythonpath" id="id50">pythonpath</a></li>
</ul>
</li>
-<li><a class="reference internal" href="#server-hooks" id="id50">Server Hooks</a><ul>
-<li><a class="reference internal" href="#on-starting" id="id51">on_starting</a></li>
-<li><a class="reference internal" href="#on-reload" id="id52">on_reload</a></li>
-<li><a class="reference internal" href="#when-ready" id="id53">when_ready</a></li>
-<li><a class="reference internal" href="#pre-fork" id="id54">pre_fork</a></li>
-<li><a class="reference internal" href="#post-fork" id="id55">post_fork</a></li>
-<li><a class="reference internal" href="#pre-exec" id="id56">pre_exec</a></li>
-<li><a class="reference internal" href="#pre-request" id="id57">pre_request</a></li>
-<li><a class="reference internal" href="#post-request" id="id58">post_request</a></li>
-<li><a class="reference internal" href="#worker-exit" id="id59">worker_exit</a></li>
+<li><a class="reference internal" href="#server-hooks" id="id51">Server Hooks</a><ul>
+<li><a class="reference internal" href="#on-starting" id="id52">on_starting</a></li>
+<li><a class="reference internal" href="#on-reload" id="id53">on_reload</a></li>
+<li><a class="reference internal" href="#when-ready" id="id54">when_ready</a></li>
+<li><a class="reference internal" href="#pre-fork" id="id55">pre_fork</a></li>
+<li><a class="reference internal" href="#post-fork" id="id56">post_fork</a></li>
+<li><a class="reference internal" href="#pre-exec" id="id57">pre_exec</a></li>
+<li><a class="reference internal" href="#pre-request" id="id58">pre_request</a></li>
+<li><a class="reference internal" href="#post-request" id="id59">post_request</a></li>
+<li><a class="reference internal" href="#worker-exit" id="id60">worker_exit</a></li>
</ul>
</li>
</ul>
View
46 doc/htdocs/css/index.css
@@ -1,4 +1,4 @@
-/* line 17, /Library/Ruby/Gems/1.8/gems/compass-0.12.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
+/* line 17, /var/lib/gems/1.8/gems/compass-0.12.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
@@ -20,45 +20,45 @@ time, mark, audio, video {
vertical-align: baseline;
}
-/* line 20, /Library/Ruby/Gems/1.8/gems/compass-0.12.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
+/* line 20, /var/lib/gems/1.8/gems/compass-0.12.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
body {
line-height: 1;
}
-/* line 22, /Library/Ruby/Gems/1.8/gems/compass-0.12.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
+/* line 22, /var/lib/gems/1.8/gems/compass-0.12.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
ol, ul {
list-style: none;
}
-/* line 24, /Library/Ruby/Gems/1.8/gems/compass-0.12.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
+/* line 24, /var/lib/gems/1.8/gems/compass-0.12.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
table {
border-collapse: collapse;
border-spacing: 0;
}
-/* line 26, /Library/Ruby/Gems/1.8/gems/compass-0.12.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
+/* line 26, /var/lib/gems/1.8/gems/compass-0.12.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
caption, th, td {
text-align: left;
font-weight: normal;
vertical-align: middle;
}
-/* line 28, /Library/Ruby/Gems/1.8/gems/compass-0.12.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
+/* line 28, /var/lib/gems/1.8/gems/compass-0.12.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
q, blockquote {
quotes: none;
}
-/* line 101, /Library/Ruby/Gems/1.8/gems/compass-0.12.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
+/* line 101, /var/lib/gems/1.8/gems/compass-0.12.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
q:before, q:after, blockquote:before, blockquote:after {
content: "";
content: none;
}
-/* line 30, /Library/Ruby/Gems/1.8/gems/compass-0.12.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
+/* line 30, /var/lib/gems/1.8/gems/compass-0.12.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
a img {
border: none;
}
-/* line 114, /Library/Ruby/Gems/1.8/gems/compass-0.12.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
+/* line 114, /var/lib/gems/1.8/gems/compass-0.12.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section, summary {
display: block;
}
@@ -89,17 +89,17 @@ article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav,
width: 620px;
}
-/* line 4, /Library/Ruby/Gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */
+/* line 4, /var/lib/gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */
body {
font: 13px/1.5 Helvetica, Arial, 'Liberation Sans', FreeSans, sans-serif;
}
-/* line 6, /Library/Ruby/Gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */
+/* line 6, /var/lib/gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */
a:focus {
outline: 1px dotted invert;
}
-/* line 8, /Library/Ruby/Gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */
+/* line 8, /var/lib/gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */
hr {
border-color: #cccccc;
border-style: solid;
@@ -108,52 +108,52 @@ hr {
height: 0;
}
-/* line 14, /Library/Ruby/Gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */
+/* line 14, /var/lib/gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */
h1 {
font-size: 25px;
}
-/* line 16, /Library/Ruby/Gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */
+/* line 16, /var/lib/gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */
h2 {
font-size: 23px;
}
-/* line 18, /Library/Ruby/Gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */
+/* line 18, /var/lib/gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */
h3 {
font-size: 21px;
}
-/* line 20, /Library/Ruby/Gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */
+/* line 20, /var/lib/gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */
h4 {
font-size: 19px;
}
-/* line 22, /Library/Ruby/Gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */
+/* line 22, /var/lib/gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */
h5 {
font-size: 17px;
}
-/* line 24, /Library/Ruby/Gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */
+/* line 24, /var/lib/gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */
h6 {
font-size: 15px;
}
-/* line 26, /Library/Ruby/Gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */
+/* line 26, /var/lib/gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */
ol {
list-style: decimal;
}
-/* line 28, /Library/Ruby/Gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */
+/* line 28, /var/lib/gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */
ul {
list-style: square;
}
-/* line 30, /Library/Ruby/Gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */
+/* line 30, /var/lib/gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */
li {
margin-left: 30px;
}
-/* line 32, /Library/Ruby/Gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */
+/* line 32, /var/lib/gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */
p,
dl,
hr,
@@ -211,7 +211,7 @@ a, a:visited, a:hover, a:active {
margin-right: 10px;
list-style: none;
}
-/* line 11, /Library/Ruby/Gems/1.8/gems/compass-0.12.1/frameworks/compass/stylesheets/compass/typography/lists/_bullets.scss */
+/* line 11, /var/lib/gems/1.8/gems/compass-0.12.1/frameworks/compass/stylesheets/compass/typography/lists/_bullets.scss */
#menu ul li {
list-style-image: none;
list-style-type: none;
View
46 doc/htdocs/css/style.css
@@ -1,4 +1,4 @@
-/* line 17, /Library/Ruby/Gems/1.8/gems/compass-0.12.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
+/* line 17, /var/lib/gems/1.8/gems/compass-0.12.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
@@ -20,45 +20,45 @@ time, mark, audio, video {
vertical-align: baseline;
}
-/* line 20, /Library/Ruby/Gems/1.8/gems/compass-0.12.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
+/* line 20, /var/lib/gems/1.8/gems/compass-0.12.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
body {
line-height: 1;
}
-/* line 22, /Library/Ruby/Gems/1.8/gems/compass-0.12.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
+/* line 22, /var/lib/gems/1.8/gems/compass-0.12.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
ol, ul {
list-style: none;
}
-/* line 24, /Library/Ruby/Gems/1.8/gems/compass-0.12.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
+/* line 24, /var/lib/gems/1.8/gems/compass-0.12.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
table {
border-collapse: collapse;
border-spacing: 0;
}
-/* line 26, /Library/Ruby/Gems/1.8/gems/compass-0.12.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
+/* line 26, /var/lib/gems/1.8/gems/compass-0.12.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
caption, th, td {
text-align: left;
font-weight: normal;
vertical-align: middle;
}
-/* line 28, /Library/Ruby/Gems/1.8/gems/compass-0.12.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
+/* line 28, /var/lib/gems/1.8/gems/compass-0.12.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
q, blockquote {
quotes: none;
}
-/* line 101, /Library/Ruby/Gems/1.8/gems/compass-0.12.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
+/* line 101, /var/lib/gems/1.8/gems/compass-0.12.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
q:before, q:after, blockquote:before, blockquote:after {
content: "";
content: none;
}
-/* line 30, /Library/Ruby/Gems/1.8/gems/compass-0.12.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
+/* line 30, /var/lib/gems/1.8/gems/compass-0.12.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
a img {
border: none;
}
-/* line 114, /Library/Ruby/Gems/1.8/gems/compass-0.12.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
+/* line 114, /var/lib/gems/1.8/gems/compass-0.12.1/frameworks/compass/stylesheets/compass/reset/_utilities.scss */
article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section, summary {
display: block;
}
@@ -89,17 +89,17 @@ article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav,
width: 620px;
}
-/* line 4, /Library/Ruby/Gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */
+/* line 4, /var/lib/gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */
body {
font: 13px/1.5 Helvetica, Arial, 'Liberation Sans', FreeSans, sans-serif;
}
-/* line 6, /Library/Ruby/Gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */
+/* line 6, /var/lib/gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */
a:focus {
outline: 1px dotted invert;
}
-/* line 8, /Library/Ruby/Gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */
+/* line 8, /var/lib/gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */
hr {
border-color: #cccccc;
border-style: solid;
@@ -108,52 +108,52 @@ hr {
height: 0;
}
-/* line 14, /Library/Ruby/Gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */
+/* line 14, /var/lib/gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */
h1 {
font-size: 25px;
}
-/* line 16, /Library/Ruby/Gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */
+/* line 16, /var/lib/gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */
h2 {
font-size: 23px;
}
-/* line 18, /Library/Ruby/Gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */
+/* line 18, /var/lib/gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */
h3 {
font-size: 21px;
}
-/* line 20, /Library/Ruby/Gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */
+/* line 20, /var/lib/gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */
h4 {
font-size: 19px;
}
-/* line 22, /Library/Ruby/Gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */
+/* line 22, /var/lib/gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */
h5 {
font-size: 17px;
}
-/* line 24, /Library/Ruby/Gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */
+/* line 24, /var/lib/gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */
h6 {
font-size: 15px;
}
-/* line 26, /Library/Ruby/Gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */
+/* line 26, /var/lib/gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */
ol {
list-style: decimal;
}
-/* line 28, /Library/Ruby/Gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */
+/* line 28, /var/lib/gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */
ul {
list-style: square;
}
-/* line 30, /Library/Ruby/Gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */
+/* line 30, /var/lib/gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */
li {
margin-left: 30px;
}
-/* line 32, /Library/Ruby/Gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */
+/* line 32, /var/lib/gems/1.8/gems/compass-960-plugin-0.10.4/stylesheets/960/_text.sass */
p,
dl,
hr,
@@ -211,7 +211,7 @@ a, a:visited, a:hover, a:active {
margin-right: 10px;
list-style: none;
}
-/* line 11, /Library/Ruby/Gems/1.8/gems/compass-0.12.1/frameworks/compass/stylesheets/compass/typography/lists/_bullets.scss */
+/* line 11, /var/lib/gems/1.8/gems/compass-0.12.1/frameworks/compass/stylesheets/compass/typography/lists/_bullets.scss */
#menu ul li {
list-style-image: none;
list-style-type: none;
View
14 doc/htdocs/deploy.html
@@ -145,18 +145,6 @@
will fork-exec which creates an unmonitored process and generally just
confuses the monitor services.</p>
</div>
-<div class="section" id="circus">
-<h3><a class="toc-backref" href="#contents">Circus</a></h3>
-<p><a class="reference external" href="http://circus.readthedocs.org/en/latest/index.html">Circus</a> can be
-used to monitor gunicorn. A simple configuration is:</p>
-<pre class="literal-block">
-[watcher:mywebapp]
-cmd = gunicorn -w 3 test:app
-working_dir = /Users/benoitc/work/gunicorn/examples
-send_hup = true
-</pre>
-<p>Then you can easily manage Gunicorn using the <a class="reference external" href="http://circus.readthedocs.org/en/latest/commands/#cli">circusctl</a> command.</p>
-</div>
<div class="section" id="runit">
<h3><a class="toc-backref" href="#contents">Runit</a></h3>
<p>A popular method for deploying Gunicorn is to have it monitored by <a class="reference external" href="http://smarden.org/runit/">runit</a>.
@@ -231,4 +219,4 @@
</div>
</div>
</body>
-</html>
+</html>
View
27 doc/htdocs/index.html
@@ -79,19 +79,22 @@
</ul>
</div>
<div class="blurb">
- <h3>Version 0.14.3 / 2012-05-15</h3>
+ <h3>Version 0.14.5 / 2012-06-24</h3>
<ul>
- <li>improvement: performance of http.body.Body.readline()</li>
- <li>improvement: log HTTP errors in access log like
- Apache</li>
- <li>improvment: display traceback when the worker fails to
- boot</li>
- <li>improvement: makes gunicorn work with gevent 1.0</li>
- <li>examples: websocket example now supports hybi13</li>
- <li>fix: reopen log files after initialization</li>
- <li>fix: websockets support</li>
- <li>fix: django1.4 support</li>
- <li>fix: only load the paster application 1 time</li>
+ <li>fix logging during daemonisation</li>
+ </ul>
+ <br>
+ <h3>Version 0.14.4 / 2012-06-24</h3>
+ <ul>
+ <li>new --graceful-timeout option</li>
+ <li>fix multiple issues with request limit</li>
+ <li>more fixes in django settings resolutions</li>
+ <li>fix gevent.core import</li>
+ <li>fix keepalive=0 in eventlet worker</li>
+ <li>fix handle_error display with the unix worker</li>
+ <li>fix tornado.wsgi.WSGIApplication calling error</li>
+ <li><strong>breaking change</strong>: take the control on graceful reload back.
+ graceful can't be overrided anymore using the on_reload function.</li>
</ul>
</div>
<div id="footer">
View
6 doc/htdocs/install.html
@@ -113,8 +113,10 @@
</div>
<div class="section" id="debian-gnu-linux">
<h2><a class="toc-backref" href="#contents">Debian GNU/Linux</a></h2>
-<p>If you are using Debian GNU/Linux is is recommended that you use system
-packages to install Gunicorn. This has a number of advantages:</p>
+<p>If you are using Debian GNU/Linux and it is recommended that you use
+system packages to install Gunicorn except maybe when you want to use
+different versions of gunicorn with virtualenv. This has a number of
+advantages:</p>
<blockquote>
<ul class="simple">
<li>Zero-effort installation: Automatically starts multiple Gunicorn instances
View
148 doc/htdocs/news.html
@@ -29,6 +29,26 @@
<div id="content">
<div class="document">
<div class="section" id="id1">
+<h2><a class="toc-backref" href="#contents">0.14.5 / 2012-06-24</a></h2>
+<ul class="simple">
+<li>fix logging during daemonisation</li>
+</ul>
+</div>
+<div class="section" id="id2">
+<h2><a class="toc-backref" href="#contents">0.14.4 / 2012-06-24</a></h2>
+<ul class="simple">
+<li>new --graceful-timeout option</li>
+<li>fix multiple issues with request limit</li>
+<li>more fixes in django settings resolutions</li>
+<li>fix gevent.core import</li>
+<li>fix keepalive=0 in eventlet worker</li>
+<li>fix handle_error display with the unix worker</li>
+<li>fix tornado.wsgi.WSGIApplication calling error</li>
+<li><strong>breaking change</strong>: take the control on graceful reload back.
+graceful can't be overrided anymore using the on_reload function.</li>
+</ul>
+</div>
+<div class="section" id="id3">
<h2><a class="toc-backref" href="#contents">0.14.3 / 2012-05-15</a></h2>
<ul class="simple">
<li>improvement: performance of http.body.Body.readline()</li>
@@ -42,7 +62,7 @@
<li>fix: only load the paster application 1 time</li>
</ul>
</div>
-<div class="section" id="id2">
+<div class="section" id="id4">
<h2><a class="toc-backref" href="#contents">0.14.2 / 2012-03-16</a></h2>
<ul class="simple">
<li>add validate_class validator: allows to use a class or a method to
@@ -53,13 +73,13 @@
<li>Fix gevent_pywsgi worker</li>
</ul>
</div>
-<div class="section" id="id3">
+<div class="section" id="id5">
<h2><a class="toc-backref" href="#contents">0.14.1 / 2012-03-02</a></h2>
<ul class="simple">
<li>fixing source archive, reducing its size</li>
</ul>
</div>
-<div class="section" id="id4">
+<div class="section" id="id6">
<h2><a class="toc-backref" href="#contents">0.14.0 / 2012-02-27</a></h2>
<ul class="simple">
<li>check if Request line is too large: You can now pass the parameter
@@ -82,22 +102,22 @@
<li>many other fixes.</li>
</ul>
</div>
-<div class="section" id="id5">
+<div class="section" id="id7">
<h2><a class="toc-backref" href="#contents">0.13.4 / 2011-09-23</a></h2>
<ul class="simple">
<li>fix util.closerange function used to prevent leaking fds on python 2.5
(typo)</li>
</ul>
</div>
-<div class="section" id="id6">
+<div class="section" id="id8">
<h2><a class="toc-backref" href="#contents">0.13.3 / 2011-09-19</a></h2>
<ul class="simple">
<li>refactor gevent worker</li>
<li>prevent leaking fds on reexec</li>
<li>fix inverted request_time computation</li>
</ul>
</div>
-<div class="section" id="id7">
+<div class="section" id="id9">
<h2><a class="toc-backref" href="#contents">0.13.2 / 2011-09-17</a></h2>
<ul class="simple">
<li>Add support for Tornado 2.0 in tornado worker</li>
@@ -110,13 +130,13 @@
<li>Fix Django reloading</li>
</ul>
</div>
-<div class="section" id="id8">
+<div class="section" id="id10">
<h2><a class="toc-backref" href="#contents">0.13.1 / 2011-08-22</a></h2>
<ul class="simple">
<li>Fix unix socket. log argument was missing.</li>
</ul>
</div>
-<div class="section" id="id9">
+<div class="section" id="id11">
<h2><a class="toc-backref" href="#contents">0.13.0 / 2011-08-22</a></h2>
<ul class="simple">
<li>Improve logging: allows file-reopening and add access log file
@@ -134,7 +154,7 @@
<li>Fix the use of sendfile in wsgi.file_wrapper</li>
</ul>
</div>
-<div class="section" id="id10">
+<div class="section" id="id12">
<h2><a class="toc-backref" href="#contents">0.12.2 / 2011-05-18</a></h2>
<ul class="simple">
<li>Add wsgi.file_wrapper optimised for FreeBSD, Linux &amp; MacOSX (use
@@ -145,7 +165,7 @@
<li>Compatible with gevent 0.14dev</li>
</ul>
</div>
-<div class="section" id="id11">
+<div class="section" id="id13">
<h2><a class="toc-backref" href="#contents">0.12.1 / 2011-03-23</a></h2>
<ul class="simple">
<li>Add &quot;on_starting&quot; hook. This hook can be used to set anything before
@@ -157,7 +177,7 @@
<li>Fix ipv6 handling</li>
</ul>
</div>
-<div class="section" id="id12">
+<div class="section" id="id14">
<h2><a class="toc-backref" href="#contents">0.12.0 / 2010-12-22</a></h2>
<ul class="simple">
<li>Add support for logging configuration using a ini file.
@@ -175,7 +195,7 @@
<li>Set the number of workers to zero on WINCH</li>
</ul>
</div>
-<div class="section" id="id13">
+<div class="section" id="id15">
<h2><a class="toc-backref" href="#contents">0.11.2 / 2010-10-30</a></h2>
<ul class="simple">
<li>Add SERVER_SOFTWARE to the os.environ</li>
@@ -188,7 +208,7 @@
<li>Fix readline in wsgi.input</li>
</ul>
</div>
-<div class="section" id="id14">
+<div class="section" id="id16">
<h2><a class="toc-backref" href="#contents">0.11.1 / 2010-09-02</a></h2>
<ul class="simple">
<li>Implement max-requests feature to prevent memory leaks.</li>
@@ -200,7 +220,7 @@
<li>Workaround to prevent Gevent worker to segfault on MacOSX.</li>
</ul>
</div>
-<div class="section" id="id15">
+<div class="section" id="id17">
<h2><a class="toc-backref" href="#contents">0.11.0 / 2010-08-12</a></h2>
<ul class="simple">
<li>Improve dramatically performances of Gevent and Eventlet workers</li>
@@ -209,7 +229,7 @@
<li>Fix latency issue in async workers</li>
</ul>
</div>
-<div class="section" id="id16">
+<div class="section" id="id18">
<h2><a class="toc-backref" href="#contents">0.10.1 / 2010-08-06</a></h2>
<ul class="simple">
<li>Improve gevent's workers. Add &quot;egg:gunicorn#gevent_wsgi&quot; worker using
@@ -223,7 +243,7 @@
<li>Fix gevent dns issue</li>
</ul>
</div>
-<div class="section" id="id17">
+<div class="section" id="id19">
<h2><a class="toc-backref" href="#contents">0.10.0 / 2010-07-08</a></h2>
<ul class="simple">
<li>New HTTP parser.</li>
@@ -243,7 +263,7 @@
<li>New documentation website.</li>
</ul>
</div>
-<div class="section" id="id18">
+<div class="section" id="id20">
<h2><a class="toc-backref" href="#contents">0.9.1 / 2010-05-26</a></h2>
<ul class="simple">
<li>Support https via X-Forwarded-Protocol or X-Forwarded-Ssl headers</li>
@@ -252,7 +272,7 @@
<li>Fix umask in unix socket</li>
</ul>
</div>
-<div class="section" id="id19">
+<div class="section" id="id21">
<h2><a class="toc-backref" href="#contents">0.9.0 / 2010-05-24</a></h2>
<ul class="simple">
<li>Added <em>when_ready</em> hook. Called just after the server is started</li>
@@ -265,7 +285,7 @@
<li>Documentation improvements</li>
</ul>
</div>
-<div class="section" id="id20">
+<div class="section" id="id22">
<h2><a class="toc-backref" href="#contents">0.8.1 / 2010-04-29</a></h2>
<ul class="simple">
<li>Fix builtins import in config</li>
@@ -274,29 +294,29 @@
<li>Delay application loading until after processing all configuration</li>
</ul>
</div>
-<div class="section" id="id21">
+<div class="section" id="id23">
<h2><a class="toc-backref" href="#contents">0.8.0 / 2010-04-22</a></h2>
<ul class="simple">
<li>Refactored Worker management for better async support. Now use the -k option
to set the type of request processing to use</li>
<li>Added support for <a class="reference external" href="http://www.tornadoweb.org/">Tornado</a></li>
</ul>
</div>
-<div class="section" id="id22">
+<div class="section" id="id24">
<h2><a class="toc-backref" href="#contents">0.7.2 / 2010-04-15</a></h2>
<ul class="simple">
<li>Added --spew option to help debugging (installs a system trace hook)</li>
<li>Some fixes in async arbiters</li>
<li>Fix a bug in start_response on error</li>
</ul>
</div>
-<div class="section" id="id23">
+<div class="section" id="id25">
<h2><a class="toc-backref" href="#contents">0.7.1 / 2010-04-01</a></h2>
<ul class="simple">
<li>Fix bug when responses have no body.</li>
</ul>
</div>
-<div class="section" id="id24">
+<div class="section" id="id26">
<h2><a class="toc-backref" href="#contents">0.7.0 / 2010-03-26</a></h2>
<ul class="simple">
<li>Added support for <a class="reference external" href="http://eventlet.net">Eventlet</a> and <a class="reference external" href="http://gevent.org">Gevent</a> based workers.</li>
@@ -306,28 +326,28 @@
<li>Fix <a class="reference external" href="http://www.python.org/dev/peps/pep-0333/">PEP 333</a> compliance for the write callable.</li>
</ul>
</div>
-<div class="section" id="id25">
+<div class="section" id="id27">
<h2><a class="toc-backref" href="#contents">0.6.5 / 2010-03-11</a></h2>
<ul class="simple">
<li>Fix pidfile handling</li>
<li>Fix Exception Error</li>
</ul>
</div>
-<div class="section" id="id26">
+<div class="section" id="id28">
<h2><a class="toc-backref" href="#contents">0.6.4 / 2010-03-08</a></h2>
<ul class="simple">
<li>Use cStringIO for performance when possible.</li>
<li>Fix worker freeze when a remote connection closes unexpectedly.</li>
</ul>
</div>
-<div class="section" id="id27">
+<div class="section" id="id29">
<h2><a class="toc-backref" href="#contents">0.6.3 / 2010-03-07</a></h2>
<ul class="simple">
<li>Make HTTP parsing faster.</li>
<li>Various bug fixes</li>
</ul>
</div>
-<div class="section" id="id28">
+<div class="section" id="id30">
<h2><a class="toc-backref" href="#contents">0.6.2 / 2010-03-01</a></h2>
<ul class="simple">
<li>Added support for chunked response.</li>
@@ -338,30 +358,30 @@
<li>Workers are now murdered by age (the oldest is killed first).</li>
</ul>
</div>
-<div class="section" id="id29">
+<div class="section" id="id31">
<h2><a class="toc-backref" href="#contents">0.6.1 / 2010-02-24</a></h2>
<ul class="simple">
<li>Added gunicorn config file support for Django admin command</li>
<li>Fix gunicorn config file. -c was broken.</li>
<li>Removed TTIN/TTOU from workers which blocked other signals.</li>
</ul>
</div>
-<div class="section" id="id30">
+<div class="section" id="id32">
<h2><a class="toc-backref" href="#contents">0.6 / 2010-02-22</a></h2>
<ul class="simple">
<li>Added setproctitle support</li>
<li>Change privilege switch behavior. We now work like NGINX, master keeps the
permissions, new uid/gid permissions are only set for workers.</li>
</ul>
</div>
-<div class="section" id="id31">
+<div class="section" id="id33">
<h2><a class="toc-backref" href="#contents">0.5.1 / 2010-02-22</a></h2>
<ul class="simple">
<li>Fix umask</li>
<li>Added Debian packaging</li>
</ul>
</div>
-<div class="section" id="id32">
+<div class="section" id="id34">
<h2><a class="toc-backref" href="#contents">0.5 / 2010-02-20</a></h2>
<ul class="simple">
<li>Added <a class="reference external" href="configuration.html">configuration file</a> handler.</li>
@@ -383,38 +403,40 @@
<div class="contents topic" id="contents">
<p class="topic-title first">Contents</p>
<ul class="simple">
-<li><a class="reference internal" href="#id1" id="id33">0.14.3 / 2012-05-15</a></li>
-<li><a class="reference internal" href="#id2" id="id34">0.14.2 / 2012-03-16</a></li>
-<li><a class="reference internal" href="#id3" id="id35">0.14.1 / 2012-03-02</a></li>
-<li><a class="reference internal" href="#id4" id="id36">0.14.0 / 2012-02-27</a></li>
-<li><a class="reference internal" href="#id5" id="id37">0.13.4 / 2011-09-23</a></li>
-<li><a class="reference internal" href="#id6" id="id38">0.13.3 / 2011-09-19</a></li>
-<li><a class="reference internal" href="#id7" id="id39">0.13.2 / 2011-09-17</a></li>
-<li><a class="reference internal" href="#id8" id="id40">0.13.1 / 2011-08-22</a></li>
-<li><a class="reference internal" href="#id9" id="id41">0.13.0 / 2011-08-22</a></li>
-<li><a class="reference internal" href="#id10" id="id42">0.12.2 / 2011-05-18</a></li>
-<li><a class="reference internal" href="#id11" id="id43">0.12.1 / 2011-03-23</a></li>
-<li><a class="reference internal" href="#id12" id="id44">0.12.0 / 2010-12-22</a></li>
-<li><a class="reference internal" href="#id13" id="id45">0.11.2 / 2010-10-30</a></li>
-<li><a class="reference internal" href="#id14" id="id46">0.11.1 / 2010-09-02</a></li>
-<li><a class="reference internal" href="#id15" id="id47">0.11.0 / 2010-08-12</a></li>
-<li><a class="reference internal" href="#id16" id="id48">0.10.1 / 2010-08-06</a></li>
-<li><a class="reference internal" href="#id17" id="id49">0.10.0 / 2010-07-08</a></li>
-<li><a class="reference internal" href="#id18" id="id50">0.9.1 / 2010-05-26</a></li>
-<li><a class="reference internal" href="#id19" id="id51">0.9.0 / 2010-05-24</a></li>
-<li><a class="reference internal" href="#id20" id="id52">0.8.1 / 2010-04-29</a></li>
-<li><a class="reference internal" href="#id21" id="id53">0.8.0 / 2010-04-22</a></li>
-<li><a class="reference internal" href="#id22" id="id54">0.7.2 / 2010-04-15</a></li>
-<li><a class="reference internal" href="#id23" id="id55">0.7.1 / 2010-04-01</a></li>
-<li><a class="reference internal" href="#id24" id="id56">0.7.0 / 2010-03-26</a></li>
-<li><a class="reference internal" href="#id25" id="id57">0.6.5 / 2010-03-11</a></li>
-<li><a class="reference internal" href="#id26" id="id58">0.6.4 / 2010-03-08</a></li>
-<li><a class="reference internal" href="#id27" id="id59">0.6.3 / 2010-03-07</a></li>
-<li><a class="reference internal" href="#id28" id="id60">0.6.2 / 2010-03-01</a></li>
-<li><a class="reference internal" href="#id29" id="id61">0.6.1 / 2010-02-24</a></li>
-<li><a class="reference internal" href="#id30" id="id62">0.6 / 2010-02-22</a></li>
-<li><a class="reference internal" href="#id31" id="id63">0.5.1 / 2010-02-22</a></li>
-<li><a class="reference internal" href="#id32" id="id64">0.5 / 2010-02-20</a></li>
+<li><a class="reference internal" href="#id1" id="id35">0.14.5 / 2012-06-24</a></li>
+<li><a class="reference internal" href="#id2" id="id36">0.14.4 / 2012-06-24</a></li>
+<li><a class="reference internal" href="#id3" id="id37">0.14.3 / 2012-05-15</a></li>
+<li><a class="reference internal" href="#id4" id="id38">0.14.2 / 2012-03-16</a></li>
+<li><a class="reference internal" href="#id5" id="id39">0.14.1 / 2012-03-02</a></li>
+<li><a class="reference internal" href="#id6" id="id40">0.14.0 / 2012-02-27</a></li>
+<li><a class="reference internal" href="#id7" id="id41">0.13.4 / 2011-09-23</a></li>
+<li><a class="reference internal" href="#id8" id="id42">0.13.3 / 2011-09-19</a></li>
+<li><a class="reference internal" href="#id9" id="id43">0.13.2 / 2011-09-17</a></li>
+<li><a class="reference internal" href="#id10" id="id44">0.13.1 / 2011-08-22</a></li>
+<li><a class="reference internal" href="#id11" id="id45">0.13.0 / 2011-08-22</a></li>
+<li><a class="reference internal" href="#id12" id="id46">0.12.2 / 2011-05-18</a></li>
+<li><a class="reference internal" href="#id13" id="id47">0.12.1 / 2011-03-23</a></li>
+<li><a class="reference internal" href="#id14" id="id48">0.12.0 / 2010-12-22</a></li>
+<li><a class="reference internal" href="#id15" id="id49">0.11.2 / 2010-10-30</a></li>
+<li><a class="reference internal" href="#id16" id="id50">0.11.1 / 2010-09-02</a></li>
+<li><a class="reference internal" href="#id17" id="id51">0.11.0 / 2010-08-12</a></li>
+<li><a class="reference internal" href="#id18" id="id52">0.10.1 / 2010-08-06</a></li>
+<li><a class="reference internal" href="#id19" id="id53">0.10.0 / 2010-07-08</a></li>
+<li><a class="reference internal" href="#id20" id="id54">0.9.1 / 2010-05-26</a></li>
+<li><a class="reference internal" href="#id21" id="id55">0.9.0 / 2010-05-24</a></li>
+<li><a class="reference internal" href="#id22" id="id56">0.8.1 / 2010-04-29</a></li>
+<li><a class="reference internal" href="#id23" id="id57">0.8.0 / 2010-04-22</a></li>
+<li><a class="reference internal" href="#id24" id="id58">0.7.2 / 2010-04-15</a></li>
+<li><a class="reference internal" href="#id25" id="id59">0.7.1 / 2010-04-01</a></li>
+<li><a class="reference internal" href="#id26" id="id60">0.7.0 / 2010-03-26</a></li>
+<li><a class="reference internal" href="#id27" id="id61">0.6.5 / 2010-03-11</a></li>
+<li><a class="reference internal" href="#id28" id="id62">0.6.4 / 2010-03-08</a></li>
+<li><a class="reference internal" href="#id29" id="id63">0.6.3 / 2010-03-07</a></li>
+<li><a class="reference internal" href="#id30" id="id64">0.6.2 / 2010-03-01</a></li>
+<li><a class="reference internal" href="#id31" id="id65">0.6.1 / 2010-02-24</a></li>
+<li><a class="reference internal" href="#id32" id="id66">0.6 / 2010-02-22</a></li>
+<li><a class="reference internal" href="#id33" id="id67">0.5.1 / 2010-02-22</a></li>
+<li><a class="reference internal" href="#id34" id="id68">0.5 / 2010-02-20</a></li>
</ul>
</div>
</div>
View
10 doc/site/install.rst
@@ -94,8 +94,10 @@ want to consider one of the alternate worker types.
Debian GNU/Linux
----------------
-If you are using Debian GNU/Linux is is recommended that you use system
-packages to install Gunicorn. This has a number of advantages:
+If you are using Debian GNU/Linux and it is recommended that you use
+system packages to install Gunicorn except maybe when you want to use
+different versions of gunicorn with virtualenv. This has a number of
+advantages:
* Zero-effort installation: Automatically starts multiple Gunicorn instances
based on configurations defined in ``/etc/gunicorn.d``.
@@ -156,14 +158,14 @@ and adding them to your system's software sources::
deb-src http://ppa.launchpad.net/gunicorn/ppa/ubuntu lucid main
Replace 'lucid' with your Ubuntu distribution series.
-
+
Signing key
+++++++++++
::
1024R/5370FF2A
-
+
Fingerprint
+++++++++++
View
19 doc/site/news.rst
@@ -8,6 +8,25 @@ _TOC_TOP_
_TOC_BOT_
+0.14.5 / 2012-06-24
+-------------------
+
+- fix logging during daemonisation
+
+0.14.4 / 2012-06-24
+-------------------
+
+- new --graceful-timeout option
+- fix multiple issues with request limit
+- more fixes in django settings resolutions
+- fix gevent.core import
+- fix keepalive=0 in eventlet worker
+- fix handle_error display with the unix worker
+- fix tornado.wsgi.WSGIApplication calling error
+
+- **breaking change**: take the control on graceful reload back.
+ graceful can't be overrided anymore using the on_reload function.
+
0.14.3 / 2012-05-15
-------------------
View
95 examples/frameworks/pylonstest/development2.ini
@@ -0,0 +1,95 @@
+#
+# pylonstest - Pylons development environment configuration
+#
+# The %(here)s variable will be replaced with the parent directory of this file
+#
+[DEFAULT]
+debug = true
+# Uncomment and replace with the address which should receive any error reports
+#email_to = you@yourdomain.com
+smtp_server = localhost
+error_email_from = paste@localhost
+errorlog = root.log
+
+[server:main]
+use = egg:gunicorn#main
+host = 127.0.0.1
+port = 5000
+
+[app:main]
+use = egg:pylonstest
+full_stack = true
+static_files = true
+
+cache_dir = %(here)s/data
+beaker.session.key = pylonstest
+beaker.session.secret = somesecret
+
+# If you'd like to fine-tune the individual locations of the cache data dirs
+# for the Cache data, or the Session saves, un-comment the desired settings
+# here:
+#beaker.cache.data_dir = %(here)s/data/cache
+#beaker.session.data_dir = %(here)s/data/sessions
+
+# WARNING: *THE LINE BELOW MUST BE UNCOMMENTED ON A PRODUCTION ENVIRONMENT*
+# Debug mode will enable the interactive debugging tool, allowing ANYONE to
+# execute malicious code after an exception is raised.
+#set debug = false
+
+# Begin logging configuration
+[loggers]
+keys= root, routes, pylonstest, gunicorn_error
+
+[logger_root]
+level=INFO
+handlers=console
+
+[logger_routes]
+level = INFO
+handlers =
+qualname = routes.middleware
+# "level = DEBUG" logs the route matched and routing variables.
+
+[logger_pylonstest]
+level = DEBUG
+handlers =
+qualname = pylonstest
+
+[logger_gunicorn_error]
+level=INFO
+handlers=error_file
+propagate=0
+qualname=gunicorn.error
+
+
+[handlers]
+keys = console, application, error_file
+
+[handler_console]
+class = StreamHandler
+args = (sys.stderr,)
+level = NOTSET
+formatter = generic
+
+[handler_application]
+class=FileHandler
+formatter=gunicorn_error
+args=('application.log',)
+
+[handler_error_file]
+class=FileHandler
+formatter=gunicorn_error
+args=('error.log',)
+
+
+[formatters]
+keys = generic, gunicorn_error
+
+[formatter_generic]
+format = %(asctime)s,%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
+datefmt = %H:%M:%S
+
+[formatter_gunicorn_error]
+format=%(asctime)s gunicorn_error: [%(process)d] [%(levelname)s] [%(name)s][%(threadName)s] - %(message)s
+datefmt=%Y-%m-%d %H:%M:%S
+class=logging.Formatter
View
2 examples/supervisor.conf
@@ -1,5 +1,5 @@
[program:gunicorn]
-command=/usr/local/bin/gunicorn main:application -C /path/to/project/gunicorn.conf.py
+command=/usr/local/bin/gunicorn main:application -c /path/to/project/gunicorn.conf.py
directory=/path/to/project
user=nobody
autostart=true
View
2 gunicorn/__init__.py
@@ -3,6 +3,6 @@
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
-version_info = (0, 14, 3)
+version_info = (0, 14, 5)
__version__ = ".".join(map(str, version_info))
SERVER_SOFTWARE = "gunicorn/%s" % __version__
View
7 gunicorn/app/base.py
@@ -119,12 +119,7 @@ def run(self):
debug.spew()
if self.cfg.daemon:
util.daemonize()
- else:
- try:
- os.setpgrp()
- except OSError, e:
- if e[0] != errno.EPERM:
- raise
+
try:
Arbiter(self).run()
except RuntimeError, e:
View
19 gunicorn/app/djangoapp.py
@@ -16,14 +16,17 @@ def find_settings_module(path):
if os.path.isdir(path):
project_path = None
- lvl = 0
- for root, dirs, files in os.walk(path):
- if "settings.py" in files:
- project_path = root
-
- lvl += 1
- if lvl > 2:
- break
+ if not os.path.isfile(os.path.join(path, "settings.py")):
+ for d in os.listdir(path):
+ if d in ('..', '.'):
+ continue
+
+ root = os.path.join(path, d)
+ if os.path.isfile(os.path.join(root, "settings.py")):
+ project_path = root
+ break
+ else:
+ project_path = path
elif os.path.isfile(path):
project_path = os.path.dirname(path)
settings_name, _ = os.path.splitext(os.path.basename(path))
View
3 gunicorn/app/pasterapp.py
@@ -137,8 +137,9 @@ def load_config(self):
raise
def load(self):
- if self.app is None and hasattr(self, "cfgfname"):
+ if hasattr(self, "cfgfname"):
return loadapp(self.cfgurl, relative_to=self.relpath)
+
return self.app
View
16 gunicorn/arbiter.py
@@ -87,7 +87,8 @@ def setup(self, app):
self.log = self.cfg.logger_class(app.cfg)
# reopen files
- self.log.reopen_files()
+ if 'GUNICORN_FD' in os.environ:
+ self.log.reopen_files()
self.address = self.cfg.address
self.num_workers = self.cfg.workers
@@ -320,7 +321,7 @@ def stop(self, graceful=True):
sig = signal.SIGQUIT
if not graceful:
sig = signal.SIGTERM
- limit = time.time() + self.timeout
+ limit = time.time() + self.cfg.graceful_timeout
while self.WORKERS and time.time() < limit:
self.kill_workers(sig)
time.sleep(0.1)
@@ -353,13 +354,16 @@ def reload(self):
self.app.reload()
self.setup(self.app)
+ # reopen log files
+ self.log.reopen_files()
+
# do we need to change listener ?
if old_address != self.cfg.address:
self.LISTENER.close()
self.LISTENER = create_socket(self.cfg, self.log)
self.log.info("Listening at: %s", self.LISTENER)
- # spawn new workers with new app & conf
+ # do some actions on reload
self.cfg.on_reload(self)
# unlink pidfile
@@ -374,9 +378,11 @@ def reload(self):
# set new proc_name
util._setproctitle("master [%s]" % self.proc_name)
- # manage workers
- self.log.reopen_files()
+ # spawn new workers
+ for i in range(self.cfg.workers):
+ self.spawn_worker()
+ # manage workers
self.manage_workers()
def murder_workers(self):
View
31 gunicorn/config.py
@@ -418,6 +418,22 @@ class Timeout(Setting):
is not tied to the length of time required to handle a single request.
"""
+class GracefulTimeout(Setting):
+ name = "graceful_timeout"
+ section = "Worker Processes"
+ cli = ["--graceful-timeout"]
+ meta = "INT"
+ validator = validate_pos_int
+ type = "int"
+ default = 30
+ desc = """\
+ Timeout for graceful workers restart.
+
+ Generally set to thirty seconds. How max time worker can handle
+ request after got restart signal. If the time is up worker will
+ be force killed.
+ """
+
class Keepalive(Setting):
name = "keepalive"
section = "Worker Processes"
@@ -449,8 +465,8 @@ class LimitRequestLine(Setting):
restriction on the length of a request-URI allowed for a request
on the server. A server needs this value to be large enough to
hold any of its resource names, including any information that
- might be passed in the query part of a GET request. By default
- this value is 4094 and can't be larger than 8190.
+ might be passed in the query part of a GET request. Value is a number
+ from 0 (unlimited) to 8190.
This parameter can be used to prevent any DDOS attack.
"""
@@ -466,10 +482,10 @@ class LimitRequestFields(Setting):
desc= """\
Limit the number of HTTP headers fields in a request.
- Value is a number from 0 (unlimited) to 32768. This parameter is
- used to limit the number of headers in a request to prevent DDOS
- attack. Used with the `limit_request_field_size` it allows more
- safety.
+ This parameter is used to limit the number of headers in a request to
+ prevent DDOS attack. Used with the `limit_request_field_size` it allows
+ more safety. By default this value is 100 and can't be larger than
+ 32768.
"""
class LimitRequestFieldSize(Setting):
@@ -851,8 +867,7 @@ class OnReload(Setting):
validator = validate_callable(1)
type = "callable"
def on_reload(server):
- for i in range(server.app.cfg.workers):
- server.spawn_worker()
+ pass
default = staticmethod(on_reload)
desc = """\
Called to recycle workers during a reload via SIGHUP.
View
2 gunicorn/http/errors.py
@@ -6,7 +6,7 @@
class ParseException(Exception):
pass
-class NoMoreData(ParseException, StopIteration):
+class NoMoreData(ParseException):
def __init__(self, buf=None):
self.buf = buf
def __str__(self):
View
36 gunicorn/http/message.py
@@ -32,17 +32,19 @@ def __init__(self, cfg, unreader):
self.hdrre = re.compile("[\x00-\x1F\x7F()<>@,;:\[\]={} \t\\\\\"]")
# set headers limits
- self.limit_request_fields = max(cfg.limit_request_fields, MAX_HEADERS)
- if self.limit_request_fields <= 0:
+ self.limit_request_fields = cfg.limit_request_fields
+ if (self.limit_request_fields <= 0
+ or self.limit_request_fields > MAX_HEADERS):
self.limit_request_fields = MAX_HEADERS
- self.limit_request_field_size = max(cfg.limit_request_field_size,
- MAX_HEADERFIELD_SIZE)
- if self.limit_request_field_size <= 0:
+ self.limit_request_field_size = cfg.limit_request_field_size
+ if (self.limit_request_field_size < 0
+ or self.limit_request_field_size > MAX_HEADERFIELD_SIZE):
self.limit_request_field_size = MAX_HEADERFIELD_SIZE
# set max header buffer size
+ max_header_field_size = self.limit_request_field_size or MAX_HEADERFIELD_SIZE
self.max_buffer_headers = self.limit_request_fields * \
- (self.limit_request_field_size + 2) + 4
+ (max_header_field_size + 2) + 4
unused = self.parse(self.unreader)
self.unreader.unread(unused)
@@ -60,11 +62,12 @@ def parse_headers(self, data):
# Parse headers into key/value pairs paying attention
# to continuation lines.
while len(lines):
- if len(headers) > self.limit_request_fields:
+ if len(headers) >= self.limit_request_fields:
raise LimitRequestHeaders("limit request headers fields")
# Parse initial header name : value pair.
curr = lines.pop(0)
+ header_length = len(curr)
if curr.find(":") < 0:
raise InvalidHeader(curr.strip())
name, value = curr.split(":", 1)
@@ -76,9 +79,16 @@ def parse_headers(self, data):
# Consume value continuation lines
while len(lines) and lines[0].startswith((" ", "\t")):
- value.append(lines.pop(0))
+ curr = lines.pop(0)
+ header_length += len(curr)
+ if header_length > self.limit_request_field_size > 0:
+ raise LimitRequestHeaders("limit request headers "
+ + "fields size")
+ value.append(curr)
value = ''.join(value).rstrip()
+ if header_length > self.limit_request_field_size > 0:
+ raise LimitRequestHeaders("limit request headers fields size")
headers.append((name, value))
return headers
@@ -130,9 +140,9 @@ def __init__(self, cfg, unreader):
self.fragment = None
# get max request line size
- self.limit_request_line = max(cfg.limit_request_line,
- MAX_REQUEST_LINE)
- if self.limit_request_line <= 0:
+ self.limit_request_line = cfg.limit_request_line
+ if (self.limit_request_line < 0
+ or self.limit_request_line >= MAX_REQUEST_LINE):
self.limit_request_line = MAX_REQUEST_LINE
super(Request, self).__init__(cfg, unreader)
@@ -158,8 +168,8 @@ def parse(self, unreader):
self.get_data(unreader, buf)
data = buf.getvalue()
- if len(data) - 2 > self.limit_request_line:
- raise LimitRequestLine(len(data), self.cfg.limit_request_line)
+ if len(data) - 2 > self.limit_request_line > 0:
+ raise LimitRequestLine(len(data), self.limit_request_line)
self.parse_request_line(data[:idx])
buf = StringIO()
View
2 gunicorn/workers/async.py
@@ -37,6 +37,8 @@ def handle(self, client, addr):
if not req:
break
self.handle_request(req, client, addr)
+ except http.errors.NoMoreData, e:
+ self.log.debug("Ignored premature client disconnection. %s", e)
except StopIteration, e:
self.log.debug("Closing connection. %s", e)
except Exception, e:
View
12 gunicorn/workers/base.py
@@ -127,8 +127,10 @@ def handle_exit(self, sig, frame):
def handle_error(self, req, client, addr, exc):
request_start = datetime.now()
+ addr = addr or ('', -1) # unix socket case
if isinstance(exc, (InvalidRequestLine, InvalidRequestMethod,
- InvalidHTTPVersion, InvalidHeader, InvalidHeaderName,)):
+ InvalidHTTPVersion, InvalidHeader, InvalidHeaderName,
+ LimitRequestLine, LimitRequestHeaders,)):
status_int = 400
reason = "Bad Request"
@@ -147,8 +149,8 @@ def handle_error(self, req, client, addr, exc):
mesg = "<p>Error parsing headers: '%s'</p>" % str(exc)
self.log.debug("Invalid request from ip={ip}: {error}"\
- "".format(ip=client.getpeername()[0],
- error=repr(exc),
+ "".format(ip=addr[0],
+ error=str(exc),
)
)
else:
@@ -169,13 +171,13 @@ def handle_error(self, req, client, addr, exc):
self.log.access(resp, req, environ, request_time)
if self.debug:
- tb = traceback.format_exc()
+ tb = traceback.format_exc()
mesg += "<h2>Traceback:</h2>\n<pre>%s</pre>" % tb
try:
util.write_error(client, status_int, reason, mesg)
except:
- self.log.warning("Failed to send error message.")
+ self.log.debug("Failed to send error message.")
def handle_winch(self, sig, fname):
# Ignore SIGWINCH in worker. Fixes a crash on OpenBSD.
View
4 gunicorn/workers/geventlet.py
@@ -30,7 +30,7 @@ def init_process(self):
super(EventletWorker, self).init_process()
def timeout_ctx(self):
- return eventlet.Timeout(self.cfg.keepalive, False)
+ return eventlet.Timeout(self.cfg.keepalive or None, False)
def run(self):
self.socket = GreenSocket(family_or_realsock=self.socket.sock)
@@ -47,5 +47,5 @@ def run(self):
eventlet.sleep(1.0)
self.notify()
- with eventlet.Timeout(self.timeout, False):
+ with eventlet.Timeout(self.cfg.graceful_timeout, False):
eventlet.kill(self.acceptor, eventlet.StopServe)
View
3 gunicorn/workers/ggevent.py
@@ -77,7 +77,7 @@ def run(self):
try:
# Try to stop connections until timeout
self.notify()
- server.stop(timeout=self.timeout)
+ server.stop(timeout=self.cfg.graceful_timeout)
except:
pass
@@ -92,6 +92,7 @@ def handle_request(self, *args):
def init_process(self):
#gevent 0.13 and older doesn't reinitialize dns for us after forking
#here's the workaround
+ import gevent.core
gevent.core.dns_shutdown(fail_requests=1)
gevent.core.dns_init()
super(GeventWorker, self).init_process()
View
6 gunicorn/workers/gtornado.py
@@ -56,9 +56,11 @@ def run(self):
PeriodicCallback(self.watchdog, 1000, io_loop=self.ioloop).start()
# Assume the app is a WSGI callable if its not an
- # instance of tornardo.web.Application
+ # instance of tornado.web.Application or is an
+ # instance of tornado.wsgi.WSGIApplication
app = self.wsgi
- if not isinstance(app, tornado.web.Application):
+ if not isinstance(app, tornado.web.Application) or \
+ isinstance(app, tornado.wsgi.WSGIApplicaion):
app = WSGIContainer(app)
# Monkey-patching HTTPConnection.finish to count the
View
2 gunicorn/workers/sync.py
@@ -70,6 +70,8 @@ def handle(self, client, addr):
parser = http.RequestParser(self.cfg, client)
req = parser.next()
self.handle_request(req, client, addr)
+ except http.errors.NoMoreData, e:
+ self.log.debug("Ignored premature client disconnection. %s", e)
except StopIteration, e:
self.log.debug("Closing connection. %s", e)
except socket.error, e:
View
12 tests/001-test-valid-requests.py
@@ -12,17 +12,21 @@
reqdir = os.path.join(dirname, "requests", "valid")
def a_case(fname):
- expect = treq.load_py(os.path.splitext(fname)[0] + ".py")
+ env = treq.load_py(os.path.splitext(fname)[0] + ".py")
+ expect = env['request']
+ cfg = env['cfg']
req = treq.request(fname, expect)
- for case in req.gen_cases():
+ for case in req.gen_cases(cfg):
case[0](*case[1:])
def test_http_parser():
for fname in glob.glob(os.path.join(reqdir, "*.http")):
if os.getenv("GUNS_BLAZING"):
- expect = treq.load_py(os.path.splitext(fname)[0] + ".py")
+ env = treq.load_py(os.path.splitext(fname)[0] + ".py")
+ expect = env['request']
+ cfg = env['cfg']
req = treq.request(fname, expect)
- for case in req.gen_cases():
+ for case in req.gen_cases(cfg):
yield case
else:
yield (a_case, fname)
View
16 tests/002-test-invalid-requests.py
@@ -8,11 +8,21 @@
import glob
import os
+from nose.tools import raises
+
dirname = os.path.dirname(__file__)
reqdir = os.path.join(dirname, "requests", "invalid")
+
def test_http_parser():
for fname in glob.glob(os.path.join(reqdir, "*.http")):
- expect = treq.load_py(os.path.splitext(fname)[0] + ".py")
- req = treq.badrequest(fname, expect)
- yield (req.check,)
+ env = treq.load_py(os.path.splitext(fname)[0] + ".py")
+ expect = env['request']
+ cfg = env['cfg']
+ req = treq.badrequest(fname)
+
+ @raises(expect)
+ def check(fname):
+ return req.check(cfg)
+
+ yield check, fname # fname is pass so that we know which test failed
View
2 tests/requests/invalid/008.http
@@ -1,6 +1,6 @@
PUT /stuff/here?foo=bar HTTP/1.0\r\n
Server: http://127.0.0.1:5984\r\n
Content-Type: application/json\r\n
-Someheader: 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\r\n
+Someheader: 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\r\n
Someheader: 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\r\n
\r\n
View
3 tests/requests/invalid/010.http
@@ -0,0 +1,3 @@
+GET /test HTTP/1.1\r\n
+Accept: */*\r\n
+\r\n
View
6 tests/requests/invalid/010.py
@@ -0,0 +1,6 @@
+from gunicorn.config import Config
+from gunicorn.http.errors import LimitRequestHeaders
+
+request = LimitRequestHeaders
+cfg = Config()
+cfg.set('limit_request_field_size', 10)
View
5 tests/requests/invalid/011.http
@@ -0,0 +1,5 @@
+GET /test HTTP/1.1\r\n
+User-Agent: curl/7.18.0 (i486-pc-linux-gnu) libcurl/7.18.0 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/1.1\r\n
+Host: 0.0.0.0=5000\r\n
+Accept: */*\r\n
+\r\n
View
6