private void addOrUpdateArgNoDecoding(String key, Object value) throws UnsupportedEncodingException {
    if (value != null && value instanceof String) {
      if (!key.startsWith(RestUtils.InternalKeys.KEY_PREFIX)) {
        // For any key rather than ambry internal key, value should be all ascii.
        CharsetEncoder encoder = StandardCharsets.US_ASCII.newEncoder();
        if (!encoder.canEncode(key) || !encoder.canEncode((String) value)) {
          throw new IllegalArgumentException(
              "Key " + key + " or Value " + value + "is not valid, since they are not all ascii");
        }
      }
      String valueStr = (String) value;
      StringBuilder sb;
      if (args.get(key) == null) {
        sb = new StringBuilder(valueStr);
        args.put(key, sb);
      } else {
        sb = (StringBuilder) args.get(key);
        sb.append(MULTIPLE_HEADER_VALUE_DELIMITER).append(value);
      }
    } else if (value != null && args.containsKey(key)) {
      throw new IllegalStateException("Value of key [" + key + "] is not a string and it already exists in the args");
    } else {
      args.put(key, value);
    }
  }
Adds a {@code key}, {@code value} pair to args without any decoding. If {@code key} already exists,
{@code value} is added to a list of values.
@param key the key of the argument.
@param value the value of the argument.
@throws UnsupportedEncodingException if {@code key} or {@code value} cannot be URL decoded.
ambry-test-utils/src/main/java/com/github/ambry/rest/MockRestRequest.java