Module: HaveAPI::Server::ServerHelpers

Defined in:
lib/haveapi/server.rb

Instance Method Summary collapse

Instance Method Details

#access_controlObject



100
101
102
103
104
105
106
107
108
109
110
# File 'lib/haveapi/server.rb', line 100

def access_control
  return unless request.env['HTTP_ORIGIN'] && request.env['HTTP_ACCESS_CONTROL_REQUEST_METHOD']

  halt 200, {
    'access-control-allow-origin' => '*',
    'access-control-allow-methods' => 'GET,POST,OPTIONS,PATCH,PUT,DELETE',
    'access-control-allow-credentials' => 'false',
    'access-control-allow-headers' => settings.api_server.allowed_headers,
    'access-control-max-age' => (60 * 60).to_s
  }, ''
end

#api_versionObject



176
177
178
# File 'lib/haveapi/server.rb', line 176

def api_version
  @v
end

#authenticate!(v) ⇒ Object



66
67
68
# File 'lib/haveapi/server.rb', line 66

def authenticate!(v)
  require_auth! unless authenticated?(v)
end

#authenticated?(v) ⇒ Boolean

Returns:



70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/haveapi/server.rb', line 70

def authenticated?(v)
  return @current_user if @current_user

  begin
    @current_user = settings.api_server.send(:do_authenticate, v, request)
  rescue HaveAPI::Authentication::TokenConflict => e
    unless @formatter
      @formatter = OutputFormatter.new
      @formatter.supports?([])
    end

    report_error(400, {}, e.message)
  end
  settings.api_server.call_hooks_for(:post_authenticated, args: [@current_user])
  @current_user
end

#authenticated_versionsObject



87
88
89
90
91
92
93
94
95
96
97
98
# File 'lib/haveapi/server.rb', line 87

def authenticated_versions
  settings.api_server.versions.each_with_object({}) do |v, ret|
    ret[v] = settings.api_server.send(:do_authenticate, v, request)
  rescue HaveAPI::Authentication::TokenConflict => e
    unless @formatter
      @formatter = OutputFormatter.new
      @formatter.supports?([])
    end

    report_error(400, {}, e.message)
  end
end

#base_urlObject



153
154
155
156
157
158
159
160
161
162
# File 'lib/haveapi/server.rb', line 153

def base_url
  scheme = if request.env['HTTP_X_FORWARDED_SSL'] == 'on'
             'https'

           else
             request.env['rack.url_scheme']
           end

  "#{scheme}://#{request.env['HTTP_HOST']}"
end

#current_userObject



112
113
114
# File 'lib/haveapi/server.rb', line 112

def current_user
  @current_user
end

#doc(file) ⇒ Object



149
150
151
# File 'lib/haveapi/server.rb', line 149

def doc(file)
  markdown :"../../../doc/#{file}"
end

#hostObject



164
165
166
# File 'lib/haveapi/server.rb', line 164

def host
  request.env['HTTP_HOST'].split(':').first
end

#logout_urlObject



144
145
146
147
# File 'lib/haveapi/server.rb', line 144

def logout_url
  ret = url("#{root}_logout")
  ret.insert(ret.index('//') + 2, '_log:out@')
end

#pretty_format(obj) ⇒ Object



116
117
118
119
# File 'lib/haveapi/server.rb', line 116

def pretty_format(obj)
  ret = ''
  PP.pp(obj, ret)
end

#report_error(code, headers, msg) ⇒ Object



129
130
131
132
133
134
135
136
137
138
# File 'lib/haveapi/server.rb', line 129

def report_error(code, headers, msg)
  @halted = true
  unless @formatter
    @formatter = OutputFormatter.new
    @formatter.supports?([])
  end

  content_type @formatter.content_type, charset: 'utf-8'
  halt code, headers, @formatter.format(false, nil, msg, version: false)
end

#require_auth!Object



121
122
123
124
125
126
127
# File 'lib/haveapi/server.rb', line 121

def require_auth!
  report_error(
    401,
    { 'www-authenticate' => 'Basic realm="Restricted Area"' },
    'Action requires user to authenticate'
  )
end

#rootObject



140
141
142
# File 'lib/haveapi/server.rb', line 140

def root
  settings.api_server.root
end

#setup_formatterObject



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/haveapi/server.rb', line 49

def setup_formatter
  return if @formatter

  @formatter = OutputFormatter.new
  accept = request.accept
rescue ArgumentError, EncodingError
  @formatter.supports?([])
  report_error(400, {}, 'Bad Accept header')
else
  unless @formatter.supports?(accept)
    @halted = true
    halt 406, "Not Acceptable\n"
  end

  content_type @formatter.content_type, charset: 'utf-8'
end

#sort_hash(hash) ⇒ Object



172
173
174
# File 'lib/haveapi/server.rb', line 172

def sort_hash(hash)
  hash.sort { |a, b| a[0] <=> b[0] }
end

#urlescape(v) ⇒ Object



168
169
170
# File 'lib/haveapi/server.rb', line 168

def urlescape(v)
  CGI.escape(v)
end

#versionObject



180
181
182
# File 'lib/haveapi/server.rb', line 180

def version
  HaveAPI::VERSION
end