晋太元中,武陵人捕鱼为业。缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷。渔人甚异之,复前行,欲穷其林。 林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。 见渔人,乃大惊,问所从来。具答之。便要还家,设酒杀鸡作食。村中闻有此人,咸来问讯。自云先世避秦时乱,率妻子邑人来此绝境,不复出焉,遂与外人间隔。问今是何世,乃不知有汉,无论魏晋。此人一一为具言所闻,皆叹惋。余人各复延至其家,皆出酒食。停数日,辞去。此中人语云:“不足为外人道也。”(间隔 一作:隔绝) 既出,得其船,便扶向路,处处志之。及郡下,诣太守,说如此。太守即遣人随其往,寻向所志,遂迷,不复得路。 南阳刘子骥,高尚士也,闻之,欣然规往。未果,寻病终。后遂无问津者。
| DIR:/opt/alt/ruby31/share/gems/gems/rack-3.0.8/lib/rack/ |
| Current File : //opt/alt/ruby31/share/gems/gems/rack-3.0.8/lib/rack/mock_response.rb |
# frozen_string_literal: true
require 'cgi/cookie'
require 'time'
require_relative 'response'
module Rack
# Rack::MockResponse provides useful helpers for testing your apps.
# Usually, you don't create the MockResponse on your own, but use
# MockRequest.
class MockResponse < Rack::Response
class << self
alias [] new
end
# Headers
attr_reader :original_headers, :cookies
# Errors
attr_accessor :errors
def initialize(status, headers, body, errors = nil)
@original_headers = headers
if errors
@errors = errors.string if errors.respond_to?(:string)
else
@errors = ""
end
super(body, status, headers)
@cookies = parse_cookies_from_header
buffered_body!
end
def =~(other)
body =~ other
end
def match(other)
body.match other
end
def body
return @buffered_body if defined?(@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!"
# end
buffer = @buffered_body = String.new
@body.each do |chunk|
buffer << chunk
end
return buffer
end
def empty?
[201, 204, 304].include? status
end
def cookie(name)
cookies.fetch(name, nil)
end
private
def parse_cookies_from_header
cookies = Hash.new
if headers.has_key? 'set-cookie'
set_cookie_header = headers.fetch('set-cookie')
Array(set_cookie_header).each do |header_value|
header_value.split("\n").each do |cookie|
cookie_name, cookie_filling = cookie.split('=', 2)
cookie_attributes = identify_cookie_attributes cookie_filling
parsed_cookie = CGI::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)
end
end
end
cookies
end
def identify_cookie_attributes(cookie_filling)
cookie_bits = cookie_filling.split(';')
cookie_attributes = Hash.new
cookie_attributes.store('value', cookie_bits[0].strip)
cookie_bits.drop(1).each do |bit|
if bit.include? '='
cookie_attribute, attribute_value = bit.split('=', 2)
cookie_attributes.store(cookie_attribute.strip.downcase, attribute_value.strip)
end
if bit.include? 'secure'
cookie_attributes.store('secure', true)
end
end
if cookie_attributes.key? 'max-age'
cookie_attributes.store('expires', Time.now + cookie_attributes['max-age'].to_i)
elsif cookie_attributes.key? 'expires'
cookie_attributes.store('expires', Time.httpdate(cookie_attributes['expires']))
end
cookie_attributes
end
end
end
|