Class: Kwipper::Response

Inherits:
Object
  • Object
show all
Defined in:
lib/kwipper/response.rb

Constant Summary collapse

STATUSES =
{
  ok:           [200, 'OK'],
  created:      [201, 'Created'],
  found:        [302, 'Found'],
  bad_request:  [400, 'Bad Request'],
  unauthorized: [401, 'Unauthorized'],
  not_found:    [404, 'Not Found'],
  server_error: [500, 'Server Error']
}
'kwipper_session'

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(request) ⇒ Response

Returns a new instance of Response.



17
18
19
20
21
22
23
# File 'lib/kwipper/response.rb', line 17

def initialize(request)
  @request = request
  @headers = {}.tap do |h|
    h['Set-Cookie'] = session_cookie unless has_session?
  end
  @body = ''
end

Instance Attribute Details

#bodyObject

Returns the value of attribute body.



14
15
16
# File 'lib/kwipper/response.rb', line 14

def body
  @body
end

#content_typeObject

Returns the value of attribute content_type.



14
15
16
# File 'lib/kwipper/response.rb', line 14

def content_type
  @content_type
end

#headersObject (readonly)

Returns the value of attribute headers.



15
16
17
# File 'lib/kwipper/response.rb', line 15

def headers
  @headers
end

#redirectObject

Returns the value of attribute redirect.



14
15
16
# File 'lib/kwipper/response.rb', line 14

def redirect
  @redirect
end

#requestObject (readonly)

Returns the value of attribute request.



15
16
17
# File 'lib/kwipper/response.rb', line 15

def request
  @request
end

#status_codeObject

Returns the value of attribute status_code.



14
15
16
# File 'lib/kwipper/response.rb', line 14

def status_code
  @status_code
end

#status_messageObject

Returns the value of attribute status_message.



14
15
16
# File 'lib/kwipper/response.rb', line 14

def status_message
  @status_message
end

Instance Method Details

#current_sessionObject



79
80
81
82
83
# File 'lib/kwipper/response.rb', line 79

def current_session
  if has_session?
    @current_session ||= Session.find request.cookies[SESSION_COOKIE_NAME]
  end
end

#current_userObject



73
74
75
76
77
# File 'lib/kwipper/response.rb', line 73

def current_user
  if current_session
    @current_user ||= User.find current_session.user_id
  end
end

#has_session?Boolean

Session helpers

Returns:

  • (Boolean)


53
54
55
# File 'lib/kwipper/response.rb', line 53

def has_session?
  request.cookies.key? SESSION_COOKIE_NAME
end

#headers_for_responseObject



38
39
40
41
42
43
44
45
# File 'lib/kwipper/response.rb', line 38

def headers_for_response
  headers.merge({
    'Content-Length' => body.size,
    'Content-Type' => content_type
  }).tap do |h|
    h['Location'] = redirect if redirect
  end.map { |k, v| "#{k}: #{v}" }.join "\r\n"
end

#infoObject



34
35
36
# File 'lib/kwipper/response.rb', line 34

def info
  "#{@status_code} #{@status_message}"
end

For the server to remove a browser cookie we need to set a cookie of the same name with an expires value to now (or in the past) so that the browser will expire it and remove it. The value is also voided.



64
65
66
67
# File 'lib/kwipper/response.rb', line 64

def remove_session_cookie
  cookie = session_cookie "deleted; expires=#{Time.now.httpdate}"
  headers['Set-Cookie'] = cookie
end


57
58
59
# File 'lib/kwipper/response.rb', line 57

def session_cookie(value = "#{session_cookie_value}; HttpOnly")
  "#{SESSION_COOKIE_NAME}=#{value}"
end


69
70
71
# File 'lib/kwipper/response.rb', line 69

def session_cookie_value
  @session_cookie_value ||= request.cookies.fetch SESSION_COOKIE_NAME, SecureRandom.urlsafe_base64
end

#set_status(status) ⇒ Object



47
48
49
# File 'lib/kwipper/response.rb', line 47

def set_status(status)
  @status_code, @status_message = STATUSES[status]
end

#to_http_responseObject



25
26
27
28
29
30
31
32
# File 'lib/kwipper/response.rb', line 25

def to_http_response
<<-HTTP
HTTP/1.1 #{status_code} #{status_message}
#{headers_for_response}

#{body}
HTTP
end