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}