1
0
mirror of https://github.com/cmur2/dyndnsd.git synced 2024-11-01 00:56:14 +01:00
dyndnsd/lib/dyndnsd/responder/dyndns_style.rb

55 lines
1.7 KiB
Ruby

module Dyndnsd
module Responder
class DynDNSStyle
def initialize(app)
@app = app
end
def call(env)
@app.call(env).tap do |status_code, headers, body|
if headers.key?('X-DynDNS-Response')
return decorate_dyndnsd_response(status_code, headers, body)
else
return decorate_other_response(status_code, headers, body)
end
end
end
private
def decorate_dyndnsd_response(status_code, headers, body)
if status_code == 200
[200, {'Content-Type' => 'text/plain'}, [get_success_body(body[0], body[1])]]
elsif status_code == 422
error_response_map[headers['X-DynDNS-Response']]
end
end
def decorate_other_response(status_code, headers, _body)
if status_code == 400
[status_code, headers, ['Bad Request']]
elsif status_code == 401
[status_code, headers, ['badauth']]
end
end
def get_success_body(changes, myips)
changes.map { |change| "#{change} #{myips.join(' ')}" }.join("\n")
end
def error_response_map
{
# general http errors
'method_forbidden' => [405, {'Content-Type' => 'text/plain'}, ['Method Not Allowed']],
'not_found' => [404, {'Content-Type' => 'text/plain'}, ['Not Found']],
# specific errors
'hostname_missing' => [200, {'Content-Type' => 'text/plain'}, ['notfqdn']],
'hostname_malformed' => [200, {'Content-Type' => 'text/plain'}, ['notfqdn']],
'host_forbidden' => [200, {'Content-Type' => 'text/plain'}, ['nohost']]
}
end
end
end
end