require 'iowa/Request'

module Iowa

	class Request

		class Apache < Iowa::Request

			def aah_to_a(val)
				return val unless val.is_a?(::Apache::ArrayHeader)
				r = []
				val.each {|v| r << v}
				r
			end

			def setup(request)
				@hostname = request.hostname
				@unparsed_uri = request.unparsed_uri
				@uri = request.uri
				@filename = request.filename
				@request_time = request.request_time
				@request_method = request.request_method
				@header_only = request.header_only?
				# In an Apache::Request object, request.args is a string.  We want
				# to make a hash of these contents available for use, too.
				@args = request.args
				@args = '' if args.nil?
				@content_type = request.content_type
				@content_encoding = request.content_encoding
				@content_languages = aah_to_a(request.content_languages)
				@remote_host = request.remote_host(::Apache::REMOTE_HOST)
				@remote_addr = request.remote_host(::Apache::REMOTE_NOLOOKUP)
				@auth_type = request.auth_type
				@auth_name = request.auth_name
				@cache_resp = request.cache_resp
				@params = Hash.new
				if @args.to_s != C_empty
					@args.split(/&/).each do |a|
						k,v = a.split(/=/,2).collect{|x| Iowa::Util.unescape(x)}
						if @params.has_key? k
							if @params[k].respond_to?(:push)
								@params[k] << (v or C_empty)
							else						    
								@params[k] = [(v or C_empty)]
							end
						else
							@params[k] = (v or C_empty)
						end
					end
				else
					if m = MIMERegexp.match(request.headers_in['Content-Type'])
						boundary = m[1]
						@params = read_multipart(boundary,request.headers_in['Content-Length'],$stdin,request.headers_in['HTTP_USER_AGENT'])
					else
						@content = $stdin.read
						@content = '' if @content.nil?
						@content.split(/[&;]/).each do |x|
							key, val = x.split(/=/,2).collect{|x| Iowa::Util.unescape(x)}
							if @params.include?(key)
								@params[key] += "\0" + (val or "")
							else
								@params[key] = (val or "")
							end
						end
					end
				end
				@headers = Iowa::DataTable.new
				request.headers_in.each do |key,value|
					@headers[key] = value
				end
				#@status_line = request.status_line
				#@headers_out = Iowa::DataTable.new
				#request.headers_out.each do |key,value|
				#	@headers_out[key] = value
				#end
			end

			def initialize(request=nil)
				unless request
					request = Apache.request if ENV['MOD_RUBY']
				end

				setup(request)
			end

		end
	end
end

Iowa::Request.Type = Iowa::Request::Apache