# File lib/openid/consumer.rb, line 478
    def complete(query, service_endpoint)
      return FailureResponse.new(nil, msg='no session state found') unless service_endpoint

      consumer_id = service_endpoint.consumer_id
      server_id = service_endpoint.server_id
      server_url = service_endpoint.server_url

      # 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