001 /*
002 * SonarQube, open source software quality management tool.
003 * Copyright (C) 2008-2014 SonarSource
004 * mailto:contact AT sonarsource DOT com
005 *
006 * SonarQube is free software; you can redistribute it and/or
007 * modify it under the terms of the GNU Lesser General Public
008 * License as published by the Free Software Foundation; either
009 * version 3 of the License, or (at your option) any later version.
010 *
011 * SonarQube is distributed in the hope that it will be useful,
012 * but WITHOUT ANY WARRANTY; without even the implied warranty of
013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014 * Lesser General Public License for more details.
015 *
016 * You should have received a copy of the GNU Lesser General Public License
017 * along with this program; if not, write to the Free Software Foundation,
018 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
019 */
020 package org.sonar.wsclient.internal;
021
022 import com.github.kevinsawicki.http.HttpRequest;
023 import org.sonar.wsclient.base.HttpException;
024
025 import javax.annotation.Nullable;
026 import java.util.Arrays;
027 import java.util.Map;
028
029 import static java.net.HttpURLConnection.*;
030
031 /**
032 * Not an API. Please do not use this class, except maybe for unit tests.
033 */
034 public class HttpRequestFactory {
035
036 private static final int[] RESPONSE_SUCCESS = {HTTP_OK, HTTP_CREATED, HTTP_NO_CONTENT};
037
038 private final String baseUrl;
039 private String login, password, proxyHost, proxyLogin, proxyPassword;
040 private int proxyPort;
041 private int connectTimeoutInMilliseconds;
042 private int readTimeoutInMilliseconds;
043
044 public HttpRequestFactory(String baseUrl) {
045 this.baseUrl = baseUrl;
046 }
047
048 public HttpRequestFactory setLogin(@Nullable String login) {
049 this.login = login;
050 return this;
051 }
052
053 public HttpRequestFactory setPassword(@Nullable String password) {
054 this.password = password;
055 return this;
056 }
057
058 public HttpRequestFactory setProxyHost(@Nullable String proxyHost) {
059 this.proxyHost = proxyHost;
060 return this;
061 }
062
063 public HttpRequestFactory setProxyLogin(@Nullable String proxyLogin) {
064 this.proxyLogin = proxyLogin;
065 return this;
066 }
067
068 public HttpRequestFactory setProxyPassword(@Nullable String proxyPassword) {
069 this.proxyPassword = proxyPassword;
070 return this;
071 }
072
073 public HttpRequestFactory setProxyPort(int proxyPort) {
074 this.proxyPort = proxyPort;
075 return this;
076 }
077
078 public HttpRequestFactory setConnectTimeoutInMilliseconds(int connectTimeoutInMilliseconds) {
079 this.connectTimeoutInMilliseconds = connectTimeoutInMilliseconds;
080 return this;
081 }
082
083 public HttpRequestFactory setReadTimeoutInMilliseconds(int readTimeoutInMilliseconds) {
084 this.readTimeoutInMilliseconds = readTimeoutInMilliseconds;
085 return this;
086 }
087
088 public String getBaseUrl() {
089 return baseUrl;
090 }
091
092 public String getLogin() {
093 return login;
094 }
095
096 public String getPassword() {
097 return password;
098 }
099
100 public String getProxyHost() {
101 return proxyHost;
102 }
103
104 public String getProxyLogin() {
105 return proxyLogin;
106 }
107
108 public String getProxyPassword() {
109 return proxyPassword;
110 }
111
112 public int getProxyPort() {
113 return proxyPort;
114 }
115
116 public int getConnectTimeoutInMilliseconds() {
117 return connectTimeoutInMilliseconds;
118 }
119
120 public int getReadTimeoutInMilliseconds() {
121 return readTimeoutInMilliseconds;
122 }
123
124 public String get(String wsUrl, Map<String, Object> queryParams) {
125 HttpRequest request = prepare(HttpRequest.get(baseUrl + wsUrl, queryParams, true));
126 return execute(request);
127 }
128
129 public String post(String wsUrl, Map<String, Object> queryParams) {
130 HttpRequest request = prepare(HttpRequest.post(baseUrl + wsUrl, true)).form(queryParams, HttpRequest.CHARSET_UTF8);
131 return execute(request);
132 }
133
134 private String execute(HttpRequest request) {
135 try {
136 if (isSuccess(request)) {
137 return request.body(HttpRequest.CHARSET_UTF8);
138 }
139 // TODO handle error messages
140 throw new HttpException(request.url().toString(), request.code());
141
142 } catch (HttpRequest.HttpRequestException e) {
143 throw new IllegalStateException("Fail to request " + request.url(), e.getCause());
144 }
145 }
146
147 private boolean isSuccess(HttpRequest request) {
148 return Arrays.binarySearch(RESPONSE_SUCCESS, request.code()) >= 0;
149 }
150
151 private HttpRequest prepare(HttpRequest request) {
152 if (proxyHost != null) {
153 request.useProxy(proxyHost, proxyPort);
154 if (proxyLogin != null) {
155 request.proxyBasic(proxyLogin, proxyPassword);
156 }
157 }
158 request
159 .acceptGzipEncoding()
160 .uncompress(true)
161 .acceptJson()
162 .acceptCharset(HttpRequest.CHARSET_UTF8)
163 .connectTimeout(connectTimeoutInMilliseconds)
164 .readTimeout(readTimeoutInMilliseconds)
165 .trustAllCerts()
166 .trustAllHosts();
167 if (login != null) {
168 request.basic(login, password);
169 }
170 return request;
171 }
172 }