# File lib/openid/consumer.rb, line 467
    def complete(query, token)
      # get the service data out of the token
      pieces = self.split_token(token)
      if pieces
        consumer_id, server_id, server_url = pieces
      else
        return FailureResponse.new(nil, msg='bad token')        
      end

      # get the nonce out of the query
      nonce = query['nonce']
      if nonce.nil?
        return FailureResponse.new(consumer_id, 'could not extract nonce')
      end

      mode = query["openid.mode"]

      case mode
      when "cancel"        
        return CancelResponse.new(consumer_id)

      when "error"
        error = query["openid.error"]
        unless error.nil?
          OpenID::Util.log('Error: '+error)
        end
        return FailureResponse.new(nil, msg=error)

      when "id_res"        
        return self.do_id_res(nonce, consumer_id, server_id, server_url, query)

      else
        return FailureResponse.new(nil, msg="unknown mode #{mode}")
      end

    end