All Downloads are FREE. Search and download functionalities are using the official Maven repository.

rack.handler.grizzly.rb Maven / Gradle / Ivy

#
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
#
# Copyright 2007-2008 Sun Microsystems, Inc. All rights reserved.
#
# The contents of this file are subject to the terms of either the GNU
# General Public License Version 2 only ("GPL") or the Common Development
# and Distribution License("CDDL") (collectively, the "License").  You
# may not use this file except in compliance with the License. You can obtain
# a copy of the License at https://glassfish.dev.java.net/public/CDDL+GPL.html
# or glassfish/bootstrap/legal/LICENSE.txt.  See the License for the specific
# language governing permissions and limitations under the License.
#
# When distributing the software, include this License Header Notice in each
# file and include the License file at glassfish/bootstrap/legal/LICENSE.txt.
# Sun designates this particular file as subject to the "Classpath" exception
# as provided by Sun in the GPL Version 2 section of the License file that
# accompanied this code.  If applicable, add the following below the License
# Header, with the fields enclosed by brackets [] replaced by your own
# identifying information: "Portions Copyrighted [year]
# [name of copyright owner]"
#
# Contributor(s):
#
# If you wish your version of this file to be governed by only the CDDL or
# only the GPL Version 2, indicate your decision by adding "[Contributor]
# elects to include this software in this distribution under the [CDDL or GPL
# Version 2] license."  If you don't indicate a single choice of license, a
# recipient has the option to distribute your version of this file under
# either the CDDL, the GPL Version 2 or to extend the choice of license to
# its licensees as provided above.  However, if you add GPL Version 2 code
# and therefore, elected the GPL Version 2 license, then the option applies
# only if the new code is made subject to such option by the copyright
# holder.
#
require 'jruby/rack'
module Rack
  module Handler
    class Grizzly
      def initialize(rack_app)
        @rack_app = rack_app
      end

      def call(grizzly_env)
        env = env_hash
        add_input_errors_scheme(grizzly_env, env)
        add_grizzly_request_attributes(grizzly_env, env)
        add_variables(grizzly_env, env)
        add_headers(grizzly_env, env)
        JRuby::Rack::Response.new(@rack_app.call(env))
      end

      def env_hash
        { "rack.version" => Rack::VERSION, "rack.multithread" => true,
          "rack.multiprocess" => false, "rack.run_once" => false }
      end

      def add_input_errors_scheme(grizzly_env, env)
        env['rack.input'] = grizzly_env.to_io
        env['rack.errors'] = JRuby::Rack::GrizzlyLog.new
        env['rack.url_scheme'] = grizzly_env.getScheme
      end

      def add_grizzly_request_attributes(grizzly_env, env)
        grizzly_env.attribute_names.each do |k|
          env[k] = grizzly_env.getAttribute(k)
        end
      end


      def add_variables(grizzly_env, env)


          request_uri = grizzly_env.request_uri
          path_translated = request_uri.sub(/#{$root}/, '')
          path_info = $root != "/" ? path_translated : request_uri
          env["REQUEST_METHOD"] ||= grizzly_env.method || "GET"
          env["SCRIPT_NAME"] ||= ''
          env["REQUEST_URI"] ||= request_uri || ""
          env["PATH_INFO"] ||= path_info
          env['PATH_TRANSLATED']||= path_translated

          env["QUERY_STRING"] ||= grizzly_env.query_string || ""
          env["SERVER_NAME"] ||= grizzly_env.server_name || ""
          env["REMOTE_HOST"] ||= grizzly_env.remote_host || ""
          env["REMOTE_ADDR"] ||= grizzly_env.remote_addr || ""
          env["REMOTE_USER"] ||= grizzly_env.remote_user || ""

          env["SERVER_PORT"] ||= grizzly_env.server_port.to_s
      end

      def add_headers(grizzly_env, env)
        env["CONTENT_TYPE"] ||= grizzly_env.content_type
        env.delete("CONTENT_TYPE") unless env["CONTENT_TYPE"]
        env["CONTENT_LENGTH"] ||= grizzly_env.content_length
        env["CONTENT_LENGTH"] = env["CONTENT_LENGTH"].to_s
        env.delete("CONTENT_LENGTH") unless env["CONTENT_LENGTH"] && env["CONTENT_LENGTH"].to_i >= 0
        grizzly_env.header_names.each do |h|
          next if h =~ /^Content-(Type|Length)$/i
          env["HTTP_#{h.upcase.gsub(/-/, '_')}"] ||= grizzly_env.getHeader(h)
        end
      end
    end
  end
end




© 2015 - 2025 Weber Informatics LLC | Privacy Policy