# frozen_string_literal: truerequire'time'require_relative'response'moduleRack# Rack::MockResponse provides useful helpers for testing your apps.# Usually, you don't create the MockResponse on your own, but use# MockRequest.classMockResponse<Rack::Responsebegin# Recent versions of the CGI gem may not provide `CGI::Cookie`.require'cgi/cookie'Cookie=CGI::CookierescueLoadErrorclassCookieattr_reader:name,:value,:path,:domain,:expires,:securedefinitialize(args)@name=args["name"]@value=args["value"]@path=args["path"]@domain=args["domain"]@expires=args["expires"]@secure=args["secure"]enddefmethod_missing(method_name,*args,&block)@value.send(method_name,*args,&block)end# :nocov:ruby2_keywords(:method_missing)ifrespond_to?(:ruby2_keywords,true)# :nocov:defrespond_to_missing?(method_name,include_all=false)@value.respond_to?(method_name,include_all)||superendendendclass<<selfalias[]newend# Headersattr_reader:original_headers,:cookies# Errorsattr_accessor:errorsdefinitialize(status,headers,body,errors=nil)@original_headers=headersiferrors@errors=errors.stringiferrors.respond_to?(:string)else@errors=""endsuper(body,status,headers)@cookies=parse_cookies_from_headerbuffered_body!enddef=~(other)body=~otherenddefmatch(other)body.matchotherenddefbodyreturn@buffered_bodyifdefined?(@buffered_body)# FIXME: apparently users of MockResponse expect the return value of# MockResponse#body to be a string. However, the real response object# returns the body as a list.## See spec_showstatus.rb:## should "not replace existing messages" do# ...# res.body.should == "foo!"# endbuffer=@buffered_body=String.new@body.eachdo|chunk|buffer<<chunkendreturnbufferenddefempty?[201,204,304].include?statusenddefcookie(name)cookies.fetch(name,nil)endprivatedefparse_cookies_from_headercookies=Hash.newifheaders.has_key?'set-cookie'set_cookie_header=headers.fetch('set-cookie')Array(set_cookie_header).eachdo|header_value|header_value.split("\n").eachdo|cookie|cookie_name,cookie_filling=cookie.split('=',2)cookie_attributes=identify_cookie_attributescookie_fillingparsed_cookie=Cookie.new('name'=>cookie_name.strip,'value'=>cookie_attributes.fetch('value'),'path'=>cookie_attributes.fetch('path',nil),'domain'=>cookie_attributes.fetch('domain',nil),'expires'=>cookie_attributes.fetch('expires',nil),'secure'=>cookie_attributes.fetch('secure',false))cookies.store(cookie_name,parsed_cookie)endendendcookiesenddefidentify_cookie_attributes(cookie_filling)cookie_bits=cookie_filling.split(';')cookie_attributes=Hash.newcookie_attributes.store('value',cookie_bits[0].strip)cookie_bits.drop(1).eachdo|bit|ifbit.include?'='cookie_attribute,attribute_value=bit.split('=',2)cookie_attributes.store(cookie_attribute.strip.downcase,attribute_value.strip)endifbit.include?'secure'cookie_attributes.store('secure',true)endendifcookie_attributes.key?'max-age'cookie_attributes.store('expires',Time.now+cookie_attributes['max-age'].to_i)elsifcookie_attributes.key?'expires'cookie_attributes.store('expires',Time.httpdate(cookie_attributes['expires']))endcookie_attributesendendend