@Override
  public void parseResponse(
      ChallengeResponse challenge, Request request, Series<Header> httpHeaders) {
    if (challenge.getRawValue() != null) {
      HeaderReader<Object> hr = new HeaderReader<Object>(challenge.getRawValue());

      try {
        Parameter param = hr.readParameter();

        while (param != null) {
          try {
            if ("username".equals(param.getName())) {
              challenge.setIdentifier(param.getValue());
            } else if ("realm".equals(param.getName())) {
              challenge.setRealm(param.getValue());
            } else if ("nonce".equals(param.getName())) {
              challenge.setServerNonce(param.getValue());
            } else if ("uri".equals(param.getName())) {
              challenge.setDigestRef(new Reference(param.getValue()));
            } else if ("response".equals(param.getName())) {
              challenge.setSecret(param.getValue());
            } else if ("algorithm".equals(param.getName())) {
              challenge.setDigestAlgorithm(param.getValue());
            } else if ("cnonce".equals(param.getName())) {
              challenge.setClientNonce(param.getValue());
            } else if ("opaque".equals(param.getName())) {
              challenge.setOpaque(param.getValue());
            } else if ("qop".equals(param.getName())) {
              challenge.setQuality(param.getValue());
            } else if ("nc".equals(param.getName())) {
              challenge.setServerNounceCount(Integer.valueOf(param.getValue(), 16));
            } else {
              challenge.getParameters().add(param);
            }
          } catch (Throwable e) {
            Context.getCurrentLogger()
                .log(Level.WARNING, "Unable to parse the challenge request header parameter", e);
          }
          if (hr.skipValueSeparator()) {
            param = hr.readParameter();
          } else {
            param = null;
          }
        }
      } catch (Exception e) {
        Context.getCurrentLogger()
            .log(Level.WARNING, "Unable to parse the challenge request header parameter", e);
      }
    }
  }
  @Override
  public void parseRequest(
      ChallengeRequest challenge, Response response, Series<Header> httpHeaders) {
    if (challenge.getRawValue() != null) {
      HeaderReader<Object> hr = new HeaderReader<Object>(challenge.getRawValue());

      try {
        Parameter param = hr.readParameter();

        while (param != null) {
          try {
            if ("realm".equals(param.getName())) {
              challenge.setRealm(param.getValue());
            } else if ("domain".equals(param.getName())) {
              challenge.getDomainRefs().add(new Reference(param.getValue()));
            } else if ("nonce".equals(param.getName())) {
              challenge.setServerNonce(param.getValue());
            } else if ("opaque".equals(param.getName())) {
              challenge.setOpaque(param.getValue());
            } else if ("stale".equals(param.getName())) {
              challenge.setStale(Boolean.valueOf(param.getValue()));
            } else if ("algorithm".equals(param.getName())) {
              challenge.setDigestAlgorithm(param.getValue());
            } else if ("qop".equals(param.getName())) {
              // challenge.setDigestAlgorithm(param.getValue());
            } else {
              challenge.getParameters().add(param);
            }

            if (hr.skipValueSeparator()) {
              param = hr.readParameter();
            } else {
              param = null;
            }
          } catch (Exception e) {
            Context.getCurrentLogger()
                .log(Level.WARNING, "Unable to parse the challenge request header parameter", e);
          }
        }
      } catch (Exception e) {
        Context.getCurrentLogger()
            .log(Level.WARNING, "Unable to parse the challenge request header parameter", e);
      }
    }
  }