All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.avos.avoscloud.AVRequestParams Maven / Gradle / Ivy

package com.avos.avoscloud;

import java.util.HashMap;
import java.util.Map;

import okio.Buffer;

/**
 * Created by lbt05 on 9/17/15.
 */
public class AVRequestParams {
  private static final char[] HEX_DIGITS =
  {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};

  static final String QUERY_COMPONENT_ENCODE_SET = " \"':;<=>@[]^`{}|/\\?#&!$(),~";
  HashMap params;

  private static class ParameterValuePair {
    String encodedParam;
    String param;

    public String getEncodedParam() {
      return encodedParam;
    }

    public String getParam() {
      return param;
    }

    public static ParameterValuePair getParameterValuePair(String param, String encodedParam) {
      ParameterValuePair pair = new ParameterValuePair();
      pair.encodedParam = encodedParam;
      pair.param = param;
      return pair;
    }

    public static ParameterValuePair getParameterValuePair(String param) {
      ParameterValuePair pair = new ParameterValuePair();
      pair.encodedParam = canonicalize(param, QUERY_COMPONENT_ENCODE_SET, false, true);
      pair.param = param;
      return pair;
    }
  }

  public AVRequestParams() {
    params = new HashMap();
  }

  public AVRequestParams(Map params) {
    this();
    if (params != null) {
      for (Map.Entry param : params.entrySet()) {
        this.put(param.getKey(), param.getValue());
      }
    }
  }

  public void put(String name, Object value) {
    params.put(canonicalize(name, QUERY_COMPONENT_ENCODE_SET, false, true),
        ParameterValuePair.getParameterValuePair(value.toString()));
  }

  public String getQueryString() {
    if (params.isEmpty()) {
      return "";
    } else {
      StringBuilder sb = new StringBuilder();
      int index = 0;
      for (Map.Entry entry : params.entrySet()) {
        if (index > 0) {
          sb.append('&');
        }
        sb.append(entry.getKey());
        sb.append('=');
        sb.append(entry.getValue().encodedParam);
        index++;
      }
      return sb.toString();
    }
  }

  public String getWholeUrl(String url) {
    if (params.isEmpty()) {
      return url;
    } else {
      StringBuilder sb = new StringBuilder(url);
      sb.append('?');
      int index = 0;
      for (Map.Entry entry : params.entrySet()) {
        if (index > 0) {
          sb.append('&');
        }
        sb.append(entry.getKey());
        sb.append('=');
        sb.append(entry.getValue().encodedParam);
        index++;
      }
      return sb.toString();
    }
  }

  public boolean isEmpty() {
    return params == null || params.isEmpty();
  }

  /**
   * 
   * @return
   */
  protected String getDumpQueryString() {
    if (params.isEmpty()) {
      return "";
    } else {
      StringBuilder sb = new StringBuilder();
      int index = 0;
      for (Map.Entry entry : params.entrySet()) {
        if (index > 0) {
          sb.append('&');
        }
        sb.append(entry.getKey());
        sb.append('=');
        sb.append(entry.getValue().getParam());
        index++;
      }
      return sb.toString();
    }
  }

  static String canonicalize(String input, int pos, int limit, String encodeSet,
      boolean alreadyEncoded, boolean query) {
    int codePoint;
    for (int i = pos; i < limit; i += Character.charCount(codePoint)) {
      codePoint = input.codePointAt(i);
      if (codePoint < 0x20
          || codePoint >= 0x7f
          || encodeSet.indexOf(codePoint) != -1
          || (codePoint == '%' && !alreadyEncoded)
          || (query && codePoint == '+')) {
        // Slow path: the character at i requires encoding!
        Buffer out = new Buffer();
        out.writeUtf8(input, pos, i);
        canonicalize(out, input, i, limit, encodeSet, alreadyEncoded, query);
        return out.readUtf8();
      }
    }

    // Fast path: no characters in [pos..limit) required encoding.
    return input.substring(pos, limit);
  }

  static void canonicalize(Buffer out, String input, int pos, int limit,
      String encodeSet, boolean alreadyEncoded, boolean query) {
    Buffer utf8Buffer = null; // Lazily allocated.
    int codePoint;
    for (int i = pos; i < limit; i += Character.charCount(codePoint)) {
      codePoint = input.codePointAt(i);
      if (alreadyEncoded
          && (codePoint == '\t' || codePoint == '\n' || codePoint == '\f' || codePoint == '\r')) {
        // Skip this character.
      } else if (query && codePoint == '+') {
        // HTML permits space to be encoded as '+'. We use '%20' to avoid special cases.
        out.writeUtf8(alreadyEncoded ? "%20" : "%2B");
      } else if (codePoint < 0x20
          || codePoint >= 0x7f
          || encodeSet.indexOf(codePoint) != -1
          || (codePoint == '%' && !alreadyEncoded)) {
        // Percent encode this character.
        if (utf8Buffer == null) {
          utf8Buffer = new Buffer();
        }
        utf8Buffer.writeUtf8CodePoint(codePoint);
        while (!utf8Buffer.exhausted()) {
          int b = utf8Buffer.readByte() & 0xff;
          out.writeByte('%');
          out.writeByte(HEX_DIGITS[(b >> 4) & 0xf]);
          out.writeByte(HEX_DIGITS[b & 0xf]);
        }
      } else {
        // This character doesn't need encoding. Just copy it over.
        out.writeUtf8CodePoint(codePoint);
      }
    }
  }

  static String canonicalize(
      String input, String encodeSet, boolean alreadyEncoded, boolean query) {
    return canonicalize(input, 0, input.length(), encodeSet, alreadyEncoded, query);
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy