Ruby on Rails 5.2 - ActionDispatch::FileHandler

class ActionDispatch :: FileHandler




ruby

class ActionDispatch :: FileHandler

जनक:
Object

यह मिडिलवेयर फ़ाइल की सामग्री को डिस्क से शरीर की प्रतिक्रिया में देता है। जब आरंभीकृत किया जाता है, तो यह वैकल्पिक HTTP हेडर स्वीकार कर सकता है, जो तब सेट किया जाएगा जब किसी फ़ाइल की सामग्री वाली प्रतिक्रिया दी जाएगी।

यह मिडलवेयर env["PATH_INFO"] में निर्दिष्ट फ़ाइल को प्रस्तुत करेगा, जहाँ root निर्देशिका में आधार पथ है। उदाहरण के लिए, यदि root को public/ सेट किया गया है, तो assets/application.js env["PATH_INFO"] के साथ एक अनुरोध public/assets/application.js पर स्थित फ़ाइल की सामग्री के साथ एक प्रतिक्रिया लौटाएगा यदि फ़ाइल मौजूद। यदि फ़ाइल मौजूद नहीं है, तो 404 "फ़ाइल नहीं मिली" प्रतिक्रिया वापस आ जाएगी।

पब्लिक क्लास के तरीके

नया (रूट, इंडेक्स: "इंडेक्स", हेडर: {}) स्रोत दिखाएं
# File actionpack/lib/action_dispatch/middleware/static.rb, line 18
def initialize(root, index: "index", headers: {})
  @root          = root.chomp("/").b
  @file_server   = ::Rack::File.new(@root, headers)
  @index         = index
end

सार्वजनिक प्रवृत्ति के तरीके

# File actionpack/lib/action_dispatch/middleware/static.rb, line 50
def call(env)
  serve(Rack::Request.new(env))
end
मेल खाते हैं? (पथ) दिखाएँ स्रोत
# File actionpack/lib/action_dispatch/middleware/static.rb, line 30
def match?(path)
  path = ::Rack::Utils.unescape_path path
  return false unless ::Rack::Utils.valid_path? path
  path = ::Rack::Utils.clean_path_info path

  paths = [path, "#{path}#{ext}", "#{path}/#{@index}#{ext}"]

  if match = paths.detect { |p|
    path = File.join(@root, p.b)
    begin
      File.file?(path) && File.readable?(path)
    rescue SystemCallError
      false
    end

  }
    return ::Rack::Utils.escape_path(match).b
  end
end

एक फ़ाइल के लिए एक रास्ता लेता है। यदि फ़ाइल मिली है, तो मान्य एन्कोडिंग है, और पढ़ने की अनुमति सही है, रिटर्न मान एक URI-एस्केप स्ट्रिंग है जो फ़ाइल नाम का प्रतिनिधित्व करता है। नहीं तो झूठा लौटा दिया जाता है।

सर्वर की public/ निर्देशिका में एक मान्य फ़ाइल के अस्तित्व की जांच करने के लिए Static क्लास द्वारा उपयोग किया जाता है (देखें ActionDispatch::Static#call public/ ActionDispatch::Static#call )।

सेवा (अनुरोध) स्रोत दिखाएँ
# File actionpack/lib/action_dispatch/middleware/static.rb, line 54
def serve(request)
  path      = request.path_info
  gzip_path = gzip_file_path(path)

  if gzip_path && gzip_encoding_accepted?(request)
    request.path_info           = gzip_path
    status, headers, body       = @file_server.call(request.env)
    if status == 304
      return [status, headers, body]
    end
    headers["Content-Encoding"] = "gzip"
    headers["Content-Type"]     = content_type(path)
  else
    status, headers, body = @file_server.call(request.env)
  end

  headers["Vary"] = "Accept-Encoding" if gzip_path

  return [status, headers, body]
ensure
  request.path_info = path
end