001package com.gigya.android.sdk.utils;
002
003import android.support.annotation.NonNull;
004
005import com.gigya.android.sdk.ui.Presenter;
006
007import java.io.BufferedReader;
008import java.io.ByteArrayInputStream;
009import java.io.IOException;
010import java.io.InputStreamReader;
011import java.net.URLDecoder;
012import java.net.URLEncoder;
013import java.util.HashMap;
014import java.util.Map;
015import java.util.TreeMap;
016import java.util.zip.GZIPInputStream;
017
018public class UrlUtils {
019
020    public static String buildEncodedQuery(@NonNull Map<String, Object> params) {
021        if (params.isEmpty()) {
022            return "";
023        }
024        StringBuilder sb = new StringBuilder();
025        for (TreeMap.Entry<String, Object> item : params.entrySet()) {
026            final Object value = item.getValue();
027            final String key = item.getKey();
028            if (value != null) {
029                sb.append(key);
030                sb.append('=');
031                sb.append(urlEncode(String.valueOf(item.getValue())));
032                sb.append('&');
033            }
034        }
035        if (sb.length() > 0)
036            sb.deleteCharAt(sb.length() - 1);
037        return sb.toString();
038    }
039
040    public static String urlEncode(String value) {
041        try {
042            return URLEncoder.encode(value, "UTF-8").replace("+", "%20")
043                    .replace("*", "%2A").replace("%7E", "~");
044        } catch (Exception ex) {
045            return null;
046        }
047    }
048
049    public static String gzipDecode(byte[] data) throws IOException {
050        StringBuilder output = new StringBuilder();
051        final GZIPInputStream gStream = new GZIPInputStream(new ByteArrayInputStream(data));
052        final InputStreamReader reader = new InputStreamReader(gStream);
053        final BufferedReader in = new BufferedReader(reader);
054        String read;
055        while ((read = in.readLine()) != null) {
056            output.append(read).append("\n");
057        }
058        reader.close();
059        in.close();
060        gStream.close();
061        return output.toString();
062    }
063
064    public static Map<String, Object> parseUrlParameters(String url) {
065        final Map<String, Object> map = new HashMap<>();
066        if (url != null) {
067            String querySplit[] = url.split("\\?");
068            String hashSplit[] = url.split("#");
069            if (querySplit.length > 1) {
070                parseUrlParameters(map, querySplit[1]);
071            } else if (hashSplit.length > 1) {
072                parseUrlParameters(map, hashSplit[1]);
073            }
074        }
075        return map;
076    }
077
078    public static void parseUrlParameters(Map<String, Object> map, String s) {
079        if (s == null) {
080            return;
081        }
082        String parameters[] = s.split("&");
083        for (String parameter : parameters) {
084            String pair[] = parameter.split("=");
085            try {
086                if (pair.length > 1) {
087                    final String value = URLDecoder.decode(pair[1], "UTF8");
088                    map.put(pair[0], value);
089                }
090            } catch (Exception ex) {
091                ex.printStackTrace();
092            }
093        }
094    }
095
096    public static String getBaseUrl(String api, String apiDomain) {
097        final StringBuilder sb = new StringBuilder();
098        final String[] split = api.split("\\.");
099        return sb.append("https://")
100                .append(split[0]).append(".")
101                .append(apiDomain)
102                .append("/")
103                .append(api)
104                .toString();
105    }
106
107    public static boolean isGigyaScheme(String scheme) {
108        return ObjectUtils.safeEquals(scheme, Presenter.Consts.REDIRECT_URL_SCHEME);
109    }
110}