Skip to content

Commit 7f18edf

Browse files
committed
refactor: migrate to Apache HTTP Client 5 (incomplete)
1 parent df1c08e commit 7f18edf

64 files changed

Lines changed: 240 additions & 207 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ dependencies {
2626
compileOnly 'org.projectlombok:lombok:1.18.24'
2727
annotationProcessor 'org.projectlombok:lombok:1.18.32'
2828

29-
implementation 'org.apache.httpcomponents:httpclient:4.5.13'
29+
implementation 'org.apache.httpcomponents.client5:httpclient5:5.3.1'
3030
implementation 'com.fasterxml.jackson.core:jackson-databind:2.17.3'
3131

3232
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.9.0','org.mockito:mockito-core:4.11.0'
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1+
#Sun Feb 22 22:18:26 EET 2026
12
distributionBase=GRADLE_USER_HOME
23
distributionPath=wrapper/dists
3-
distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.4-bin.zip
4+
distributionUrl=https\://services.gradle.org/distributions/gradle-9.0.0-bin.zip
45
zipStoreBase=GRADLE_USER_HOME
56
zipStorePath=wrapper/dists

src/main/java/com/crowdin/client/core/CrowdinApi.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
import com.crowdin.client.core.http.impl.http.ApacheHttpClient;
77
import com.crowdin.client.core.http.impl.json.JacksonJsonTransformer;
88
import com.crowdin.client.core.model.*;
9-
import org.apache.http.client.config.CookieSpecs;
10-
import org.apache.http.client.config.RequestConfig;
11-
import org.apache.http.impl.client.HttpClientBuilder;
9+
import org.apache.hc.client5.http.cookie.StandardCookieSpec;
10+
import org.apache.hc.client5.http.config.RequestConfig;
11+
import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
1212

1313
import java.util.Collections;
1414
import java.util.HashMap;
@@ -25,7 +25,7 @@ public CrowdinApi(Credentials credentials) {
2525
this(credentials, ClientConfig.builder()
2626
.httpClient(new ApacheHttpClient(credentials, new JacksonJsonTransformer(), Collections.emptyMap(), HttpClientBuilder
2727
.create()
28-
.setDefaultRequestConfig(RequestConfig.custom().setCookieSpec(CookieSpecs.STANDARD).build())
28+
.setDefaultRequestConfig(RequestConfig.custom().setCookieSpec(StandardCookieSpec.RELAXED).build())
2929
.build()))
3030
.build());
3131
}

src/main/java/com/crowdin/client/core/http/impl/http/ApacheHttpClient.java

Lines changed: 55 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -8,27 +8,41 @@
88
import com.crowdin.client.core.http.exceptions.HttpException;
99
import com.crowdin.client.core.model.ClientConfig;
1010
import com.crowdin.client.core.model.Credentials;
11-
import org.apache.http.HttpEntity;
12-
import org.apache.http.HttpHost;
13-
import org.apache.http.auth.AuthScope;
14-
import org.apache.http.auth.UsernamePasswordCredentials;
15-
import org.apache.http.client.config.CookieSpecs;
16-
import org.apache.http.client.config.RequestConfig;
17-
import org.apache.http.client.methods.CloseableHttpResponse;
18-
import org.apache.http.client.methods.HttpDelete;
19-
import org.apache.http.client.methods.HttpGet;
20-
import org.apache.http.client.methods.HttpHead;
21-
import org.apache.http.client.methods.HttpPatch;
22-
import org.apache.http.client.methods.HttpPost;
23-
import org.apache.http.client.methods.HttpPut;
24-
import org.apache.http.client.methods.HttpUriRequest;
25-
import org.apache.http.client.methods.RequestBuilder;
26-
import org.apache.http.entity.ContentType;
27-
import org.apache.http.entity.InputStreamEntity;
28-
import org.apache.http.entity.StringEntity;
29-
import org.apache.http.impl.client.BasicCredentialsProvider;
30-
import org.apache.http.impl.client.CloseableHttpClient;
31-
import org.apache.http.impl.client.HttpClientBuilder;
11+
import org.apache.hc.client5.http.classic.methods.*;
12+
import org.apache.hc.core5.http.HttpEntity;
13+
import org.apache.hc.core5.http.HttpHost;
14+
import org.apache.hc.client5.http.auth.AuthScope;
15+
import org.apache.hc.client5.http.auth.UsernamePasswordCredentials;
16+
import org.apache.hc.client5.http.cookie.StandardCookieSpec;
17+
import org.apache.hc.client5.http.config.RequestConfig;
18+
//import org.apache.http.client.methods.HttpUriRequest;
19+
//import org.apache.http.client.methods.RequestBuilder;
20+
//import org.apache.http.entity.ContentType;
21+
//import org.apache.http.entity.InputStreamEntity;
22+
//import org.apache.http.entity.StringEntity;
23+
//import org.apache.http.impl.client.BasicCredentialsProvider;
24+
//import org.apache.http.impl.client.CloseableHttpClient;
25+
//import org.apache.http.impl.client.HttpClientBuilder;
26+
27+
import org.apache.hc.client5.http.classic.methods.HttpUriRequestBase;
28+
import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
29+
import org.apache.hc.core5.http.ContentType;
30+
import org.apache.hc.core5.http.io.entity.InputStreamEntity;
31+
import org.apache.hc.core5.http.io.entity.StringEntity;
32+
33+
import org.apache.hc.client5.http.impl.auth.BasicCredentialsProvider;
34+
35+
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
36+
import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
37+
import org.apache.hc.core5.util.Timeout;
38+
39+
import org.apache.hc.client5.http.classic.methods.HttpUriRequestBase;
40+
import org.apache.hc.client5.http.classic.methods.HttpPost;
41+
42+
import org.apache.hc.core5.http.HttpEntity;
43+
import org.apache.hc.core5.http.ContentType;
44+
import org.apache.hc.core5.http.io.entity.InputStreamEntity;
45+
import org.apache.hc.core5.http.io.entity.StringEntity;
3246

3347
import java.io.IOException;
3448
import java.io.InputStream;
@@ -38,6 +52,7 @@
3852
import java.nio.charset.StandardCharsets;
3953
import java.util.HashMap;
4054
import java.util.Map;
55+
import java.util.concurrent.TimeUnit;
4156

4257
public class ApacheHttpClient implements HttpClient {
4358

@@ -62,19 +77,20 @@ public ApacheHttpClient(Credentials credentials, JsonTransformer jsonTransformer
6277
this.defaultHeaders = defaultHeaders;
6378
this.proxy = proxy;
6479
this.proxyCreds = proxyCreds;
65-
RequestConfig.Builder requestConfig = RequestConfig.custom().setCookieSpec(CookieSpecs.STANDARD);
80+
RequestConfig.Builder requestConfig = RequestConfig.custom().setCookieSpec(StandardCookieSpec.RELAXED);
6681
if (timeoutMs != null) {
67-
requestConfig.setConnectionRequestTimeout(timeoutMs);
68-
requestConfig.setConnectTimeout(timeoutMs);
69-
requestConfig.setSocketTimeout(timeoutMs);
82+
Timeout timeout = Timeout.of(timeoutMs, TimeUnit.MILLISECONDS);
83+
requestConfig.setConnectionRequestTimeout(timeout);
84+
requestConfig.setConnectTimeout(timeout);
85+
requestConfig.setResponseTimeout(timeout);
7086
}
7187
this.httpClient = (proxy != null)
7288
? HttpClientBuilder.create()
7389
.setProxy(new HttpHost(proxy.getHost(), proxy.getPort()))
7490
.setDefaultRequestConfig(requestConfig.build())
7591
.setDefaultCredentialsProvider((proxyCreds != null)
7692
? new BasicCredentialsProvider() {{
77-
setCredentials(new AuthScope(proxy.getHost(), proxy.getPort()), new UsernamePasswordCredentials(proxyCreds.getUsername(), proxyCreds.getPassword()));
93+
setCredentials(new AuthScope(proxy.getHost(), proxy.getPort()), new UsernamePasswordCredentials(proxyCreds.getUsername(), proxyCreds.getPassword().toCharArray()));
7894
}}
7995
: new BasicCredentialsProvider())
8096
.build()
@@ -119,10 +135,10 @@ private <T, V> T request(String url,
119135
HttpRequestConfig config,
120136
Class<T> clazz,
121137
String method) throws HttpException, HttpBadRequestException {
122-
HttpUriRequest request = this.buildRequest(method, url, data, config);
138+
HttpUriRequestBase request = this.buildRequest(method, url, data, config);
123139
String httpResponse = null;
124140
try (CloseableHttpResponse response = httpClient.execute(request)) {
125-
int statusCode = response.getStatusLine().getStatusCode();
141+
int statusCode = response.getCode();
126142
if (statusCode < 200 || statusCode >= 300) {
127143
String error = this.toString(response.getEntity());
128144
throw this.jsonTransformer.parse(error, CrowdinApiException.class);
@@ -142,30 +158,32 @@ private <T, V> T request(String url,
142158
}
143159
}
144160

145-
private <V> HttpUriRequest buildRequest(String httpMethod, String url, V data, HttpRequestConfig config) {
146-
RequestBuilder requestBuilder = RequestBuilder.create(httpMethod);
147-
requestBuilder.setUri(URI.create(this.appendUrlParams(url, config.getUrlParams())));
148-
requestBuilder.addHeader("Authorization", "Bearer " + this.credentials.getToken());
161+
private <V> HttpUriRequestBase buildRequest(String httpMethod, String url, V data, HttpRequestConfig config) {
162+
//RequestBuilder requestBuilder = RequestBuilder.create(httpMethod);
163+
HttpUriRequestBase request = new HttpUriRequestBase(httpMethod, URI.create(this.appendUrlParams(url, config.getUrlParams())));
164+
165+
//requestBuilder.setUri(URI.create(this.appendUrlParams(url, config.getUrlParams())));
166+
request.addHeader("Authorization", "Bearer " + this.credentials.getToken());
149167
if (data != null) {
150168
HttpEntity entity;
151169
if (data instanceof InputStream) {
152-
entity = new InputStreamEntity((InputStream) data);
170+
entity = new InputStreamEntity((InputStream) data, ContentType.APPLICATION_OCTET_STREAM);
153171
} else if (data instanceof String) {
154172
entity = new StringEntity((String) data, ContentType.APPLICATION_OCTET_STREAM);
155173
} else {
156174
entity = new StringEntity(this.jsonTransformer.convert(data), ContentType.APPLICATION_JSON);
157175
}
158-
requestBuilder.setEntity(entity);
176+
request.setEntity(entity);
159177
} else if (HttpPost.METHOD_NAME.equals(httpMethod)) {
160-
requestBuilder.setEntity(new StringEntity("", ContentType.APPLICATION_JSON));
178+
request.setEntity(new StringEntity("", ContentType.APPLICATION_JSON));
161179
}
162180
Map<String, Object> headers = new HashMap<>();
163181
headers.putAll(config.getHeaders());
164182
headers.putAll(this.defaultHeaders);
165183
for (Map.Entry<String, ?> entry : headers.entrySet()) {
166-
requestBuilder = requestBuilder.addHeader(entry.getKey(), entry.getValue().toString());
184+
request.addHeader(entry.getKey(), entry.getValue().toString());
167185
}
168-
return requestBuilder.build();
186+
return request;
169187
}
170188

171189
private String toString(HttpEntity entity) throws IOException {

src/test/java/com/crowdin/client/ai/AIApiTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@
1111
import com.crowdin.client.core.model.ResponseObject;
1212
import com.crowdin.client.framework.RequestMock;
1313
import com.crowdin.client.framework.TestClient;
14-
import org.apache.http.client.methods.HttpDelete;
15-
import org.apache.http.client.methods.HttpGet;
16-
import org.apache.http.client.methods.HttpPatch;
17-
import org.apache.http.client.methods.HttpPost;
14+
import org.apache.hc.client5.http.classic.methods.HttpDelete;
15+
import org.apache.hc.client5.http.classic.methods.HttpGet;
16+
import org.apache.hc.client5.http.classic.methods.HttpPatch;
17+
import org.apache.hc.client5.http.classic.methods.HttpPost;
1818
import org.junit.jupiter.api.Test;
1919

2020
import java.util.*;

src/test/java/com/crowdin/client/applications/ApplicationsApiTest.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@
77
import com.crowdin.client.core.model.ResponseObject;
88
import com.crowdin.client.framework.RequestMock;
99
import com.crowdin.client.framework.TestClient;
10-
import org.apache.http.client.methods.HttpDelete;
11-
import org.apache.http.client.methods.HttpGet;
12-
import org.apache.http.client.methods.HttpPatch;
13-
import org.apache.http.client.methods.HttpPost;
14-
import org.apache.http.client.methods.HttpPut;
10+
import org.apache.hc.client5.http.classic.methods.HttpDelete;
11+
import org.apache.hc.client5.http.classic.methods.HttpGet;
12+
import org.apache.hc.client5.http.classic.methods.HttpPatch;
13+
import org.apache.hc.client5.http.classic.methods.HttpPost;
14+
import org.apache.hc.client5.http.classic.methods.HttpPut;
1515
import org.junit.jupiter.api.Test;
1616

1717
import java.util.*;

src/test/java/com/crowdin/client/branches/BranchesApiTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
import com.crowdin.client.core.model.ResponseObject;
55
import com.crowdin.client.framework.RequestMock;
66
import com.crowdin.client.framework.TestClient;
7-
import org.apache.http.client.methods.HttpGet;
8-
import org.apache.http.client.methods.HttpPost;
7+
import org.apache.hc.client5.http.classic.methods.HttpGet;
8+
import org.apache.hc.client5.http.classic.methods.HttpPost;
99
import org.junit.jupiter.api.Test;
1010

1111
import java.util.Arrays;

src/test/java/com/crowdin/client/bundles/BundlesApiTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@
1111
import com.crowdin.client.sourcefiles.model.Branch;
1212
import com.crowdin.client.sourcefiles.model.File;
1313
import com.crowdin.client.sourcefiles.model.FileInfo;
14-
import org.apache.http.client.methods.HttpDelete;
15-
import org.apache.http.client.methods.HttpGet;
16-
import org.apache.http.client.methods.HttpPatch;
17-
import org.apache.http.client.methods.HttpPost;
14+
import org.apache.hc.client5.http.classic.methods.HttpDelete;
15+
import org.apache.hc.client5.http.classic.methods.HttpGet;
16+
import org.apache.hc.client5.http.classic.methods.HttpPatch;
17+
import org.apache.hc.client5.http.classic.methods.HttpPost;
1818
import org.junit.jupiter.api.Test;
1919

2020
import java.util.ArrayList;

src/test/java/com/crowdin/client/clients/ClientsApiTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import com.crowdin.client.core.model.ResponseList;
66
import com.crowdin.client.framework.RequestMock;
77
import com.crowdin.client.framework.TestClient;
8-
import org.apache.http.client.methods.HttpGet;
8+
import org.apache.hc.client5.http.classic.methods.HttpGet;
99
import org.junit.jupiter.api.Test;
1010

1111
import java.util.List;

src/test/java/com/crowdin/client/core/CrowdinApiTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import com.crowdin.client.framework.TestClient;
66
import lombok.Data;
77
import lombok.var;
8-
import org.apache.http.client.methods.HttpPost;
8+
import org.apache.hc.client5.http.classic.methods.HttpPost;
99
import org.junit.jupiter.api.Test;
1010

1111
import java.util.Arrays;

0 commit comments

Comments
 (0)