diff --git a/doc/site/src/default.template b/doc/site/src/default.template
index a96ffe0f..2c320287 100644
--- a/doc/site/src/default.template
+++ b/doc/site/src/default.template
@@ -47,6 +47,19 @@
+ - Apr-3-2006
+ -
+
+
+
This release is the result of pounding the crap out of Mongrel since the
+ last release to make it more robust in the face of really bad traffic. It is
+ pretty ruthless so people should test and report if it's too ruthless.
+
+ Download
+ 
+
+
+
- Mar-30-2006
-
@@ -54,6 +67,7 @@
The official 0.3.12 release of Mongrel is here. This release is hot, but test test test.
Should support Rails 1.1 and has lots of debugging and tweaks.
+ Download

@@ -138,15 +152,6 @@

- - Feb-18-2006
- -
-
-
-
A complete rewrite of the CGIWrapper that actually works.
- Download
- 
-
-
diff --git a/doc/site/src/images/iron_mongrel.jpg b/doc/site/src/images/iron_mongrel.jpg
new file mode 100644
index 00000000..a1d9b6b9
Binary files /dev/null and b/doc/site/src/images/iron_mongrel.jpg differ
diff --git a/doc/site/src/images/spaceball.gif b/doc/site/src/images/spaceball.gif
deleted file mode 100644
index 35d42e80..00000000
Binary files a/doc/site/src/images/spaceball.gif and /dev/null differ
diff --git a/doc/site/src/news.page b/doc/site/src/news.page
index 956dacd9..b6523a3b 100644
--- a/doc/site/src/news.page
+++ b/doc/site/src/news.page
@@ -7,6 +7,54 @@ ordering: 2
h1. Latest News
+h2. Apr-3: Mongrel 0.3.12.1 -- Iron Mongrel
+
+!/images/iron_mongrel.jpg!
+
+This is the Iron Mongrel release. It is the result of trying to trash Mongrel
+until it can't move and then fixing anything that comes up. The testing
+methods used are:
+
+# Increased the number of unit tests against the main C parts.
+# Write several tests against Mongrel's parser which throw it tons of random data.
+# Use "Peach Fuzz":http://peachfuzz.sourceforge.net/ to thrash several live apps with randomness.
+# Wrote several extensive little scripts to explore the edges of death for Mongrel.
+# Heavy code audits covering as much code as possible to find any possible loose ends.
+
+The end result is a lot of little fixes which make Mongrel more robust against
+badly behaving clients and possibly against many potential security risks in
+the future. In general Mongrel 0.3.12.1 behaves more consistently compared
+to past releases when given random data or maliciously formatted data.
+
+The main changes are related to how IO is processed and how the HTTP parser rejects
+"bad" input. What the parser now blocks is:
+
+* Any header over 112k.
+* Any query string over 10k.
+* Any header field value over 80k.
+* Any header field name over 256 bytes.
+* Any request URI greater than 512 bytes.
+
+As soon as these conditions are detected the client is disconnected immediately and a
+log message is printed out listing the IP address, the exact cause, and the data that caused it. I'll
+remove the data dump later, but I want people to shoot me valid requests that cause parser
+errors.
+
+That's not all though. I've started a "security":security.html page where I'll publish
+the results of security threats, tests, and improvements as well as any advice for
+folks.
+
+This release also features a few little features here and there:
+
+* Initial support for a "config script". I'll be documenting this more, but it basically lets you use the Mongrel::RailsConfigurator to augment your application's config via a small script. Just pass "-S config/mongrel.rb" and put any Mongrel::RailsConfigurator statements that are reasonable.
+* Mongrel will report the correct REMOTE_ADDR variable, but it does a little trick where if there
+is an X-FORWARDED-FOR header then it sets REMOTE_ADDR to that.
+* Fixes for little bugs like double log messages, but not a lot of changes to the overall core.
+
+Go ahead and install the usual way: gem install mongrel *or* gem upgrade
+
+The logo is courtesy court3nay from irc.freenode.org.
+
h2. Mar-30: Mongrel 0.3.12 -- OFFICIAL Release
This is the long awaited (like 2 weeks) 0.3.12 release of Mongrel. This release
diff --git a/doc/site/src/security.page b/doc/site/src/security.page
new file mode 100644
index 00000000..c713e9ca
--- /dev/null
+++ b/doc/site/src/security.page
@@ -0,0 +1,95 @@
+---
+title: News
+inMenu: true
+directoryName: News
+ordering: 2
+---
+
+!/images/iron_mongrel.jpg!
+
+h1. Iron Mongrel Security
+
+This is where I'll be putting security tests, alerts, and advice for people
+running Mongrel. I test Mongrel fairly heavily using the following techniques:
+
+# Unit testing what I can. Mongrel is a server so many tests have to be done "live".
+# Thrashing Mongrel's HTTP parser internally with random or near-random data (called fuzzing).
+# Using "Peach Fuzz":http://peachfuzz.sourceforge.net/ to thrash several live apps with randomness.
+# Running several extensive little scripts to explore the edges of death for Mongrel.
+# Heavy code audits covering as much code as possible to find any possible loose ends.
+
+The end result is a lot of little fixes which make Mongrel more robust against
+badly behaving clients and possibly against many potential security risks in
+the future.
+
+
+h2. Mongrels HTTP Restrictions
+
+Many of the exploits out there currently for web servers tend to expoit
+either ambiguous areas of the HTTP grammar, or the lack of size specifications
+in the protocol. To protect against this Mongrel uses a fairly strict parser,
+but since many browser authors don't read specifications (and hell, who'd want
+to read the mountain of HTTP specifications out there), it can't be too
+strict. What it does enforce--apart from well formed headers and request lines--is
+the following size restrictions on each part:
+
+* Any header over 112k.
+* Any query string over 10k.
+* Any header field value over 80k.
+* Any header field name over 256 bytes.
+* Any request URI greater than 512 bytes.
+
+The large header size and field value is due to cookies being allowed to be so massive.
+It's not too clear whether a browser is allowed to cram all 20 of the 4k cookies
+into one cookie header, or if it should use multiple, but the end result is that
+a web server has to parser at least 112k of garbage before it can declare a client
+malicious.
+
+Now, when I say Mongrel is strict, I don't mean that it will abort on any
+minor little error according to the HTTP 1.1 RFC. Mongrel's parser is
+pretty forgiving on formats. Where Mongrel is exact is--as mentioned
+before--in it's treatment of sizes and boundary characters. Clients that
+can't even get that right aren't following the most basic safety elements
+of HTTP and you probably shouldn't deal with them.
+
+
+h2. Quiet Things Happens To Bad People
+
+Rather than wasting any more time--and in order to not give out any
+information to potentially malicious attackers--Mongrel just closes
+the socket immediately. This may confuse good people, but it's the
+best way to deal with bad requests.
+
+The assumption is that either the requesting client is not functioning
+correctly or it's attempting an attack. If it's not functioning correctly
+then what's the point of sending back any results? It probably can't
+parse them anyway. If it's an attacker then why give them any more
+information?
+
+Caught in the middle are people who are using a poorly written client.
+I'd suggest in those cases that they report the problem to the client's
+authors or contact me to see if it's an error on Mongrel's part.
+
+
+h2. Protocol Error Reporting
+
+The 0.3.12.1 release was the first Iron Mongrel release, but it isn't perfect
+for sure. To make sure that it doesn't prevent people from making tons of
+money the 0.3.12.1 release will report what data caused the parser to fail.
+If you see a legit request that causes the parser to choke then send it to
+me and I'll take a look.
+
+In general though, if you are getting bad requests they are probably intentionally
+malicious. The nice thing about Mongrel's parser is that the detection of
+bad requests isn't based on pattern detection, but rather on just making the
+HTTP protocol more strict to where bad requests get kicked out early.
+
+
+h2. Reporting Security Problems
+
+If you think you've found a security problem with Mongrel, please
+report it to me right away at *zedshaw at zedshaw do com*. I'm usually
+very responsive and will probably help even if the security problem is
+outside of Mongrel or if you need help securing your system.
+
+
diff --git a/lib/mongrel.rb b/lib/mongrel.rb
index 7832ea2a..78aad73a 100644
--- a/lib/mongrel.rb
+++ b/lib/mongrel.rb
@@ -524,14 +524,20 @@ module Mongrel
# Simply registers a handler with the internal URIClassifier. When the URI is
# found in the prefix of a request then your handler's HttpHandler::process method
# is called. See Mongrel::URIClassifier#register for more information.
- def register(uri, handler)
+ #
+ # If you set in_front=true then the passed in handler will be put in front in the list.
+ def register(uri, handler, in_front=false)
script_name, path_info, handlers = @classifier.resolve(uri)
if not handlers
@classifier.register(uri, [handler])
else
if path_info.length == 0 or (script_name == Const::SLASH and path_info == Const::SLASH)
- handlers << handler
+ if in_front
+ handlers.unshift(handler)
+ else
+ handlers << handler
+ end
else
@classifier.register(uri, [handler])
end
@@ -662,7 +668,7 @@ module Mongrel
# * :handler => Handler to use for this location.
def uri(location, options={})
ops = resolve_defaults(options)
- @listener.register(location, ops[:handler])
+ @listener.register(location, ops[:handler], in_front=ops[:in_front])
end