/*
* Copyright 2016 ThoughtWorks, Inc.
*
* 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.
*/
package com.thoughtworks.go.util;
import org.apache.commons.lang.StringUtils;
import org.apache.http.NameValuePair;
import org.apache.http.client.utils.URIBuilder;
import java.io.UnsupportedEncodingException;
import java.net.URISyntaxException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import static com.thoughtworks.go.util.ExceptionUtils.bomb;
public class UrlUtil {
private static final String UTF_8 = "UTF-8";
public static String encodeInUtf8(String url) {
String[] parts = url.split("/");
StringBuilder builder = new StringBuilder();
for (int i = 0; i < parts.length; i++) {
String part = parts[i];
try {
builder.append(URLEncoder.encode(part, UTF_8));
} catch (UnsupportedEncodingException e) {
bomb(e);
}
if (i < parts.length - 1) {
builder.append('/');
}
}
if (url.endsWith("/")) {
builder.append('/');
}
return builder.toString();
}
public static String urlWithQuery(String oldUrl, String paramName, String paramValue) throws URISyntaxException {
URIBuilder uriBuilder = new URIBuilder(oldUrl);
uriBuilder.addParameter(paramName, paramValue);
return uriBuilder.toString();
}
private static String encode(String query) {
if (query == null) {
return null;
}
try {
return URLEncoder.encode(query, UTF_8);
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
private static String decode(String query) {
if (query == null) {
return null;
}
try {
return URLDecoder.decode(query, UTF_8);
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
public static String getQueryParamFromUrl(String url, String paramName) {
try {
List<NameValuePair> queryParams = new URIBuilder(url).getQueryParams();
for (NameValuePair pair : queryParams) {
if (pair.getName().equals(paramName)) {
return pair.getValue();
}
}
return StringUtils.EMPTY;
} catch (URISyntaxException e) {
return StringUtils.EMPTY;
}
}
public static String concatPath(String baseUrl, String path) {
StringBuilder builder = new StringBuilder(baseUrl);
if(!baseUrl.endsWith("/")) {
builder.append('/');
}
builder.append(path);
return builder.toString();
}
private static class QueryTuple {
private static final String QUERY_SEPERATOR = "&";
private static final String QUERY_KEY_VAL_SEPERATOR = "=";
final String key;
final String val;
QueryTuple(String key, String val) {
this.key = key;
this.val = val;
}
static List<QueryTuple> parse(String query) {
List<QueryTuple> parsed = new ArrayList<>();
if (StringUtils.isEmpty(query)) {
return parsed;
}
String[] split = query.split(QUERY_SEPERATOR);
for (String queryFrag : split) {
String[] queryFragmentSplit = queryFrag.split(QUERY_KEY_VAL_SEPERATOR);
parsed.add(new QueryTuple(queryFragmentSplit[0], decode(queryFragmentSplit[1])));
}
return parsed;
}
static String toString(List<QueryTuple> queryTuples) {
StringBuilder builder = new StringBuilder();
for (QueryTuple queryTuple : queryTuples) {
if (builder.length() > 0) {
builder.append(QUERY_SEPERATOR);
}
builder.append(queryTuple.key).append(QUERY_KEY_VAL_SEPERATOR).append(encode(queryTuple.val));
}
return builder.toString();
}
}
}