<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -11,11 +11,12 @@
   safe = (&quot;$&quot; | &quot;-&quot; | &quot;_&quot; | &quot;.&quot;);
   extra = (&quot;!&quot; | &quot;*&quot; | &quot;'&quot; | &quot;(&quot; | &quot;)&quot; | &quot;,&quot;);
   reserved = (&quot;;&quot; | &quot;/&quot; | &quot;?&quot; | &quot;:&quot; | &quot;@&quot; | &quot;&amp;&quot; | &quot;=&quot; | &quot;+&quot;);
-  unsafe = (CTL | &quot; &quot; | &quot;\&quot;&quot; | &quot;#&quot; | &quot;%&quot; | &quot;&lt;&quot; | &quot;&gt;&quot;);
+  sorta_safe = (&quot;\&quot;&quot; | &quot;&lt;&quot; | &quot;&gt;&quot;);
+  unsafe = (CTL | &quot; &quot; | &quot;#&quot; | &quot;%&quot; | sorta_safe);
   national = any -- (alpha | digit | reserved | extra | safe | unsafe);
   unreserved = (alpha | digit | safe | extra | national);
   escape = (&quot;%&quot; xdigit xdigit);
-  uchar = (unreserved | escape);
+  uchar = (unreserved | escape | sorta_safe);
   pchar = (uchar | &quot;:&quot; | &quot;@&quot; | &quot;&amp;&quot; | &quot;=&quot; | &quot;+&quot;);
   tspecials = (&quot;(&quot; | &quot;)&quot; | &quot;&lt;&quot; | &quot;&gt;&quot; | &quot;@&quot; | &quot;,&quot; | &quot;;&quot; | &quot;:&quot; | &quot;\\&quot; | &quot;\&quot;&quot; | &quot;/&quot; | &quot;[&quot; | &quot;]&quot; | &quot;?&quot; | &quot;=&quot; | &quot;{&quot; | &quot;}&quot; | &quot; &quot; | &quot;\t&quot;);
 </diff>
      <filename>ext/thin_parser/common.rl</filename>
    </modified>
    <modified>
      <diff>@@ -484,15 +484,11 @@ case 20:
 #line 485 &quot;parser.c&quot;
 	switch( (*p) ) {
 		case 32: goto tr30;
+		case 35: goto st0;
 		case 37: goto tr31;
-		case 60: goto st0;
-		case 62: goto st0;
 		case 127: goto st0;
 	}
-	if ( (*p) &gt; 31 ) {
-		if ( 34 &lt;= (*p) &amp;&amp; (*p) &lt;= 35 )
-			goto st0;
-	} else if ( (*p) &gt;= 0 )
+	if ( 0 &lt;= (*p) &amp;&amp; (*p) &lt;= 31 )
 		goto st0;
 	goto tr29;
 tr29:
@@ -503,18 +499,14 @@ st21:
 	if ( ++p == pe )
 		goto _out21;
 case 21:
-#line 507 &quot;parser.c&quot;
+#line 503 &quot;parser.c&quot;
 	switch( (*p) ) {
 		case 32: goto tr30;
+		case 35: goto st0;
 		case 37: goto st22;
-		case 60: goto st0;
-		case 62: goto st0;
 		case 127: goto st0;
 	}
-	if ( (*p) &gt; 31 ) {
-		if ( 34 &lt;= (*p) &amp;&amp; (*p) &lt;= 35 )
-			goto st0;
-	} else if ( (*p) &gt;= 0 )
+	if ( 0 &lt;= (*p) &amp;&amp; (*p) &lt;= 31 )
 		goto st0;
 	goto st21;
 tr31:
@@ -525,7 +517,7 @@ st22:
 	if ( ++p == pe )
 		goto _out22;
 case 22:
-#line 529 &quot;parser.c&quot;
+#line 521 &quot;parser.c&quot;
 	if ( (*p) &lt; 65 ) {
 		if ( 48 &lt;= (*p) &amp;&amp; (*p) &lt;= 57 )
 			goto st23;
@@ -556,7 +548,7 @@ st24:
 	if ( ++p == pe )
 		goto _out24;
 case 24:
-#line 560 &quot;parser.c&quot;
+#line 552 &quot;parser.c&quot;
 	switch( (*p) ) {
 		case 43: goto st24;
 		case 58: goto st25;
@@ -581,14 +573,11 @@ st25:
 	if ( ++p == pe )
 		goto _out25;
 case 25:
-#line 585 &quot;parser.c&quot;
+#line 577 &quot;parser.c&quot;
 	switch( (*p) ) {
 		case 32: goto tr8;
-		case 34: goto st0;
 		case 35: goto tr9;
 		case 37: goto st26;
-		case 60: goto st0;
-		case 62: goto st0;
 		case 127: goto st0;
 	}
 	if ( 0 &lt;= (*p) &amp;&amp; (*p) &lt;= 31 )
@@ -628,15 +617,12 @@ st28:
 	if ( ++p == pe )
 		goto _out28;
 case 28:
-#line 632 &quot;parser.c&quot;
+#line 621 &quot;parser.c&quot;
 	switch( (*p) ) {
 		case 32: goto tr40;
-		case 34: goto st0;
 		case 35: goto tr41;
 		case 37: goto st29;
 		case 59: goto tr43;
-		case 60: goto st0;
-		case 62: goto st0;
 		case 63: goto tr44;
 		case 127: goto st0;
 	}
@@ -681,14 +667,11 @@ st31:
 	if ( ++p == pe )
 		goto _out31;
 case 31:
-#line 685 &quot;parser.c&quot;
+#line 671 &quot;parser.c&quot;
 	switch( (*p) ) {
 		case 32: goto tr8;
-		case 34: goto st0;
 		case 35: goto tr9;
 		case 37: goto st32;
-		case 60: goto st0;
-		case 62: goto st0;
 		case 63: goto st34;
 		case 127: goto st0;
 	}
@@ -733,14 +716,11 @@ st34:
 	if ( ++p == pe )
 		goto _out34;
 case 34:
-#line 737 &quot;parser.c&quot;
+#line 720 &quot;parser.c&quot;
 	switch( (*p) ) {
 		case 32: goto tr51;
-		case 34: goto st0;
 		case 35: goto tr52;
 		case 37: goto tr53;
-		case 60: goto st0;
-		case 62: goto st0;
 		case 127: goto st0;
 	}
 	if ( 0 &lt;= (*p) &amp;&amp; (*p) &lt;= 31 )
@@ -754,14 +734,11 @@ st35:
 	if ( ++p == pe )
 		goto _out35;
 case 35:
-#line 758 &quot;parser.c&quot;
+#line 738 &quot;parser.c&quot;
 	switch( (*p) ) {
 		case 32: goto tr55;
-		case 34: goto st0;
 		case 35: goto tr56;
 		case 37: goto st36;
-		case 60: goto st0;
-		case 62: goto st0;
 		case 127: goto st0;
 	}
 	if ( 0 &lt;= (*p) &amp;&amp; (*p) &lt;= 31 )
@@ -775,7 +752,7 @@ st36:
 	if ( ++p == pe )
 		goto _out36;
 case 36:
-#line 779 &quot;parser.c&quot;
+#line 756 &quot;parser.c&quot;
 	if ( (*p) &lt; 65 ) {
 		if ( 48 &lt;= (*p) &amp;&amp; (*p) &lt;= 57 )
 			goto st37;
@@ -1205,7 +1182,7 @@ case 56:
   if(parser-&gt;body_start) {
     /* final \r\n combo encountered so stop right here */
     
-#line 1209 &quot;parser.c&quot;
+#line 1186 &quot;parser.c&quot;
 #line 130 &quot;parser.rl&quot;
     parser-&gt;nread++;
   }
@@ -1218,7 +1195,7 @@ int http_parser_finish(http_parser *parser)
   int cs = parser-&gt;cs;
 
   
-#line 1222 &quot;parser.c&quot;
+#line 1199 &quot;parser.c&quot;
 #line 141 &quot;parser.rl&quot;
 
   parser-&gt;cs = cs;</diff>
      <filename>ext/thin_parser/parser.c</filename>
    </modified>
    <modified>
      <diff>@@ -154,4 +154,22 @@ EOS
     request.body.read.should == 'aye'
   end
   
+  it &quot;should parse ie6 urls&quot; do
+    %w(/some/random/path&quot;
+       /some/random/path&gt;
+       /some/random/path&lt;
+       /we/love/you/ie6?q=&lt;&quot;&quot;&gt;
+       /url?&lt;=&quot;&amp;&gt;=&quot;
+       /mal&quot;formed&quot;?
+    ).each do |path|
+      parser     = HttpParser.new
+      req        = {}
+      sorta_safe = %(GET #{path} HTTP/1.1\r\n\r\n)
+      nread      = parser.execute(req, sorta_safe, 0)
+
+      sorta_safe.size.should == nread
+      parser.should be_finished
+      parser.should_not have_error
+    end
+  end
 end
\ No newline at end of file</diff>
      <filename>spec/request/parser_spec.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>dfb9dde6a75f83bb4617904bf15efa518f2431a1</id>
    </parent>
  </parents>
  <author>
    <name>macournoyer</name>
    <email>macournoyer@gmail.com</email>
  </author>
  <url>http://github.com/macournoyer/thin/commit/9ae43ca7aabfac13528cb1b58fdc9d7f987cef72</url>
  <id>9ae43ca7aabfac13528cb1b58fdc9d7f987cef72</id>
  <committed-date>2008-04-02T17:20:55-07:00</committed-date>
  <authored-date>2008-04-02T17:20:55-07:00</authored-date>
  <message>Port mongrel r996 parser fix to accept some weird ie6 headers:

  accept '&quot;' (double-quote), '&lt;', and '&gt;' characters in URLs

  Some broken web browsers don't properly escape &quot;, &lt;, and &gt; characters
  in URLs, however these URLs to occasionally legitimate and sometimes
  show up</message>
  <tree>85c9b5303810db6057eb14ca18bff25263a71bca</tree>
  <committer>
    <name>macournoyer</name>
    <email>macournoyer@gmail.com</email>
  </committer>
</commit>
