class OpenID::Server::Decoder

I decode an incoming web request in to a OpenIDRequest.

Attributes

server[RW]

Public Class Methods

new(server) click to toggle source

Construct a Decoder. The server is necessary because some replies reference their server.

# File lib/openid/server.rb, line 1231
def initialize(server)
  @server = server
end

Public Instance Methods

decode(query) click to toggle source

I transform query parameters into an OpenIDRequest.

If the query does not seem to be an OpenID request at all, I return nil.

Raises ProtocolError when the query does not seem to be a valid OpenID request.

# File lib/openid/server.rb, line 1242
def decode(query)
  if query.nil? or query.length == 0
    return nil
  end

  begin
    message = Message.from_post_args(query)
  rescue InvalidOpenIDNamespace => e
    query = query.dup
    query['openid.ns'] = OPENID2_NS
    message = Message.from_post_args(query)
    raise ProtocolError.new(message, e.to_s)
  end

  mode = message.get_arg(OPENID_NS, 'mode')
  if !mode
    msg = sprintf("No mode value in message %s", message)
    raise ProtocolError.new(message, msg)
  end

  handler = @@handlers.fetch(mode, self.method('default_decoder'))
  return handler.call(message, @server.op_endpoint)
end
default_decoder(message, server) click to toggle source

Called to decode queries when no handler for that mode is found.

This implementation always raises ProtocolError.

# File lib/openid/server.rb, line 1270
def default_decoder(message, server)
  mode = message.get_arg(OPENID_NS, 'mode')
  msg = sprintf("Unrecognized OpenID mode %s", mode)
  raise ProtocolError.new(message, msg)
end