class Seojs::Middleware

Public Class Methods

new(app) click to toggle source
# File lib/seojs/middleware.rb, line 7
def initialize(app)
  @app = app
end

Public Instance Methods

call(env) click to toggle source
# File lib/seojs/middleware.rb, line 11
def call(env)
  @env = env

  if test?
    return [ 200, {"Content-Type" => "text/html"}, ['SEO.js Middleware Found!'] ]
  elsif Seojs.url && escaped_fragment_query?
    triplet = get_snapshot
    return triplet if triplet
  end
  @app.call(env)
end

Private Instance Methods

escaped_fragment_query?() click to toggle source
# File lib/seojs/middleware.rb, line 86
def escaped_fragment_query?
  @env['QUERY_STRING'].match(/_escaped_fragment_/)
end
extract_http_request_headers(env) click to toggle source
# File lib/seojs/middleware.rb, line 71
def extract_http_request_headers(env)
  headers = env.reject do |k, v|
    !(/^HTTP_[A-Z_]+$/ === k) || v.nil?
  end.map do |k, v|
    [reconstruct_header_name(k), v]
  end.select do |k,v|
    ["IF-NONE-MATCH", "IF-MODIFIED-SINCE", "CACHE-CONTROL", "USER-AGENT"].include? k
  end
  Hash[headers]
end
get_snapshot() click to toggle source
# File lib/seojs/middleware.rb, line 25
def get_snapshot
  url, headers = snapshot_request
  Timeout.timeout(10) do
    req = Net::HTTP::Get.new(url.to_s)
    headers.each_pair do |key, value|
      req[key] = value
    end
    
    snapshot_response = Net::HTTP.start(url.hostname, url.port, :use_ssl => url.scheme == 'https') {|http|
      http.request(req)
    }
            
    if [200, 301, 302, 304].include? snapshot_response.code.to_i
      body = snapshot_response.body || ""
      body = [body] unless body.respond_to?(:each)
      headers = snapshot_response.to_hash
      headers.each_key do |k|
        v = headers[k]
        headers[k] = v.join(', ') if v.kind_of? Array
      end
      headers.delete("status") if headers.key?("status")
      [snapshot_response.code, headers, body]
    else
      nil
    end
  end
rescue Exception => e
  nil
end
reconstruct_header_name(name) click to toggle source
# File lib/seojs/middleware.rb, line 82
def reconstruct_header_name(name)
  name.sub(/^HTTP_/, "").gsub("_", "-")
end
snapshot_request() click to toggle source
# File lib/seojs/middleware.rb, line 55
def snapshot_request
  source_request = Rack::Request.new(@env)

  if source_request.fullpath == ""
    full_path = URI.parse(@env['REQUEST_URI']).request_uri
  else
    full_path = source_request.fullpath
  end
  
  scheme, host, port = source_request.scheme, source_request.host, source_request.port
  
  url = URI.parse("#{Seojs.url}/v3/#{scheme}://#{host}:#{port}#{full_path}")
  headers = extract_http_request_headers(@env)
  [url, headers]
end
test?() click to toggle source
# File lib/seojs/middleware.rb, line 90
def test?
  @env["PATH_INFO"] == "/seojs/test"
end