001 /*
002 * SonarQube, open source software quality management tool.
003 * Copyright (C) 2008-2013 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.Map;
027
028 /**
029 * Not an API. Please do not use this class, except maybe for unit tests.
030 */
031 public class HttpRequestFactory {
032
033 private final String baseUrl;
034 private String login, password, proxyHost, proxyLogin, proxyPassword;
035 private int proxyPort;
036 private int connectTimeoutInMilliseconds;
037 private int readTimeoutInMilliseconds;
038
039 public HttpRequestFactory(String baseUrl) {
040 this.baseUrl = baseUrl;
041 }
042
043 public HttpRequestFactory setLogin(@Nullable String login) {
044 this.login = login;
045 return this;
046 }
047
048 public HttpRequestFactory setPassword(@Nullable String password) {
049 this.password = password;
050 return this;
051 }
052
053 public HttpRequestFactory setProxyHost(@Nullable String proxyHost) {
054 this.proxyHost = proxyHost;
055 return this;
056 }
057
058 public HttpRequestFactory setProxyLogin(@Nullable String proxyLogin) {
059 this.proxyLogin = proxyLogin;
060 return this;
061 }
062
063 public HttpRequestFactory setProxyPassword(@Nullable String proxyPassword) {
064 this.proxyPassword = proxyPassword;
065 return this;
066 }
067
068 public HttpRequestFactory setProxyPort(int proxyPort) {
069 this.proxyPort = proxyPort;
070 return this;
071 }
072
073 public HttpRequestFactory setConnectTimeoutInMilliseconds(int connectTimeoutInMilliseconds) {
074 this.connectTimeoutInMilliseconds = connectTimeoutInMilliseconds;
075 return this;
076 }
077
078 public HttpRequestFactory setReadTimeoutInMilliseconds(int readTimeoutInMilliseconds) {
079 this.readTimeoutInMilliseconds = readTimeoutInMilliseconds;
080 return this;
081 }
082
083 public String getBaseUrl() {
084 return baseUrl;
085 }
086
087 public String getLogin() {
088 return login;
089 }
090
091 public String getPassword() {
092 return password;
093 }
094
095 public String getProxyHost() {
096 return proxyHost;
097 }
098
099 public String getProxyLogin() {
100 return proxyLogin;
101 }
102
103 public String getProxyPassword() {
104 return proxyPassword;
105 }
106
107 public int getProxyPort() {
108 return proxyPort;
109 }
110
111 public int getConnectTimeoutInMilliseconds() {
112 return connectTimeoutInMilliseconds;
113 }
114
115 public int getReadTimeoutInMilliseconds() {
116 return readTimeoutInMilliseconds;
117 }
118
119 public String get(String wsUrl, Map<String, Object> queryParams) {
120 HttpRequest request = prepare(HttpRequest.get(baseUrl + wsUrl, queryParams, true));
121 return execute(request);
122 }
123
124 public String post(String wsUrl, Map<String, Object> queryParams) {
125 HttpRequest request = prepare(HttpRequest.post(baseUrl + wsUrl, true)).form(queryParams, HttpRequest.CHARSET_UTF8);
126 return execute(request);
127 }
128
129 private String execute(HttpRequest request) {
130 try {
131 if (request.ok()) {
132 return request.body(HttpRequest.CHARSET_UTF8);
133 }
134 // TODO handle error messages
135 throw new HttpException(request.url().toString(), request.code());
136
137 } catch (HttpRequest.HttpRequestException e) {
138 throw new IllegalStateException("Fail to request " + request.url(), e.getCause());
139 }
140 }
141
142 private HttpRequest prepare(HttpRequest request) {
143 if (proxyHost != null) {
144 request.useProxy(proxyHost, proxyPort);
145 if (proxyLogin != null) {
146 request.proxyBasic(proxyLogin, proxyPassword);
147 }
148 }
149 request
150 .acceptGzipEncoding()
151 .uncompress(true)
152 .acceptJson()
153 .acceptCharset(HttpRequest.CHARSET_UTF8)
154 .connectTimeout(connectTimeoutInMilliseconds)
155 .readTimeout(readTimeoutInMilliseconds)
156 .trustAllCerts()
157 .trustAllHosts();
158 if (login != null) {
159 request.basic(login, password);
160 }
161 return request;
162 }
163 }