Java URL Parameter Builder canonicalize(final SortedMap sortedParamMap)

Here you can find the source of canonicalize(final SortedMap sortedParamMap)

Description

Canonicalize the query string.

License

Apache License

Parameter

Parameter Description
sortedParamMap Parameter name-value pairs in lexicographical order.

Return

canonical form of query string.

Declaration

private static String canonicalize(final SortedMap<String, String> sortedParamMap) 

Method Source Code

//package com.java2s;
/**//from ww w  . ja  v a2  s . com
 *
 * jerry - Common Java Functionality
 * Copyright (c) 2012-2015, Sandeep Gupta
 * 
 * http://sangupta.com/projects/jerry
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *       http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * 
 */

import java.io.UnsupportedEncodingException;

import java.net.URLEncoder;

import java.util.Iterator;
import java.util.Map;

import java.util.SortedMap;

public class Main {
    /**
    * Canonicalize the query string.
    * 
    * @param sortedParamMap
    *            Parameter name-value pairs in lexicographical order.
    *            
    * @return canonical form of query string.
    */
    private static String canonicalize(final SortedMap<String, String> sortedParamMap) {
        if (sortedParamMap == null || sortedParamMap.isEmpty()) {
            return "";
        }

        final StringBuffer sb = new StringBuffer(350);
        final Iterator<Map.Entry<String, String>> iter = sortedParamMap.entrySet().iterator();

        while (iter.hasNext()) {
            final Map.Entry<String, String> pair = iter.next();
            sb.append(percentEncodeRfc3986(pair.getKey()));
            sb.append('=');
            sb.append(percentEncodeRfc3986(pair.getValue()));
            if (iter.hasNext()) {
                sb.append('&');
            }
        }

        return sb.toString();
    }

    /**
    * Percent-encode values according the RFC 3986. The built-in Java
    * URLEncoder does not encode according to the RFC, so we make the extra
    * replacements.
    * 
    * @param string
    *            Decoded string.
    *            
    * @return Encoded string per RFC 3986.
    */
    private static String percentEncodeRfc3986(final String string) {
        try {
            return URLEncoder.encode(string, "UTF-8").replace("+", "%20").replace("*", "%2A").replace("%7E", "~");
        } catch (UnsupportedEncodingException e) {
            return string;
        }
    }
}

Related

  1. addParameter(Map> map, String pair)
  2. canonicalize(final SortedMap sortedParamMap)
  3. constructParameterString(TreeMap pPostParms)
  4. convertHttpParameters(Map parameters)
  5. convertToDataString(Map data)