doc/rdoc/classes/Mongrel/DirHandler.src/M000052.html in mongrel-0.3.13.4 vs doc/rdoc/classes/Mongrel/DirHandler.src/M000052.html in mongrel-1.0
- old
+ new
@@ -3,61 +3,40 @@
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
- <title>send_file (Mongrel::DirHandler)</title>
+ <title>can_serve (Mongrel::DirHandler)</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<link rel="stylesheet" href="../../.././rdoc-style.css" type="text/css" media="screen" />
</head>
<body class="standalone-code">
- <pre> <span class="ruby-comment cmt"># File lib/mongrel/handlers.rb, line 193</span>
-193: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">send_file</span>(<span class="ruby-identifier">req_path</span>, <span class="ruby-identifier">request</span>, <span class="ruby-identifier">response</span>, <span class="ruby-identifier">header_only</span>=<span class="ruby-keyword kw">false</span>)
-194:
-195: <span class="ruby-identifier">stat</span> = <span class="ruby-constant">File</span>.<span class="ruby-identifier">stat</span>(<span class="ruby-identifier">req_path</span>)
-196:
-197: <span class="ruby-comment cmt"># Set the last modified times as well and etag for all files</span>
-198: <span class="ruby-identifier">mtime</span> = <span class="ruby-identifier">stat</span>.<span class="ruby-identifier">mtime</span>
-199: <span class="ruby-comment cmt"># Calculated the same as apache, not sure how well the works on win32</span>
-200: <span class="ruby-identifier">etag</span> = <span class="ruby-constant">Const</span><span class="ruby-operator">::</span><span class="ruby-constant">ETAG_FORMAT</span> <span class="ruby-operator">%</span> [<span class="ruby-identifier">mtime</span>.<span class="ruby-identifier">to_i</span>, <span class="ruby-identifier">stat</span>.<span class="ruby-identifier">size</span>, <span class="ruby-identifier">stat</span>.<span class="ruby-identifier">ino</span>]
-201:
-202: <span class="ruby-identifier">modified_since</span> = <span class="ruby-identifier">request</span>.<span class="ruby-identifier">params</span>[<span class="ruby-constant">Const</span><span class="ruby-operator">::</span><span class="ruby-constant">HTTP_IF_MODIFIED_SINCE</span>]
-203: <span class="ruby-identifier">none_match</span> = <span class="ruby-identifier">request</span>.<span class="ruby-identifier">params</span>[<span class="ruby-constant">Const</span><span class="ruby-operator">::</span><span class="ruby-constant">HTTP_IF_NONE_MATCH</span>]
-204:
-205: <span class="ruby-comment cmt"># test to see if this is a conditional request, and test if</span>
-206: <span class="ruby-comment cmt"># the response would be identical to the last response</span>
-207: <span class="ruby-identifier">same_response</span> = <span class="ruby-keyword kw">case</span>
-208: <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">modified_since</span> <span class="ruby-operator">&&</span> <span class="ruby-operator">!</span><span class="ruby-identifier">last_response_time</span> = <span class="ruby-constant">Time</span>.<span class="ruby-identifier">httpdate</span>(<span class="ruby-identifier">modified_since</span>) <span class="ruby-keyword kw">rescue</span> <span class="ruby-keyword kw">nil</span> <span class="ruby-operator">:</span> <span class="ruby-keyword kw">false</span>
-209: <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">modified_since</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">last_response_time</span> <span class="ruby-operator">></span> <span class="ruby-constant">Time</span>.<span class="ruby-identifier">now</span> <span class="ruby-operator">:</span> <span class="ruby-keyword kw">false</span>
-210: <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">modified_since</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">mtime</span> <span class="ruby-operator">></span> <span class="ruby-identifier">last_response_time</span> <span class="ruby-operator">:</span> <span class="ruby-keyword kw">false</span>
-211: <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">none_match</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">none_match</span> <span class="ruby-operator">==</span> <span class="ruby-value str">'*'</span> <span class="ruby-operator">:</span> <span class="ruby-keyword kw">false</span>
-212: <span class="ruby-keyword kw">when</span> <span class="ruby-identifier">none_match</span> <span class="ruby-operator">&&</span> <span class="ruby-operator">!</span><span class="ruby-identifier">none_match</span>.<span class="ruby-identifier">strip</span>.<span class="ruby-identifier">split</span>(<span class="ruby-regexp re">/\s*,\s*/</span>).<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">etag</span>) <span class="ruby-operator">:</span> <span class="ruby-keyword kw">false</span>
-213: <span class="ruby-keyword kw">else</span> <span class="ruby-identifier">modified_since</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">none_match</span> <span class="ruby-comment cmt"># validation successful if we get this far and at least one of the header exists</span>
-214: <span class="ruby-keyword kw">end</span>
-215:
-216: <span class="ruby-identifier">header</span> = <span class="ruby-identifier">response</span>.<span class="ruby-identifier">header</span>
-217: <span class="ruby-identifier">header</span>[<span class="ruby-constant">Const</span><span class="ruby-operator">::</span><span class="ruby-constant">ETAG</span>] = <span class="ruby-identifier">etag</span>
-218:
-219: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">same_response</span>
-220: <span class="ruby-identifier">response</span>.<span class="ruby-identifier">start</span>(<span class="ruby-value">304</span>) {}
-221: <span class="ruby-keyword kw">else</span>
-222: <span class="ruby-comment cmt"># first we setup the headers and status then we do a very fast send on the socket directly</span>
-223: <span class="ruby-identifier">response</span>.<span class="ruby-identifier">status</span> = <span class="ruby-value">200</span>
-224: <span class="ruby-identifier">header</span>[<span class="ruby-constant">Const</span><span class="ruby-operator">::</span><span class="ruby-constant">LAST_MODIFIED</span>] = <span class="ruby-identifier">mtime</span>.<span class="ruby-identifier">httpdate</span>
-225:
-226: <span class="ruby-comment cmt"># set the mime type from our map based on the ending</span>
-227: <span class="ruby-identifier">dot_at</span> = <span class="ruby-identifier">req_path</span>.<span class="ruby-identifier">rindex</span>(<span class="ruby-value str">'.'</span>)
-228: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">dot_at</span>
-229: <span class="ruby-identifier">header</span>[<span class="ruby-constant">Const</span><span class="ruby-operator">::</span><span class="ruby-constant">CONTENT_TYPE</span>] = <span class="ruby-constant">MIME_TYPES</span>[<span class="ruby-identifier">req_path</span>[<span class="ruby-identifier">dot_at</span> <span class="ruby-operator">..</span> <span class="ruby-value">-1</span>]] <span class="ruby-operator">||</span> <span class="ruby-ivar">@default_content_type</span>
-230: <span class="ruby-keyword kw">end</span>
-231:
-232: <span class="ruby-comment cmt"># send a status with out content length</span>
-233: <span class="ruby-identifier">response</span>.<span class="ruby-identifier">send_status</span>(<span class="ruby-identifier">stat</span>.<span class="ruby-identifier">size</span>)
-234: <span class="ruby-identifier">response</span>.<span class="ruby-identifier">send_header</span>
-235:
-236: <span class="ruby-keyword kw">if</span> <span class="ruby-keyword kw">not</span> <span class="ruby-identifier">header_only</span>
-237: <span class="ruby-identifier">response</span>.<span class="ruby-identifier">send_file</span>(<span class="ruby-identifier">req_path</span>, <span class="ruby-identifier">stat</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator"><</span> <span class="ruby-constant">Const</span><span class="ruby-operator">::</span><span class="ruby-constant">CHUNK_SIZE</span> <span class="ruby-operator">*</span> <span class="ruby-value">2</span>)
-238: <span class="ruby-keyword kw">end</span>
-239: <span class="ruby-keyword kw">end</span>
-240: <span class="ruby-keyword kw">end</span></pre>
+ <pre> <span class="ruby-comment cmt"># File lib/mongrel/handlers.rb, line 122</span>
+122: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">can_serve</span>(<span class="ruby-identifier">path_info</span>)
+123: <span class="ruby-identifier">req_path</span> = <span class="ruby-constant">File</span>.<span class="ruby-identifier">expand_path</span>(<span class="ruby-constant">File</span>.<span class="ruby-identifier">join</span>(<span class="ruby-ivar">@path</span>,<span class="ruby-constant">HttpRequest</span>.<span class="ruby-identifier">unescape</span>(<span class="ruby-identifier">path_info</span>)), <span class="ruby-ivar">@path</span>)
+124:
+125: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">req_path</span>.<span class="ruby-identifier">index</span>(<span class="ruby-ivar">@path</span>) <span class="ruby-operator">==</span> <span class="ruby-value">0</span> <span class="ruby-keyword kw">and</span> <span class="ruby-constant">File</span>.<span class="ruby-identifier">exist?</span> <span class="ruby-identifier">req_path</span>
+126: <span class="ruby-comment cmt"># it exists and it's in the right location</span>
+127: <span class="ruby-keyword kw">if</span> <span class="ruby-constant">File</span>.<span class="ruby-identifier">directory?</span> <span class="ruby-identifier">req_path</span>
+128: <span class="ruby-comment cmt"># the request is for a directory</span>
+129: <span class="ruby-identifier">index</span> = <span class="ruby-constant">File</span>.<span class="ruby-identifier">join</span>(<span class="ruby-identifier">req_path</span>, <span class="ruby-ivar">@index_html</span>)
+130: <span class="ruby-keyword kw">if</span> <span class="ruby-constant">File</span>.<span class="ruby-identifier">exist?</span> <span class="ruby-identifier">index</span>
+131: <span class="ruby-comment cmt"># serve the index</span>
+132: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">index</span>
+133: <span class="ruby-keyword kw">elsif</span> <span class="ruby-ivar">@listing_allowed</span>
+134: <span class="ruby-comment cmt"># serve the directory</span>
+135: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">req_path</span>
+136: <span class="ruby-keyword kw">else</span>
+137: <span class="ruby-comment cmt"># do not serve anything</span>
+138: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">nil</span>
+139: <span class="ruby-keyword kw">end</span>
+140: <span class="ruby-keyword kw">else</span>
+141: <span class="ruby-comment cmt"># it's a file and it's there</span>
+142: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">req_path</span>
+143: <span class="ruby-keyword kw">end</span>
+144: <span class="ruby-keyword kw">else</span>
+145: <span class="ruby-comment cmt"># does not exist or isn't in the right spot</span>
+146: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">nil</span>
+147: <span class="ruby-keyword kw">end</span>
+148: <span class="ruby-keyword kw">end</span></pre>
</body>
</html>
\ No newline at end of file