X7ROOT File Manager
Current Path:
/opt/alt/ruby19/lib64/ruby/gems/1.9.1/doc/rack-1.6.4/rdoc/Rack
opt
/
alt
/
ruby19
/
lib64
/
ruby
/
gems
/
1.9.1
/
doc
/
rack-1.6.4
/
rdoc
/
Rack
/
??
..
??
Auth
??
Auth.html
(14.25 KB)
??
BodyProxy.html
(21.15 KB)
??
Builder.html
(31.56 KB)
??
Cascade.html
(21.75 KB)
??
Chunked
??
Chunked.html
(18.98 KB)
??
CommonLogger.html
(17.58 KB)
??
ConditionalGet.html
(18.12 KB)
??
Config.html
(15.37 KB)
??
ContentLength.html
(18.03 KB)
??
ContentType.html
(16.66 KB)
??
Deflater
??
Deflater.html
(22.61 KB)
??
Directory.html
(37.8 KB)
??
ETag.html
(19.01 KB)
??
File.html
(30.76 KB)
??
ForwardRequest.html
(16.51 KB)
??
Handler
??
Handler.html
(27.8 KB)
??
Head.html
(16.17 KB)
??
Lint
??
Lint.html
(14.58 KB)
??
Lobster.html
(17.75 KB)
??
Lock.html
(16.71 KB)
??
Logger.html
(15.78 KB)
??
MethodOverride.html
(18.31 KB)
??
Mime.html
(17.65 KB)
??
MockRequest
??
MockRequest.html
(39.91 KB)
??
MockResponse.html
(21.02 KB)
??
Multipart
??
Multipart.html
(18.26 KB)
??
NullLogger.html
(38.82 KB)
??
Recursive.html
(20.18 KB)
??
Reloader
??
Reloader.html
(21.32 KB)
??
Request.html
(100.97 KB)
??
Response
??
Response.html
(35.97 KB)
??
RewindableInput
??
RewindableInput.html
(21.51 KB)
??
Runtime.html
(16.89 KB)
??
Sendfile.html
(23.65 KB)
??
Server
??
Server.html
(35.16 KB)
??
Session
??
Session.html
(13.56 KB)
??
ShowExceptions.html
(26.39 KB)
??
ShowStatus.html
(19.17 KB)
??
Static.html
(29.31 KB)
??
TempfileReaper.html
(16.51 KB)
??
URLMap.html
(23.63 KB)
??
Utils
??
Utils.html
(82.87 KB)
Editing: File.html
<?xml version="1.0" encoding="US-ASCII"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta content="text/html; charset=US-ASCII" http-equiv="Content-Type" /> <title>Class: Rack::File</title> <link rel="stylesheet" href="../rdoc.css" type="text/css" media="screen" /> <script src="../js/jquery.js" type="text/javascript" charset="utf-8"></script> <script src="../js/thickbox-compressed.js" type="text/javascript" charset="utf-8"></script> <script src="../js/quicksearch.js" type="text/javascript" charset="utf-8"></script> <script src="../js/darkfish.js" type="text/javascript" charset="utf-8"></script> </head> <body id="top" class="class"> <div id="metadata"> <div id="home-metadata"> <div id="home-section" class="section"> <h3 class="section-header"> <a href="../index.html">Home</a> <a href="../index.html#classes">Classes</a> <a href="../index.html#methods">Methods</a> </h3> </div> </div> <div id="file-metadata"> <div id="file-list-section" class="section"> <h3 class="section-header">In Files</h3> <div class="section-body"> <ul> <li><a href="../lib/rack/file_rb.html?TB_iframe=true&height=550&width=785" class="thickbox" title="lib/rack/file.rb">lib/rack/file.rb</a></li> </ul> </div> </div> </div> <div id="class-metadata"> <!-- Parent Class --> <div id="parent-class-section" class="section"> <h3 class="section-header">Parent</h3> <p class="link"><a href="../Object.html">Object</a></p> </div> <!-- Method Quickref --> <div id="method-list-section" class="section"> <h3 class="section-header">Methods</h3> <ul class="link-list"> <li><a href="#method-c-new">::new</a></li> <li><a href="#method-i-_call">#_call</a></li> <li><a href="#method-i-call">#call</a></li> <li><a href="#method-i-each">#each</a></li> <li><a href="#method-i-serving">#serving</a></li> </ul> </div> </div> <div id="project-metadata"> <div id="fileindex-section" class="section project-section"> <h3 class="section-header">Files</h3> <ul> <li class="file"><a href="../KNOWN-ISSUES.html">KNOWN-ISSUES</a></li> </ul> </div> <div id="classindex-section" class="section project-section"> <h3 class="section-header">Class/Module Index <span class="search-toggle"><img src="../images/find.png" height="16" width="16" alt="[+]" title="show/hide quicksearch" /></span></h3> <form action="#" method="get" accept-charset="utf-8" class="initially-hidden"> <fieldset> <legend>Quicksearch</legend> <input type="text" name="quicksearch" value="" class="quicksearch-field" /> </fieldset> </form> <ul class="link-list"> <li><a href="../Rack.html">Rack</a></li> <li><a href="../Rack/Auth.html">Rack::Auth</a></li> <li><a href="../Rack/Auth/AbstractHandler.html">Rack::Auth::AbstractHandler</a></li> <li><a href="../Rack/Auth/AbstractRequest.html">Rack::Auth::AbstractRequest</a></li> <li><a href="../Rack/Auth/Basic.html">Rack::Auth::Basic</a></li> <li><a href="../Rack/Auth/Basic/Request.html">Rack::Auth::Basic::Request</a></li> <li><a href="../Rack/Auth/Digest.html">Rack::Auth::Digest</a></li> <li><a href="../Rack/Auth/Digest/MD5.html">Rack::Auth::Digest::MD5</a></li> <li><a href="../Rack/Auth/Digest/Nonce.html">Rack::Auth::Digest::Nonce</a></li> <li><a href="../Rack/Auth/Digest/Params.html">Rack::Auth::Digest::Params</a></li> <li><a href="../Rack/Auth/Digest/Request.html">Rack::Auth::Digest::Request</a></li> <li><a href="../Rack/BodyProxy.html">Rack::BodyProxy</a></li> <li><a href="../Rack/Builder.html">Rack::Builder</a></li> <li><a href="../Rack/Cascade.html">Rack::Cascade</a></li> <li><a href="../Rack/Chunked.html">Rack::Chunked</a></li> <li><a href="../Rack/Chunked/Body.html">Rack::Chunked::Body</a></li> <li><a href="../Rack/CommonLogger.html">Rack::CommonLogger</a></li> <li><a href="../Rack/ConditionalGet.html">Rack::ConditionalGet</a></li> <li><a href="../Rack/Config.html">Rack::Config</a></li> <li><a href="../Rack/ContentLength.html">Rack::ContentLength</a></li> <li><a href="../Rack/ContentType.html">Rack::ContentType</a></li> <li><a href="../Rack/Deflater.html">Rack::Deflater</a></li> <li><a href="../Rack/Deflater/DeflateStream.html">Rack::Deflater::DeflateStream</a></li> <li><a href="../Rack/Deflater/GzipStream.html">Rack::Deflater::GzipStream</a></li> <li><a href="../Rack/Directory.html">Rack::Directory</a></li> <li><a href="../Rack/ETag.html">Rack::ETag</a></li> <li><a href="../Rack/File.html">Rack::File</a></li> <li><a href="../Rack/ForwardRequest.html">Rack::ForwardRequest</a></li> <li><a href="../Rack/Handler.html">Rack::Handler</a></li> <li><a href="../Rack/Handler/CGI.html">Rack::Handler::CGI</a></li> <li><a href="../Rack/Handler/EventedMongrel.html">Rack::Handler::EventedMongrel</a></li> <li><a href="../Rack/Handler/FastCGI.html">Rack::Handler::FastCGI</a></li> <li><a href="../Rack/Handler/LSWS.html">Rack::Handler::LSWS</a></li> <li><a href="../Rack/Handler/Mongrel.html">Rack::Handler::Mongrel</a></li> <li><a href="../Rack/Handler/SCGI.html">Rack::Handler::SCGI</a></li> <li><a href="../Rack/Handler/SwiftipliedMongrel.html">Rack::Handler::SwiftipliedMongrel</a></li> <li><a href="../Rack/Handler/Thin.html">Rack::Handler::Thin</a></li> <li><a href="../Rack/Handler/WEBrick.html">Rack::Handler::WEBrick</a></li> <li><a href="../Rack/Head.html">Rack::Head</a></li> <li><a href="../Rack/Lint.html">Rack::Lint</a></li> <li><a href="../Rack/Lobster.html">Rack::Lobster</a></li> <li><a href="../Rack/Lock.html">Rack::Lock</a></li> <li><a href="../Rack/Logger.html">Rack::Logger</a></li> <li><a href="../Rack/MethodOverride.html">Rack::MethodOverride</a></li> <li><a href="../Rack/Mime.html">Rack::Mime</a></li> <li><a href="../Rack/MockRequest.html">Rack::MockRequest</a></li> <li><a href="../Rack/MockRequest/FatalWarner.html">Rack::MockRequest::FatalWarner</a></li> <li><a href="../Rack/MockRequest/FatalWarning.html">Rack::MockRequest::FatalWarning</a></li> <li><a href="../Rack/MockResponse.html">Rack::MockResponse</a></li> <li><a href="../Rack/Multipart.html">Rack::Multipart</a></li> <li><a href="../Rack/Multipart/Generator.html">Rack::Multipart::Generator</a></li> <li><a href="../Rack/Multipart/MultipartPartLimitError.html">Rack::Multipart::MultipartPartLimitError</a></li> <li><a href="../Rack/Multipart/Parser.html">Rack::Multipart::Parser</a></li> <li><a href="../Rack/Multipart/UploadedFile.html">Rack::Multipart::UploadedFile</a></li> <li><a href="../Rack/NullLogger.html">Rack::NullLogger</a></li> <li><a href="../Rack/Recursive.html">Rack::Recursive</a></li> <li><a href="../Rack/Reloader.html">Rack::Reloader</a></li> <li><a href="../Rack/Reloader/Stat.html">Rack::Reloader::Stat</a></li> <li><a href="../Rack/Request.html">Rack::Request</a></li> <li><a href="../Rack/Response.html">Rack::Response</a></li> <li><a href="../Rack/Response/Helpers.html">Rack::Response::Helpers</a></li> <li><a href="../Rack/RewindableInput.html">Rack::RewindableInput</a></li> <li><a href="../Rack/RewindableInput/Tempfile.html">Rack::RewindableInput::Tempfile</a></li> <li><a href="../Rack/Runtime.html">Rack::Runtime</a></li> <li><a href="../Rack/Sendfile.html">Rack::Sendfile</a></li> <li><a href="../Rack/Server.html">Rack::Server</a></li> <li><a href="../Rack/Server/Options.html">Rack::Server::Options</a></li> <li><a href="../Rack/Session.html">Rack::Session</a></li> <li><a href="../Rack/Session/Abstract.html">Rack::Session::Abstract</a></li> <li><a href="../Rack/Session/Abstract/ID.html">Rack::Session::Abstract::ID</a></li> <li><a href="../Rack/Session/Abstract/SessionHash.html">Rack::Session::Abstract::SessionHash</a></li> <li><a href="../Rack/Session/Cookie.html">Rack::Session::Cookie</a></li> <li><a href="../Rack/Session/Cookie/Base64.html">Rack::Session::Cookie::Base64</a></li> <li><a href="../Rack/Session/Cookie/Base64/JSON.html">Rack::Session::Cookie::Base64::JSON</a></li> <li><a href="../Rack/Session/Cookie/Base64/Marshal.html">Rack::Session::Cookie::Base64::Marshal</a></li> <li><a href="../Rack/Session/Cookie/Base64/ZipJSON.html">Rack::Session::Cookie::Base64::ZipJSON</a></li> <li><a href="../Rack/Session/Cookie/Identity.html">Rack::Session::Cookie::Identity</a></li> <li><a href="../Rack/Session/Memcache.html">Rack::Session::Memcache</a></li> <li><a href="../Rack/Session/Pool.html">Rack::Session::Pool</a></li> <li><a href="../Rack/ShowExceptions.html">Rack::ShowExceptions</a></li> <li><a href="../Rack/ShowStatus.html">Rack::ShowStatus</a></li> <li><a href="../Rack/Static.html">Rack::Static</a></li> <li><a href="../Rack/TempfileReaper.html">Rack::TempfileReaper</a></li> <li><a href="../Rack/URLMap.html">Rack::URLMap</a></li> <li><a href="../Rack/Utils.html">Rack::Utils</a></li> <li><a href="../Rack/Utils/Context.html">Rack::Utils::Context</a></li> <li><a href="../Rack/Utils/HeaderHash.html">Rack::Utils::HeaderHash</a></li> <li><a href="../Rack/Utils/InvalidParameterError.html">Rack::Utils::InvalidParameterError</a></li> <li><a href="../Rack/Utils/KeySpaceConstrainedParams.html">Rack::Utils::KeySpaceConstrainedParams</a></li> <li><a href="../Rack/Multipart.html">Rack::Utils::Multipart</a></li> <li><a href="../Rack/Utils/OkJson.html">Rack::Utils::OkJson</a></li> <li><a href="../Rack/Utils/OkJson/Error.html">Rack::Utils::OkJson::Error</a></li> <li><a href="../Rack/Utils/OkJson/Utf8Error.html">Rack::Utils::OkJson::Utf8Error</a></li> <li><a href="../Rack/Utils/ParameterTypeError.html">Rack::Utils::ParameterTypeError</a></li> <li><a href="../FCGI.html">FCGI</a></li> <li><a href="../FCGI/Stream.html">FCGI::Stream</a></li> <li><a href="../WEBrick.html">WEBrick</a></li> <li><a href="../WEBrick/HTTPResponse.html">WEBrick::HTTPResponse</a></li> <li><a href="../Object.html">Object</a></li> </ul> <div id="no-class-search-results" style="display: none;">No matching classes.</div> </div> </div> </div> <div id="documentation"> <h1 class="class">Rack::File</h1> <div id="description" class="description"> <p><a href="File.html">Rack::File</a> serves files below the <tt>root</tt> directory given, according to the path info of the <a href="../Rack.html">Rack</a> request. e.g. when <a href="File.html#method-c-new">Rack::File.new</a>("/etc") is used, you can access 'passwd' file as <a href="http://localhost:9292/passwd">localhost:9292/passwd</a></p> <p>Handlers can detect if bodies are a <a href="File.html">Rack::File</a>, and use mechanisms like sendfile on the <tt>path</tt>.</p> </div><!-- description --> <div id="5Buntitled-5D" class="documentation-section"> <!-- Constants --> <div id="constants-list" class="section"> <h3 class="section-header">Constants</h3> <dl> <dt><a name="ALLOWED_VERBS">ALLOWED_VERBS</a></dt> <dd class="description"></dd> <dt><a name="ALLOW_HEADER">ALLOW_HEADER</a></dt> <dd class="description"></dd> <dt><a name="F">F</a></dt> <dd class="description"></dd> </dl> </div> <!-- Attributes --> <div id="attribute-method-details" class="method-section section"> <h3 class="section-header">Attributes</h3> <div id="cache_control-attribute-method" class="method-detail"> <a name="cache_control"></a> <a name="cache_control="></a> <div class="method-heading attribute-method-heading"> <span class="method-name">cache_control</span><span class="attribute-access-type">[RW]</span> </div> <div class="method-description"> </div> </div> <div id="path-attribute-method" class="method-detail"> <a name="path"></a> <a name="path="></a> <div class="method-heading attribute-method-heading"> <span class="method-name">path</span><span class="attribute-access-type">[RW]</span> </div> <div class="method-description"> </div> </div> <div id="root-attribute-method" class="method-detail"> <a name="root"></a> <a name="root="></a> <div class="method-heading attribute-method-heading"> <span class="method-name">root</span><span class="attribute-access-type">[RW]</span> </div> <div class="method-description"> </div> </div> <div id="to_path-attribute-method" class="method-detail"> <a name="to_path"></a> <a name="to_path="></a> <div class="method-heading attribute-method-heading"> <span class="method-name">to_path</span><span class="attribute-access-type">[RW]</span> </div> <div class="method-description"> </div> </div> </div><!-- attribute-method-details --> <!-- Methods --> <div id="public-class-method-details" class="method-section section"> <h3 class="section-header">Public Class Methods</h3> <div id="new-method" class="method-detail "> <a name="method-c-new"></a> <div class="method-heading"> <span class="method-name">new</span><span class="method-args">(root, headers={}, default_mime = 'text/plain')</span> <span class="method-click-advice">click to toggle source</span> </div> <div class="method-description"> <div class="method-source-code" id="new-source"> <pre> <span class="ruby-comment"># File lib/rack/file.rb, line 24</span> <span class="ruby-keyword">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">root</span>, <span class="ruby-identifier">headers</span>={}, <span class="ruby-identifier">default_mime</span> = <span class="ruby-string">'text/plain'</span>) <span class="ruby-ivar">@root</span> = <span class="ruby-identifier">root</span> <span class="ruby-ivar">@headers</span> = <span class="ruby-identifier">headers</span> <span class="ruby-ivar">@default_mime</span> = <span class="ruby-identifier">default_mime</span> <span class="ruby-keyword">end</span></pre> </div><!-- new-source --> </div> </div><!-- new-method --> </div><!-- public-class-method-details --> <div id="public-instance-method-details" class="method-section section"> <h3 class="section-header">Public Instance Methods</h3> <div id="_call-method" class="method-detail "> <a name="method-i-_call"></a> <div class="method-heading"> <span class="method-name">_call</span><span class="method-args">(env)</span> <span class="method-click-advice">click to toggle source</span> </div> <div class="method-description"> <div class="method-source-code" id="_call-source"> <pre> <span class="ruby-comment"># File lib/rack/file.rb, line 36</span> <span class="ruby-keyword">def</span> <span class="ruby-identifier">_call</span>(<span class="ruby-identifier">env</span>) <span class="ruby-keyword">unless</span> <span class="ruby-constant">ALLOWED_VERBS</span>.<span class="ruby-identifier">include?</span> <span class="ruby-identifier">env</span>[<span class="ruby-constant">REQUEST_METHOD</span>] <span class="ruby-keyword">return</span> <span class="ruby-identifier">fail</span>(<span class="ruby-value">405</span>, <span class="ruby-string">"Method Not Allowed"</span>, {<span class="ruby-string">'Allow'</span> =<span class="ruby-operator">></span> <span class="ruby-constant">ALLOW_HEADER</span>}) <span class="ruby-keyword">end</span> <span class="ruby-identifier">path_info</span> = <span class="ruby-constant">Utils</span>.<span class="ruby-identifier">unescape</span>(<span class="ruby-identifier">env</span>[<span class="ruby-constant">PATH_INFO</span>]) <span class="ruby-identifier">clean_path_info</span> = <span class="ruby-constant">Utils</span>.<span class="ruby-identifier">clean_path_info</span>(<span class="ruby-identifier">path_info</span>) <span class="ruby-ivar">@path</span> = <span class="ruby-constant">F</span>.<span class="ruby-identifier">join</span>(<span class="ruby-ivar">@root</span>, <span class="ruby-identifier">clean_path_info</span>) <span class="ruby-identifier">available</span> = <span class="ruby-keyword">begin</span> <span class="ruby-constant">F</span>.<span class="ruby-identifier">file?</span>(<span class="ruby-ivar">@path</span>) <span class="ruby-operator">&&</span> <span class="ruby-constant">F</span>.<span class="ruby-identifier">readable?</span>(<span class="ruby-ivar">@path</span>) <span class="ruby-keyword">rescue</span> <span class="ruby-constant">SystemCallError</span> <span class="ruby-keyword">false</span> <span class="ruby-keyword">end</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">available</span> <span class="ruby-identifier">serving</span>(<span class="ruby-identifier">env</span>) <span class="ruby-keyword">else</span> <span class="ruby-identifier">fail</span>(<span class="ruby-value">404</span>, <span class="ruby-node">"File not found: #{path_info}"</span>) <span class="ruby-keyword">end</span> <span class="ruby-keyword">end</span></pre> </div><!-- _call-source --> </div> </div><!-- _call-method --> <div id="call-method" class="method-detail "> <a name="method-i-call"></a> <div class="method-heading"> <span class="method-name">call</span><span class="method-args">(env)</span> <span class="method-click-advice">click to toggle source</span> </div> <div class="method-description"> <div class="method-source-code" id="call-source"> <pre> <span class="ruby-comment"># File lib/rack/file.rb, line 30</span> <span class="ruby-keyword">def</span> <span class="ruby-identifier">call</span>(<span class="ruby-identifier">env</span>) <span class="ruby-identifier">dup</span>.<span class="ruby-identifier">_call</span>(<span class="ruby-identifier">env</span>) <span class="ruby-keyword">end</span></pre> </div><!-- call-source --> </div> </div><!-- call-method --> <div id="each-method" class="method-detail "> <a name="method-i-each"></a> <div class="method-heading"> <span class="method-name">each</span><span class="method-args">()</span> <span class="method-click-advice">click to toggle source</span> </div> <div class="method-description"> <div class="method-source-code" id="each-source"> <pre> <span class="ruby-comment"># File lib/rack/file.rb, line 101</span> <span class="ruby-keyword">def</span> <span class="ruby-identifier">each</span> <span class="ruby-constant">F</span>.<span class="ruby-identifier">open</span>(<span class="ruby-ivar">@path</span>, <span class="ruby-string">"rb"</span>) <span class="ruby-keyword">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">file</span><span class="ruby-operator">|</span> <span class="ruby-identifier">file</span>.<span class="ruby-identifier">seek</span>(<span class="ruby-ivar">@range</span>.<span class="ruby-identifier">begin</span>) <span class="ruby-identifier">remaining_len</span> = <span class="ruby-ivar">@range</span>.<span class="ruby-identifier">end</span><span class="ruby-operator">-</span><span class="ruby-ivar">@range</span>.<span class="ruby-identifier">begin</span><span class="ruby-operator">+</span><span class="ruby-value">1</span> <span class="ruby-keyword">while</span> <span class="ruby-identifier">remaining_len</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span> <span class="ruby-identifier">part</span> = <span class="ruby-identifier">file</span>.<span class="ruby-identifier">read</span>([<span class="ruby-value">8192</span>, <span class="ruby-identifier">remaining_len</span>].<span class="ruby-identifier">min</span>) <span class="ruby-keyword">break</span> <span class="ruby-keyword">unless</span> <span class="ruby-identifier">part</span> <span class="ruby-identifier">remaining_len</span> <span class="ruby-operator">-=</span> <span class="ruby-identifier">part</span>.<span class="ruby-identifier">length</span> <span class="ruby-keyword">yield</span> <span class="ruby-identifier">part</span> <span class="ruby-keyword">end</span> <span class="ruby-keyword">end</span> <span class="ruby-keyword">end</span></pre> </div><!-- each-source --> </div> </div><!-- each-method --> <div id="serving-method" class="method-detail "> <a name="method-i-serving"></a> <div class="method-heading"> <span class="method-name">serving</span><span class="method-args">(env)</span> <span class="method-click-advice">click to toggle source</span> </div> <div class="method-description"> <div class="method-source-code" id="serving-source"> <pre> <span class="ruby-comment"># File lib/rack/file.rb, line 59</span> <span class="ruby-keyword">def</span> <span class="ruby-identifier">serving</span>(<span class="ruby-identifier">env</span>) <span class="ruby-keyword">if</span> <span class="ruby-identifier">env</span>[<span class="ruby-string">"REQUEST_METHOD"</span>] <span class="ruby-operator">==</span> <span class="ruby-string">"OPTIONS"</span> <span class="ruby-keyword">return</span> [<span class="ruby-value">200</span>, {<span class="ruby-string">'Allow'</span> =<span class="ruby-operator">></span> <span class="ruby-constant">ALLOW_HEADER</span>, <span class="ruby-constant">CONTENT_LENGTH</span> =<span class="ruby-operator">></span> <span class="ruby-string">'0'</span>}, []] <span class="ruby-keyword">end</span> <span class="ruby-identifier">last_modified</span> = <span class="ruby-constant">F</span>.<span class="ruby-identifier">mtime</span>(<span class="ruby-ivar">@path</span>).<span class="ruby-identifier">httpdate</span> <span class="ruby-keyword">return</span> [<span class="ruby-value">304</span>, {}, []] <span class="ruby-keyword">if</span> <span class="ruby-identifier">env</span>[<span class="ruby-string">'HTTP_IF_MODIFIED_SINCE'</span>] <span class="ruby-operator">==</span> <span class="ruby-identifier">last_modified</span> <span class="ruby-identifier">headers</span> = { <span class="ruby-string">"Last-Modified"</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">last_modified</span> } <span class="ruby-identifier">headers</span>[<span class="ruby-constant">CONTENT_TYPE</span>] = <span class="ruby-identifier">mime_type</span> <span class="ruby-keyword">if</span> <span class="ruby-identifier">mime_type</span> <span class="ruby-comment"># Set custom headers</span> <span class="ruby-ivar">@headers</span>.<span class="ruby-identifier">each</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">field</span>, <span class="ruby-identifier">content</span><span class="ruby-operator">|</span> <span class="ruby-identifier">headers</span>[<span class="ruby-identifier">field</span>] = <span class="ruby-identifier">content</span> } <span class="ruby-keyword">if</span> <span class="ruby-ivar">@headers</span> <span class="ruby-identifier">response</span> = [ <span class="ruby-value">200</span>, <span class="ruby-identifier">headers</span>, <span class="ruby-identifier">env</span>[<span class="ruby-constant">REQUEST_METHOD</span>] <span class="ruby-operator">==</span> <span class="ruby-string">"HEAD"</span> <span class="ruby-operator">?</span> [] <span class="ruby-operator">:</span> <span class="ruby-keyword">self</span> ] <span class="ruby-identifier">size</span> = <span class="ruby-identifier">filesize</span> <span class="ruby-identifier">ranges</span> = <span class="ruby-constant">Rack</span><span class="ruby-operator">::</span><span class="ruby-constant">Utils</span>.<span class="ruby-identifier">byte_ranges</span>(<span class="ruby-identifier">env</span>, <span class="ruby-identifier">size</span>) <span class="ruby-keyword">if</span> <span class="ruby-identifier">ranges</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">ranges</span>.<span class="ruby-identifier">length</span> <span class="ruby-operator">></span> <span class="ruby-value">1</span> <span class="ruby-comment"># No ranges, or multiple ranges (which we don't support):</span> <span class="ruby-comment"># TODO: Support multiple byte-ranges</span> <span class="ruby-identifier">response</span>[<span class="ruby-value">0</span>] = <span class="ruby-value">200</span> <span class="ruby-ivar">@range</span> = <span class="ruby-value">0</span><span class="ruby-operator">..</span><span class="ruby-identifier">size</span><span class="ruby-operator">-</span><span class="ruby-value">1</span> <span class="ruby-keyword">elsif</span> <span class="ruby-identifier">ranges</span>.<span class="ruby-identifier">empty?</span> <span class="ruby-comment"># Unsatisfiable. Return error, and file size:</span> <span class="ruby-identifier">response</span> = <span class="ruby-identifier">fail</span>(<span class="ruby-value">416</span>, <span class="ruby-string">"Byte range unsatisfiable"</span>) <span class="ruby-identifier">response</span>[<span class="ruby-value">1</span>][<span class="ruby-string">"Content-Range"</span>] = <span class="ruby-node">"bytes */#{size}"</span> <span class="ruby-keyword">return</span> <span class="ruby-identifier">response</span> <span class="ruby-keyword">else</span> <span class="ruby-comment"># Partial content:</span> <span class="ruby-ivar">@range</span> = <span class="ruby-identifier">ranges</span>[<span class="ruby-value">0</span>] <span class="ruby-identifier">response</span>[<span class="ruby-value">0</span>] = <span class="ruby-value">206</span> <span class="ruby-identifier">response</span>[<span class="ruby-value">1</span>][<span class="ruby-string">"Content-Range"</span>] = <span class="ruby-node">"bytes #{@range.begin}-#{@range.end}/#{size}"</span> <span class="ruby-identifier">size</span> = <span class="ruby-ivar">@range</span>.<span class="ruby-identifier">end</span> <span class="ruby-operator">-</span> <span class="ruby-ivar">@range</span>.<span class="ruby-identifier">begin</span> <span class="ruby-operator">+</span> <span class="ruby-value">1</span> <span class="ruby-keyword">end</span> <span class="ruby-identifier">response</span>[<span class="ruby-value">2</span>] = [<span class="ruby-identifier">response_body</span>] <span class="ruby-keyword">unless</span> <span class="ruby-identifier">response_body</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-identifier">response</span>[<span class="ruby-value">1</span>][<span class="ruby-constant">CONTENT_LENGTH</span>] = <span class="ruby-identifier">size</span>.<span class="ruby-identifier">to_s</span> <span class="ruby-identifier">response</span> <span class="ruby-keyword">end</span></pre> </div><!-- serving-source --> </div> </div><!-- serving-method --> </div><!-- public-instance-method-details --> </div><!-- 5Buntitled-5D --> </div><!-- documentation --> <div id="validator-badges"> <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p> <p><small>Generated with the <a href="http://deveiate.org/projects/Darkfish-Rdoc/">Darkfish Rdoc Generator</a> 2</small>.</p> </div> </body> </html>
Upload File
Create Folder