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 */
020package org.sonar.wsclient.internal;
021
022import com.github.kevinsawicki.http.HttpRequest;
023import org.sonar.wsclient.base.HttpException;
024
025import javax.annotation.Nullable;
026import java.util.Map;
027
028/**
029 * Not an API. Please do not use this class, except maybe for unit tests.
030 */
031public 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}