Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
### v4.17.2 (2026-10-21)
* * *
### Bug Fixes:
* Fix `NullPointerException` in `isIdempotencyReplayed()` and `header()` when response headers contain the HTTP status line under a `null` key (as returned by `HttpURLConnection`). The `null` key is no longer exposed via `headers()`.
* Treat the `chargebee-idempotency-key` header case-insensitively in `RequestOptions`, so `getIdempotencyKey()` finds keys set with any casing and the header is not sent twice.

### v4.17.1 (2026-10-19)
* * *
### Bug Fixes:
Expand Down
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
4.17.1
4.17.2
2 changes: 1 addition & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ plugins {
}

group = "com.chargebee"
version = "4.17.1"
version = "4.17.2"
description = "Java client library for ChargeBee"

// Project metadata
Expand Down
24 changes: 18 additions & 6 deletions src/main/java/com/chargebee/v4/client/request/RequestOptions.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
* Supports headers and can be extended for timeouts, retries, API versions, etc.
*/
public final class RequestOptions {
private static final String IDEMPOTENCY_KEY_HEADER = "chargebee-idempotency-key";

private final Map<String, String> headers;
private final Integer maxNetworkRetries;
private final Boolean retryEnabled;
Expand Down Expand Up @@ -61,13 +63,13 @@ public static Builder builder() {

public RequestOptions withHeader(String key, String value) {
Map<String, String> copy = new HashMap<>(headers);
copy.put(key, value);
putHeader(copy, key, value);
return new RequestOptions(copy, maxNetworkRetries, retryEnabled, retryBaseDelayMs, retryOnStatus, connectTimeoutMs, readTimeoutMs, followRedirects, gzipCompression, requestLogger, telemetryAdapter);
}

public RequestOptions withHeaders(Map<String, String> newHeaders) {
Map<String, String> copy = new HashMap<>(headers);
copy.putAll(newHeaders);
putHeaders(copy, newHeaders);
return new RequestOptions(copy, maxNetworkRetries, retryEnabled, retryBaseDelayMs, retryOnStatus, connectTimeoutMs, readTimeoutMs, followRedirects, gzipCompression, requestLogger, telemetryAdapter);
}

Expand All @@ -81,7 +83,17 @@ public Map<String, String> getHeaders() {
* @return the idempotency key, or null if not set
*/
public String getIdempotencyKey() {
return headers.get("chargebee-idempotency-key");
return headers.get(IDEMPOTENCY_KEY_HEADER);
}

private static void putHeader(Map<String, String> target, String name, String value) {
target.put(IDEMPOTENCY_KEY_HEADER.equalsIgnoreCase(name) ? IDEMPOTENCY_KEY_HEADER : name, value);
}

private static void putHeaders(Map<String, String> target, Map<String, String> source) {
for (Map.Entry<String, String> entry : source.entrySet()) {
putHeader(target, entry.getKey(), entry.getValue());
}
Comment thread
cb-alish marked this conversation as resolved.
}

public Integer getMaxNetworkRetries() {
Expand Down Expand Up @@ -139,14 +151,14 @@ public static final class Builder {

public Builder header(String name, String value) {
if (name != null && value != null) {
headers.put(name, value);
putHeader(headers, name, value);
}
return this;
}

public Builder headers(Map<String, String> headers) {
if (headers != null) {
this.headers.putAll(headers);
putHeaders(this.headers, headers);
}
return this;
}
Expand All @@ -160,7 +172,7 @@ public Builder headers(Map<String, String> headers) {
*/
public Builder idempotencyKey(String idempotencyKey) {
if (idempotencyKey != null && !idempotencyKey.isEmpty()) {
this.headers.put("chargebee-idempotency-key", idempotencyKey);
this.headers.put(IDEMPOTENCY_KEY_HEADER, idempotencyKey);
}
return this;
}
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/chargebee/v4/models/BaseResponse.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public Map<String, List<String>> headers() {
public List<String> header(String name) {
if (httpResponse == null) return null;
return httpResponse.getHeaders().entrySet().stream()
.filter(e -> e.getKey().equalsIgnoreCase(name))
.filter(e -> name.equalsIgnoreCase(e.getKey()))
.map(Map.Entry::getValue)
.findFirst()
.orElse(null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ public java.util.Map<String, java.util.List<String>> headers() {
public java.util.List<String> header(String name) {
if (httpResponse == null) return null;
return httpResponse.getHeaders().entrySet().stream()
.filter(e -> e.getKey().equalsIgnoreCase(name))
.filter(e -> name.equalsIgnoreCase(e.getKey()))
.map(java.util.Map.Entry::getValue)
.findFirst()
.orElse(null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ public java.util.Map<String, java.util.List<String>> headers() {
public java.util.List<String> header(String name) {
if (httpResponse == null) return null;
return httpResponse.getHeaders().entrySet().stream()
.filter(e -> e.getKey().equalsIgnoreCase(name))
.filter(e -> name.equalsIgnoreCase(e.getKey()))
.map(java.util.Map.Entry::getValue)
.findFirst()
.orElse(null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ public java.util.Map<String, java.util.List<String>> headers() {
public java.util.List<String> header(String name) {
if (httpResponse == null) return null;
return httpResponse.getHeaders().entrySet().stream()
.filter(e -> e.getKey().equalsIgnoreCase(name))
.filter(e -> name.equalsIgnoreCase(e.getKey()))
.map(java.util.Map.Entry::getValue)
.findFirst()
.orElse(null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ public java.util.Map<String, java.util.List<String>> headers() {
public java.util.List<String> header(String name) {
if (httpResponse == null) return null;
return httpResponse.getHeaders().entrySet().stream()
.filter(e -> e.getKey().equalsIgnoreCase(name))
.filter(e -> name.equalsIgnoreCase(e.getKey()))
.map(java.util.Map.Entry::getValue)
.findFirst()
.orElse(null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ public java.util.Map<String, java.util.List<String>> headers() {
public java.util.List<String> header(String name) {
if (httpResponse == null) return null;
return httpResponse.getHeaders().entrySet().stream()
.filter(e -> e.getKey().equalsIgnoreCase(name))
.filter(e -> name.equalsIgnoreCase(e.getKey()))
.map(java.util.Map.Entry::getValue)
.findFirst()
.orElse(null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ public java.util.Map<String, java.util.List<String>> headers() {
public java.util.List<String> header(String name) {
if (httpResponse == null) return null;
return httpResponse.getHeaders().entrySet().stream()
.filter(e -> e.getKey().equalsIgnoreCase(name))
.filter(e -> name.equalsIgnoreCase(e.getKey()))
.map(java.util.Map.Entry::getValue)
.findFirst()
.orElse(null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ public java.util.Map<String, java.util.List<String>> headers() {
public java.util.List<String> header(String name) {
if (httpResponse == null) return null;
return httpResponse.getHeaders().entrySet().stream()
.filter(e -> e.getKey().equalsIgnoreCase(name))
.filter(e -> name.equalsIgnoreCase(e.getKey()))
.map(java.util.Map.Entry::getValue)
.findFirst()
.orElse(null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ public java.util.Map<String, java.util.List<String>> headers() {
public java.util.List<String> header(String name) {
if (httpResponse == null) return null;
return httpResponse.getHeaders().entrySet().stream()
.filter(e -> e.getKey().equalsIgnoreCase(name))
.filter(e -> name.equalsIgnoreCase(e.getKey()))
.map(java.util.Map.Entry::getValue)
.findFirst()
.orElse(null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ public java.util.Map<String, java.util.List<String>> headers() {
public java.util.List<String> header(String name) {
if (httpResponse == null) return null;
return httpResponse.getHeaders().entrySet().stream()
.filter(e -> e.getKey().equalsIgnoreCase(name))
.filter(e -> name.equalsIgnoreCase(e.getKey()))
.map(java.util.Map.Entry::getValue)
.findFirst()
.orElse(null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ public java.util.Map<String, java.util.List<String>> headers() {
public java.util.List<String> header(String name) {
if (httpResponse == null) return null;
return httpResponse.getHeaders().entrySet().stream()
.filter(e -> e.getKey().equalsIgnoreCase(name))
.filter(e -> name.equalsIgnoreCase(e.getKey()))
.map(java.util.Map.Entry::getValue)
.findFirst()
.orElse(null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ public java.util.Map<String, java.util.List<String>> headers() {
public java.util.List<String> header(String name) {
if (httpResponse == null) return null;
return httpResponse.getHeaders().entrySet().stream()
.filter(e -> e.getKey().equalsIgnoreCase(name))
.filter(e -> name.equalsIgnoreCase(e.getKey()))
.map(java.util.Map.Entry::getValue)
.findFirst()
.orElse(null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ public java.util.Map<String, java.util.List<String>> headers() {
public java.util.List<String> header(String name) {
if (httpResponse == null) return null;
return httpResponse.getHeaders().entrySet().stream()
.filter(e -> e.getKey().equalsIgnoreCase(name))
.filter(e -> name.equalsIgnoreCase(e.getKey()))
.map(java.util.Map.Entry::getValue)
.findFirst()
.orElse(null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ public java.util.Map<String, java.util.List<String>> headers() {
public java.util.List<String> header(String name) {
if (httpResponse == null) return null;
return httpResponse.getHeaders().entrySet().stream()
.filter(e -> e.getKey().equalsIgnoreCase(name))
.filter(e -> name.equalsIgnoreCase(e.getKey()))
.map(java.util.Map.Entry::getValue)
.findFirst()
.orElse(null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ public java.util.Map<String, java.util.List<String>> headers() {
public java.util.List<String> header(String name) {
if (httpResponse == null) return null;
return httpResponse.getHeaders().entrySet().stream()
.filter(e -> e.getKey().equalsIgnoreCase(name))
.filter(e -> name.equalsIgnoreCase(e.getKey()))
.map(java.util.Map.Entry::getValue)
.findFirst()
.orElse(null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ public java.util.Map<String, java.util.List<String>> headers() {
public java.util.List<String> header(String name) {
if (httpResponse == null) return null;
return httpResponse.getHeaders().entrySet().stream()
.filter(e -> e.getKey().equalsIgnoreCase(name))
.filter(e -> name.equalsIgnoreCase(e.getKey()))
.map(java.util.Map.Entry::getValue)
.findFirst()
.orElse(null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ public java.util.Map<String, java.util.List<String>> headers() {
public java.util.List<String> header(String name) {
if (httpResponse == null) return null;
return httpResponse.getHeaders().entrySet().stream()
.filter(e -> e.getKey().equalsIgnoreCase(name))
.filter(e -> name.equalsIgnoreCase(e.getKey()))
.map(java.util.Map.Entry::getValue)
.findFirst()
.orElse(null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ public java.util.Map<String, java.util.List<String>> headers() {
public java.util.List<String> header(String name) {
if (httpResponse == null) return null;
return httpResponse.getHeaders().entrySet().stream()
.filter(e -> e.getKey().equalsIgnoreCase(name))
.filter(e -> name.equalsIgnoreCase(e.getKey()))
.map(java.util.Map.Entry::getValue)
.findFirst()
.orElse(null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,7 @@ public java.util.Map<String, java.util.List<String>> headers() {
public java.util.List<String> header(String name) {
if (httpResponse == null) return null;
return httpResponse.getHeaders().entrySet().stream()
.filter(e -> e.getKey().equalsIgnoreCase(name))
.filter(e -> name.equalsIgnoreCase(e.getKey()))
.map(java.util.Map.Entry::getValue)
.findFirst()
.orElse(null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@ public java.util.Map<String, java.util.List<String>> headers() {
public java.util.List<String> header(String name) {
if (httpResponse == null) return null;
return httpResponse.getHeaders().entrySet().stream()
.filter(e -> e.getKey().equalsIgnoreCase(name))
.filter(e -> name.equalsIgnoreCase(e.getKey()))
.map(java.util.Map.Entry::getValue)
.findFirst()
.orElse(null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ public java.util.Map<String, java.util.List<String>> headers() {
public java.util.List<String> header(String name) {
if (httpResponse == null) return null;
return httpResponse.getHeaders().entrySet().stream()
.filter(e -> e.getKey().equalsIgnoreCase(name))
.filter(e -> name.equalsIgnoreCase(e.getKey()))
.map(java.util.Map.Entry::getValue)
.findFirst()
.orElse(null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ public java.util.Map<String, java.util.List<String>> headers() {
public java.util.List<String> header(String name) {
if (httpResponse == null) return null;
return httpResponse.getHeaders().entrySet().stream()
.filter(e -> e.getKey().equalsIgnoreCase(name))
.filter(e -> name.equalsIgnoreCase(e.getKey()))
.map(java.util.Map.Entry::getValue)
.findFirst()
.orElse(null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@ public java.util.Map<String, java.util.List<String>> headers() {
public java.util.List<String> header(String name) {
if (httpResponse == null) return null;
return httpResponse.getHeaders().entrySet().stream()
.filter(e -> e.getKey().equalsIgnoreCase(name))
.filter(e -> name.equalsIgnoreCase(e.getKey()))
.map(java.util.Map.Entry::getValue)
.findFirst()
.orElse(null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ public java.util.Map<String, java.util.List<String>> headers() {
public java.util.List<String> header(String name) {
if (httpResponse == null) return null;
return httpResponse.getHeaders().entrySet().stream()
.filter(e -> e.getKey().equalsIgnoreCase(name))
.filter(e -> name.equalsIgnoreCase(e.getKey()))
.map(java.util.Map.Entry::getValue)
.findFirst()
.orElse(null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ public java.util.Map<String, java.util.List<String>> headers() {
public java.util.List<String> header(String name) {
if (httpResponse == null) return null;
return httpResponse.getHeaders().entrySet().stream()
.filter(e -> e.getKey().equalsIgnoreCase(name))
.filter(e -> name.equalsIgnoreCase(e.getKey()))
.map(java.util.Map.Entry::getValue)
.findFirst()
.orElse(null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,7 @@ public java.util.Map<String, java.util.List<String>> headers() {
public java.util.List<String> header(String name) {
if (httpResponse == null) return null;
return httpResponse.getHeaders().entrySet().stream()
.filter(e -> e.getKey().equalsIgnoreCase(name))
.filter(e -> name.equalsIgnoreCase(e.getKey()))
.map(java.util.Map.Entry::getValue)
.findFirst()
.orElse(null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ public java.util.Map<String, java.util.List<String>> headers() {
public java.util.List<String> header(String name) {
if (httpResponse == null) return null;
return httpResponse.getHeaders().entrySet().stream()
.filter(e -> e.getKey().equalsIgnoreCase(name))
.filter(e -> name.equalsIgnoreCase(e.getKey()))
.map(java.util.Map.Entry::getValue)
.findFirst()
.orElse(null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ public java.util.Map<String, java.util.List<String>> headers() {
public java.util.List<String> header(String name) {
if (httpResponse == null) return null;
return httpResponse.getHeaders().entrySet().stream()
.filter(e -> e.getKey().equalsIgnoreCase(name))
.filter(e -> name.equalsIgnoreCase(e.getKey()))
.map(java.util.Map.Entry::getValue)
.findFirst()
.orElse(null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ public java.util.Map<String, java.util.List<String>> headers() {
public java.util.List<String> header(String name) {
if (httpResponse == null) return null;
return httpResponse.getHeaders().entrySet().stream()
.filter(e -> e.getKey().equalsIgnoreCase(name))
.filter(e -> name.equalsIgnoreCase(e.getKey()))
.map(java.util.Map.Entry::getValue)
.findFirst()
.orElse(null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ public java.util.Map<String, java.util.List<String>> headers() {
public java.util.List<String> header(String name) {
if (httpResponse == null) return null;
return httpResponse.getHeaders().entrySet().stream()
.filter(e -> e.getKey().equalsIgnoreCase(name))
.filter(e -> name.equalsIgnoreCase(e.getKey()))
.map(java.util.Map.Entry::getValue)
.findFirst()
.orElse(null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,7 @@ public java.util.Map<String, java.util.List<String>> headers() {
public java.util.List<String> header(String name) {
if (httpResponse == null) return null;
return httpResponse.getHeaders().entrySet().stream()
.filter(e -> e.getKey().equalsIgnoreCase(name))
.filter(e -> name.equalsIgnoreCase(e.getKey()))
.map(java.util.Map.Entry::getValue)
.findFirst()
.orElse(null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ public java.util.Map<String, java.util.List<String>> headers() {
public java.util.List<String> header(String name) {
if (httpResponse == null) return null;
return httpResponse.getHeaders().entrySet().stream()
.filter(e -> e.getKey().equalsIgnoreCase(name))
.filter(e -> name.equalsIgnoreCase(e.getKey()))
.map(java.util.Map.Entry::getValue)
.findFirst()
.orElse(null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ public java.util.Map<String, java.util.List<String>> headers() {
public java.util.List<String> header(String name) {
if (httpResponse == null) return null;
return httpResponse.getHeaders().entrySet().stream()
.filter(e -> e.getKey().equalsIgnoreCase(name))
.filter(e -> name.equalsIgnoreCase(e.getKey()))
.map(java.util.Map.Entry::getValue)
.findFirst()
.orElse(null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ public java.util.Map<String, java.util.List<String>> headers() {
public java.util.List<String> header(String name) {
if (httpResponse == null) return null;
return httpResponse.getHeaders().entrySet().stream()
.filter(e -> e.getKey().equalsIgnoreCase(name))
.filter(e -> name.equalsIgnoreCase(e.getKey()))
.map(java.util.Map.Entry::getValue)
.findFirst()
.orElse(null);
Expand Down
Loading
Loading