Last active
September 28, 2018 15:13
-
-
Save vbrazo/738b3c68353e1110c90e13be79157a1b to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# config.ru | |
require './application/api' | |
use RackAuthMiddleware | |
run Rack::Cascade.new [ApiSupport] | |
# application/middlewares/rack_auth_middleware.rb | |
class RackAuthMiddleware | |
UnprocessableHeader = Class.new(ArgumentError) | |
def initialize(app, options = {}) | |
@app = app | |
@options = options | |
end | |
# TODO: Finish middleware | |
def call(env) | |
_token, _options = *token_and_options(env['HTTP_AUTHORIZATION']) | |
@app.call(env) | |
rescue UnprocessableHeader | |
unprocessable_header_app.call(env) | |
end | |
def unprocessable_header_app | |
@options.fetch(:unprocessable_header_app) { default_unprocessable_header_app } | |
end | |
def default_unprocessable_header_app | |
->(_env) { Rack::Response.new('Unprocessable Authorization header', 400) } | |
end | |
def token_and_options(header) | |
token = header.to_s.match(/^token (.*)/) { |m| m[1] } | |
if token | |
begin | |
values = Hash[token.split(',').map do |value| | |
value.strip! # remove any spaces between commas and values | |
key, value = value.split(/\=\"?/) # split key=value pairs | |
value.chomp!('"') # chomp trailing " in value | |
value.gsub!(/\\\"/, '"') # unescape remaining quotes | |
[key, value] | |
end] | |
[values.delete('token'), values] | |
rescue StandardError => error | |
raise UnprocessableHeader, error | |
end | |
else | |
[nil, {}] | |
end | |
end | |
end | |
# Specs: I'm basically injecting the env['http-authorization'] | |
header 'AUTHORIZATION', %(Token token="abc", foo="bar") |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment