Skip to content

Commit 1e1ca12

Browse files
Merge pull request #5 from coffeelibs/feature/request-timeout
2 parents b65e9a8 + 3b2c8da commit 1e1ca12

File tree

3 files changed

+39
-0
lines changed

3 files changed

+39
-0
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ Configure your authorization server to allow `http://127.0.0.1/*` as a redirect
2727
// this library will just perform the Authorization Flow:
2828
var httpResponse = TinyOAuth2.client("oauth-client-id")
2929
.withTokenEndpoint(URI.create("https://login.example.com/oauth2/token"))
30+
.withRequestTimeout(Duration.ofSeconds(10)) // optional
3031
.authFlow(URI.create("https://login.example.com/oauth2/authorize"))
3132
.authorize(uri -> System.out.println("Please login on " + uri));
3233

src/main/java/io/github/coffeelibs/tinyoauth2client/TinyOAuth2Client.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import java.net.http.HttpClient;
99
import java.net.http.HttpRequest;
1010
import java.net.http.HttpResponse;
11+
import java.time.Duration;
1112
import java.util.Map;
1213
import java.util.Objects;
1314
import java.util.concurrent.CompletableFuture;
@@ -21,6 +22,8 @@
2122
@ApiStatus.Experimental
2223
public class TinyOAuth2Client {
2324

25+
private static final Duration DEFAULT_REQUEST_TIMEOUT = Duration.ofSeconds(30);
26+
2427
/**
2528
* @see <a href="https://datatracker.ietf.org/doc/html/rfc6749#section-2.2">Client Identifier</a>
2629
*/
@@ -31,9 +34,29 @@ public class TinyOAuth2Client {
3134
*/
3235
final URI tokenEndpoint;
3336

37+
/**
38+
* Timeout of HTTP requests
39+
*/
40+
final Duration requestTimeout;
41+
3442
TinyOAuth2Client(String clientId, URI tokenEndpoint) {
43+
this(clientId, tokenEndpoint, DEFAULT_REQUEST_TIMEOUT);
44+
}
45+
46+
private TinyOAuth2Client(String clientId, URI tokenEndpoint, Duration requestTimeout) {
3547
this.clientId = Objects.requireNonNull(clientId);
3648
this.tokenEndpoint = Objects.requireNonNull(tokenEndpoint);
49+
this.requestTimeout = Objects.requireNonNull(requestTimeout);
50+
}
51+
52+
/**
53+
* Creates a new OAuth2 Client with the specified request timeout
54+
* @param requestTimeout HTTP request timeout
55+
* @return A new client
56+
* @since 0.7.0
57+
*/
58+
public TinyOAuth2Client withRequestTimeout(Duration requestTimeout) {
59+
return new TinyOAuth2Client(this.clientId, this.tokenEndpoint, requestTimeout);
3760
}
3861

3962
/**
@@ -130,6 +153,7 @@ HttpRequest buildTokenRequest(Map<String, String> parameters) {
130153
return HttpRequest.newBuilder(tokenEndpoint) //
131154
.header("Content-Type", "application/x-www-form-urlencoded") //
132155
.POST(HttpRequest.BodyPublishers.ofString(urlencodedParams)) //
156+
.timeout(requestTimeout) //
133157
.build();
134158
}
135159

src/test/java/io/github/coffeelibs/tinyoauth2client/TinyOAuth2ClientTest.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import java.net.http.HttpClient;
1212
import java.net.http.HttpRequest;
1313
import java.net.http.HttpResponse;
14+
import java.time.Duration;
1415
import java.util.Map;
1516
import java.util.concurrent.CompletableFuture;
1617
import java.util.concurrent.ExecutionException;
@@ -31,6 +32,18 @@ public void testAuthFlow() {
3132
Assertions.assertNotNull(authFlow.pkce);
3233
}
3334

35+
@Test
36+
@DisplayName("withRequestTimeout(...)")
37+
public void testWithRequestTimeout() {
38+
var client = new TinyOAuth2Client("my-client", URI.create("http://example.com/oauth2/token"));
39+
var timeout = Duration.ofMillis(1337L);
40+
41+
var newClient = client.withRequestTimeout(timeout);
42+
43+
Assertions.assertNotSame(client, newClient);
44+
Assertions.assertEquals(timeout, newClient.requestTimeout);
45+
}
46+
3447
@Test
3548
@DisplayName("refreshAsync(executor, \"r3fr3sh70k3n\") sends refresh token request")
3649
public void testRefreshAsync() {
@@ -181,6 +194,7 @@ public void testBuildTokenRequest() {
181194
bodyPublishersClass.verify(() -> HttpRequest.BodyPublishers.ofString("query=string&mock=true"));
182195
Assertions.assertEquals(tokenEndpoint, request.uri());
183196
Assertions.assertEquals("POST", request.method());
197+
Assertions.assertEquals(client.requestTimeout, request.timeout().get());
184198
Assertions.assertEquals(bodyPublisher, request.bodyPublisher().get());
185199
Assertions.assertEquals("application/x-www-form-urlencoded", request.headers().firstValue("Content-Type").orElse(null));
186200
}

0 commit comments

Comments
 (0)