# File lib/em-http/middleware/digest_auth.rb, line 40
      def build_auth_digest(method, uri, params = nil)
        params = @opts.merge(@digest_params) if !params
        nonce_count = next_nonce

        user = unescape params[:username]
        password = unescape params[:password]

        splitted_algorithm = params[:algorithm].split('-')
        sess = "-sess" if splitted_algorithm[1]
        raw_algorithm = splitted_algorithm[0]
        if %w(MD5 SHA1 SHA2 SHA256 SHA384 SHA512 RMD160).include? raw_algorithm
          algorithm = eval("Digest::#{raw_algorithm}")
        else
          raise "Unknown algorithm: #{raw_algorithm}"
        end
        qop = params[:qop]
        cnonce = make_cnonce if qop or sess
        a1 = if sess
          [
            algorithm.hexdigest("#{params[:username]}:#{params[:realm]}:#{params[:password]}"),
            params[:nonce],
            cnonce,
            ].join ':'
        else
          "#{params[:username]}:#{params[:realm]}:#{params[:password]}"
        end
        ha1 = algorithm.hexdigest a1
        ha2 = algorithm.hexdigest "#{method}:#{uri}"

        request_digest = [ha1, params[:nonce]]
        request_digest.push(('%08x' % @nonce_count), cnonce, qop) if qop
        request_digest << ha2
        request_digest = request_digest.join ':'
        header = [
          "Digest username=\"#{params[:username]}\"",
          "realm=\"#{params[:realm]}\"",
          "algorithm=#{raw_algorithm}#{sess}",
          "uri=\"#{uri}\"",
          "nonce=\"#{params[:nonce]}\"",
          "response=\"#{algorithm.hexdigest(request_digest)[0, 32]}\"",
        ]
        if params[:qop]
          header << "qop=#{qop}"
          header << "nc=#{'%08x' % @nonce_count}"
          header << "cnonce=\"#{cnonce}\""
        end
        header << "opaque=\"#{params[:opaque]}\"" if params.key? :opaque
        header.join(', ')
      end