Skip to content

Allow users to set ClientTlsSpec to RequestOptions - #6551

Merged
jrhee17 merged 4 commits into
line:mainfrom
jrhee17:feat/tls-step5
Dec 31, 2025
Merged

Allow users to set ClientTlsSpec to RequestOptions#6551
jrhee17 merged 4 commits into
line:mainfrom
jrhee17:feat/tls-step5

Conversation

@jrhee17

@jrhee17 jrhee17 commented Dec 17, 2025

Copy link
Copy Markdown
Contributor

Motivation:

This PR allows users to specify ClientTlsSpec for each request using RequestOptions#clientTlsSpec or ClientRequestContext#setClientTlsSpec.

tlsCustomizer, alpnProtocols are not allowed to be specified by users, and are set based on the SessionProtocol and ClientFactory when reaching the HttpClientDelegate

I'm unsure whether client-level APIs (AbstractClientOptionsBuilder) will end up using the TlsProvider-style API, or ClientTlsSpec-style API. For this iteration, only request-level constructs can specify ClientTlsSpec.

Modifications:

  • Added RequestOptions#clientTlsSpec, ClientRequestContext#setClientTlsSpec to allow users to specify ClientTlsSpec
  • HttpClientDelegate sets tlsCustomizer, alpnProtocols before finalizing the ClientTlsSpec

Result:

  • Users can specify ClientTlsSpec for each request using RequestOptions#clientTlsSpec or ClientRequestContext#setClientTlsSpec

@jrhee17 jrhee17 added this to the 1.35.0 milestone Dec 17, 2025
@coderabbitai

coderabbitai Bot commented Dec 17, 2025

Copy link
Copy Markdown
Contributor

Walkthrough

Adds per-request TLS configuration (ClientTlsSpec): new APIs on request options, builders, and preparation classes; stored and propagated in ClientRequestContext and DefaultClientRequestContext; HttpClientDelegate now consults the context for a per-request TLS override; comprehensive integration tests added.

Changes

Cohort / File(s) Change Summary
Request Options Interface & Builder
core/src/main/java/com/linecorp/armeria/client/RequestOptions.java, core/src/main/java/com/linecorp/armeria/client/RequestOptionsSetters.java, core/src/main/java/com/linecorp/armeria/client/RequestOptionsBuilder.java, core/src/main/java/com/linecorp/armeria/client/DefaultRequestOptions.java
Added clientTlsSpec() accessor and clientTlsSpec(ClientTlsSpec) builder/setter; stored clientTlsSpec in DefaultRequestOptions and builder; updated constructor, equals, hashCode, toString; annotated @UnstableApi.
Client Request Context & Wrapper & Implementation
core/src/main/java/com/linecorp/armeria/client/ClientRequestContext.java, core/src/main/java/com/linecorp/armeria/client/ClientRequestContextWrapper.java, core/src/main/java/com/linecorp/armeria/internal/client/DefaultClientRequestContext.java
Added clientTlsSpec() getter and setClientTlsSpec(ClientTlsSpec) setter to context API and wrapper; DefaultClientRequestContext stores, initializes from RequestOptions, and preserves clientTlsSpec across derived/replicated contexts.
Request Preparation (fluent APIs)
core/src/main/java/com/linecorp/armeria/client/WebClientRequestPreparation.java, core/src/main/java/com/linecorp/armeria/client/BlockingWebClientRequestPreparation.java, core/src/main/java/com/linecorp/armeria/client/RestClientPreparation.java, core/src/main/java/com/linecorp/armeria/client/FutureTransformingRequestPreparation.java, core/src/main/java/com/linecorp/armeria/client/TransformingRequestPreparation.java, scala/scala_2.13/src/main/scala/com/linecorp/armeria/client/scala/ScalaRestClientPreparation.scala
Added clientTlsSpec(ClientTlsSpec) fluent methods that delegate to requestOptionsBuilder or underlying delegate and return this (annotated @UnstableApi). Minor import adjustments in Scala file.
TLS Resolution / Connection Logic
core/src/main/java/com/linecorp/armeria/client/HttpClientDelegate.java
determineTlsSpec now consults ClientRequestContext for a per-request ClientTlsSpec; if present, uses it (adjusting ALPN to the session protocol); otherwise falls back to existing provider-based TLS spec construction.
Tests
core/src/test/java/com/linecorp/armeria/common/tls/TlsSpecPerRequestTest.java, core/src/test/java/com/linecorp/armeria/client/RequestOptionsTest.java
Added comprehensive per-request TLS integration tests (mTLS scenarios, verifier factories, ALPN, context propagation, pooling) and unit test asserting RequestOptions copy preserves ClientTlsSpec.

Sequence Diagram(s)

sequenceDiagram
    participant Client
    participant Prep as RequestPreparation
    participant ReqOpts as RequestOptions
    participant ReqCtx as ClientRequestContext
    participant HttpDel as HttpClientDelegate
    participant TLSProv as TLSProvider

    Client->>Prep: call clientTlsSpec(spec)
    Prep->>ReqOpts: requestOptionsBuilder.clientTlsSpec(spec)
    ReqOpts->>ReqOpts: store clientTlsSpec

    Client->>Prep: execute request
    Prep->>ReqCtx: create/init context from RequestOptions
    ReqCtx->>ReqCtx: setClientTlsSpec(from options)

    HttpDel->>ReqCtx: clientTlsSpec()
    alt per-request spec present
        ReqCtx-->>HttpDel: return spec
        HttpDel->>HttpDel: set ALPN to session protocol
        HttpDel->>TLSProv: use provided ClientTlsSpec to establish connection
    else no per-request spec
        ReqCtx-->>HttpDel: null
        HttpDel->>TLSProv: build default spec (hostname/SNI, ALPN)
    end

    TLSProv-->>HttpDel: resolved TLS configuration
    HttpDel->>TLSProv: establish TLS connection
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

  • Files/areas needing extra attention:
    • HttpClientDelegate.determineTlsSpec(): null-safety, ALPN assignment, interactions with SNI/hostname logic.
    • DefaultRequestOptions equals/hashCode/toString changes for immutability and correctness.
    • DefaultClientRequestContext propagation/replication to ensure clientTlsSpec preserved in all derived contexts.
    • TlsSpecPerRequestTest: large integration test—verify certificate fixtures, lifecycle, and flakiness risks.

Possibly related PRs

Suggested reviewers

  • trustin
  • ikhoon
  • minwoox

Poem

🐰 I tucked a spec in every hop,

From prep to context, none will stop;
ALPN set, the handshake sings,
Per-request care with tiny springs —
Hop secure, hop quick, hop top! 🐇

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 15.87% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title directly describes the main change: allowing users to set ClientTlsSpec in RequestOptions, which aligns with the core modifications across all affected files.
Description check ✅ Passed The description clearly explains the motivation, modifications, and expected result. It details the new API methods and their usage, relating directly to the changeset.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

📜 Recent review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 0940ead and f4a89b8.

📒 Files selected for processing (2)
  • core/src/main/java/com/linecorp/armeria/client/RequestOptionsBuilder.java (4 hunks)
  • core/src/test/java/com/linecorp/armeria/client/RequestOptionsTest.java (2 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
**/*.java

⚙️ CodeRabbit configuration file

**/*.java: - The primary coding conventions and style guide for this project are defined in site/src/pages/community/developer-guide.mdx. Please strictly adhere to this file as the ultimate source of truth for all style and convention-related feedback.

2. Specific check for @UnstableApi

  • Review all newly added public classes and methods to ensure they have the @UnstableApi annotation.
  • However, this annotation is NOT required under the following conditions:
    • If the class or method is located in a package containing .internal or .testing.
    • If the class or method is located in a test source set.
    • If a public method is part of a class that is already annotated with @UnstableApi.

Files:

  • core/src/main/java/com/linecorp/armeria/client/RequestOptionsBuilder.java
  • core/src/test/java/com/linecorp/armeria/client/RequestOptionsTest.java
🧬 Code graph analysis (1)
core/src/test/java/com/linecorp/armeria/client/RequestOptionsTest.java (1)
scala/scala_2.13/src/main/scala/com/linecorp/armeria/client/scala/ScalaRestClientPreparation.scala (6)
  • responseTimeoutMillis (114-117)
  • writeTimeoutMillis (124-127)
  • maxResponseLength (129-132)
  • requestAutoAbortDelayMillis (139-142)
  • attr (144-147)
  • clientTlsSpec (267-270)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (14)
  • GitHub Check: build-ubicloud-standard-16-jdk-21-snapshot-blockhound
  • GitHub Check: build-ubicloud-standard-16-jdk-8
  • GitHub Check: build-ubicloud-standard-16-jdk-17-min-java-11
  • GitHub Check: build-ubicloud-standard-16-jdk-17-min-java-17-coverage
  • GitHub Check: build-ubicloud-standard-16-jdk-25
  • GitHub Check: build-macos-latest-jdk-25
  • GitHub Check: build-windows-latest-jdk-25
  • GitHub Check: build-ubicloud-standard-16-jdk-17-leak
  • GitHub Check: build-ubicloud-standard-16-jdk-11
  • GitHub Check: lint
  • GitHub Check: flaky-tests
  • GitHub Check: site
  • GitHub Check: Kubernetes Chaos test
  • GitHub Check: Summary
🔇 Additional comments (6)
core/src/test/java/com/linecorp/armeria/client/RequestOptionsTest.java (1)

234-256: LGTM! Test correctly verifies clientTlsSpec preservation during copy.

The test appropriately verifies that when RequestOptions is copied via RequestOptions.builder(requestOptions1), the clientTlsSpec reference is preserved. Using isSameAs for reference equality is the correct approach, and the test follows the existing pattern for other properties.

core/src/main/java/com/linecorp/armeria/client/RequestOptionsBuilder.java (5)

52-53: LGTM! Field declaration follows the established pattern.

The nullable clientTlsSpec field is properly annotated and positioned consistently with other optional configuration fields.


67-67: LGTM! Proper field initialization from existing options.

The clientTlsSpec is correctly copied during builder initialization, maintaining consistency with other optional fields.


152-157: LGTM! Builder method correctly implemented.

The method follows the established builder pattern with appropriate annotations:

  • @UnstableApi correctly applied for new public API (per coding guidelines)
  • @Override indicates proper interface implementation
  • requireNonNull validation ensures type safety
  • Fluent API pattern maintained by returning this

165-165: LGTM! EMPTY singleton optimization correctly updated.

The condition properly includes clientTlsSpec == null to ensure the shared EMPTY instance is only returned when all options are at default values.


174-178: Constructor signature matches correctly.

The clientTlsSpec parameter is properly passed to the DefaultRequestOptions constructor as the final argument, with all other fields in correct order.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@codecov

codecov Bot commented Dec 17, 2025

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 60.60606% with 13 lines in your changes missing coverage. Please review.
✅ Project coverage is 74.25%. Comparing base (8150425) to head (f4a89b8).
⚠️ Report is 296 commits behind head on main.

Files with missing lines Patch % Lines
...rp/armeria/client/ClientRequestContextWrapper.java 0.00% 3 Missing ⚠️
...linecorp/armeria/client/DefaultRequestOptions.java 66.66% 2 Missing ⚠️
...a/client/FutureTransformingRequestPreparation.java 0.00% 2 Missing ⚠️
...linecorp/armeria/client/RestClientPreparation.java 0.00% 2 Missing ⚠️
...armeria/client/TransformingRequestPreparation.java 0.00% 2 Missing ⚠️
...eria/client/scala/ScalaRestClientPreparation.scala 0.00% 2 Missing ⚠️
Additional details and impacted files
@@             Coverage Diff              @@
##               main    #6551      +/-   ##
============================================
- Coverage     74.46%   74.25%   -0.21%     
- Complexity    22234    23548    +1314     
============================================
  Files          1963     2116     +153     
  Lines         82437    88274    +5837     
  Branches      10764    11571     +807     
============================================
+ Hits          61385    65550    +4165     
- Misses        15918    17206    +1288     
- Partials       5134     5518     +384     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@jrhee17
jrhee17 marked this pull request as ready for review December 18, 2025 02:51

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
core/src/main/java/com/linecorp/armeria/client/RequestOptionsBuilder.java (1)

55-68: Missing clientTlsSpec initialization from input RequestOptions.

The constructor copies all fields from the input RequestOptions (e.g., responseTimeoutMillis, exchangeType, responseTimeoutMode), but clientTlsSpec is not copied. This will cause the TLS spec to be lost when creating a builder from existing options.

🔎 Apply this diff to copy clientTlsSpec:
     RequestOptionsBuilder(@Nullable RequestOptions options) {
         if (options != null) {
             responseTimeoutMillis = options.responseTimeoutMillis();
             writeTimeoutMillis = options.writeTimeoutMillis();
             maxResponseLength = options.maxResponseLength();
             requestAutoAbortDelayMillis = options.requestAutoAbortDelayMillis();
             final Map<AttributeKey<?>, Object> attrs = options.attrs();
             if (!attrs.isEmpty()) {
                 attributes = new HashMap<>(attrs);
             }
             exchangeType = options.exchangeType();
             responseTimeoutMode = options.responseTimeoutMode();
+            clientTlsSpec = options.clientTlsSpec();
         }
     }
📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between c6e6154 and 3fb11ef.

📒 Files selected for processing (15)
  • core/src/main/java/com/linecorp/armeria/client/BlockingWebClientRequestPreparation.java (1 hunks)
  • core/src/main/java/com/linecorp/armeria/client/ClientRequestContext.java (1 hunks)
  • core/src/main/java/com/linecorp/armeria/client/ClientRequestContextWrapper.java (2 hunks)
  • core/src/main/java/com/linecorp/armeria/client/DefaultRequestOptions.java (5 hunks)
  • core/src/main/java/com/linecorp/armeria/client/FutureTransformingRequestPreparation.java (1 hunks)
  • core/src/main/java/com/linecorp/armeria/client/HttpClientDelegate.java (2 hunks)
  • core/src/main/java/com/linecorp/armeria/client/RequestOptions.java (1 hunks)
  • core/src/main/java/com/linecorp/armeria/client/RequestOptionsBuilder.java (3 hunks)
  • core/src/main/java/com/linecorp/armeria/client/RequestOptionsSetters.java (1 hunks)
  • core/src/main/java/com/linecorp/armeria/client/RestClientPreparation.java (1 hunks)
  • core/src/main/java/com/linecorp/armeria/client/TransformingRequestPreparation.java (1 hunks)
  • core/src/main/java/com/linecorp/armeria/client/WebClientRequestPreparation.java (1 hunks)
  • core/src/main/java/com/linecorp/armeria/internal/client/DefaultClientRequestContext.java (4 hunks)
  • core/src/test/java/com/linecorp/armeria/common/tls/TlsSpecPerRequestTest.java (1 hunks)
  • scala/scala_2.13/src/main/scala/com/linecorp/armeria/client/scala/ScalaRestClientPreparation.scala (2 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
**/*.java

⚙️ CodeRabbit configuration file

**/*.java: - The primary coding conventions and style guide for this project are defined in site/src/pages/community/developer-guide.mdx. Please strictly adhere to this file as the ultimate source of truth for all style and convention-related feedback.

2. Specific check for @UnstableApi

  • Review all newly added public classes and methods to ensure they have the @UnstableApi annotation.
  • However, this annotation is NOT required under the following conditions:
    • If the class or method is located in a package containing .internal or .testing.
    • If the class or method is located in a test source set.
    • If a public method is part of a class that is already annotated with @UnstableApi.

Files:

  • core/src/main/java/com/linecorp/armeria/client/RequestOptions.java
  • core/src/main/java/com/linecorp/armeria/client/ClientRequestContext.java
  • core/src/main/java/com/linecorp/armeria/client/ClientRequestContextWrapper.java
  • core/src/main/java/com/linecorp/armeria/client/RequestOptionsSetters.java
  • core/src/main/java/com/linecorp/armeria/client/RequestOptionsBuilder.java
  • core/src/main/java/com/linecorp/armeria/client/TransformingRequestPreparation.java
  • core/src/main/java/com/linecorp/armeria/client/RestClientPreparation.java
  • core/src/main/java/com/linecorp/armeria/client/WebClientRequestPreparation.java
  • core/src/main/java/com/linecorp/armeria/internal/client/DefaultClientRequestContext.java
  • core/src/main/java/com/linecorp/armeria/client/FutureTransformingRequestPreparation.java
  • core/src/test/java/com/linecorp/armeria/common/tls/TlsSpecPerRequestTest.java
  • core/src/main/java/com/linecorp/armeria/client/DefaultRequestOptions.java
  • core/src/main/java/com/linecorp/armeria/client/BlockingWebClientRequestPreparation.java
  • core/src/main/java/com/linecorp/armeria/client/HttpClientDelegate.java
🧬 Code graph analysis (5)
core/src/main/java/com/linecorp/armeria/client/ClientRequestContext.java (6)
core/src/main/java/com/linecorp/armeria/client/BlockingWebClientRequestPreparation.java (1)
  • UnstableApi (55-596)
core/src/main/java/com/linecorp/armeria/client/FutureTransformingRequestPreparation.java (1)
  • UnstableApi (51-433)
core/src/main/java/com/linecorp/armeria/client/RestClientPreparation.java (1)
  • UnstableApi (50-329)
core/src/main/java/com/linecorp/armeria/client/TransformingRequestPreparation.java (1)
  • UnstableApi (46-357)
core/src/main/java/com/linecorp/armeria/client/ClientPreprocessorsBuilder.java (1)
  • UnstableApi (29-73)
scala/scala_2.13/src/main/scala/com/linecorp/armeria/client/scala/ScalaRestClientPreparation.scala (1)
  • clientTlsSpec (267-270)
core/src/main/java/com/linecorp/armeria/client/ClientRequestContextWrapper.java (4)
core/src/main/java/com/linecorp/armeria/client/BlockingWebClientRequestPreparation.java (1)
  • UnstableApi (55-596)
core/src/main/java/com/linecorp/armeria/client/FutureTransformingRequestPreparation.java (1)
  • UnstableApi (51-433)
core/src/main/java/com/linecorp/armeria/client/RestClientPreparation.java (1)
  • UnstableApi (50-329)
core/src/main/java/com/linecorp/armeria/client/TransformingRequestPreparation.java (1)
  • UnstableApi (46-357)
core/src/main/java/com/linecorp/armeria/client/FutureTransformingRequestPreparation.java (2)
core/src/main/java/com/linecorp/armeria/client/RestClientPreparation.java (1)
  • UnstableApi (50-329)
core/src/main/java/com/linecorp/armeria/client/TransformingRequestPreparation.java (1)
  • UnstableApi (46-357)
scala/scala_2.13/src/main/scala/com/linecorp/armeria/client/scala/ScalaRestClientPreparation.scala (1)
core/src/main/java/com/linecorp/armeria/client/RestClientPreparation.java (1)
  • UnstableApi (50-329)
core/src/main/java/com/linecorp/armeria/client/DefaultRequestOptions.java (3)
core/src/main/java/com/linecorp/armeria/client/FutureTransformingRequestPreparation.java (1)
  • UnstableApi (51-433)
core/src/main/java/com/linecorp/armeria/client/RestClientPreparation.java (1)
  • UnstableApi (50-329)
core/src/main/java/com/linecorp/armeria/client/TransformingRequestPreparation.java (1)
  • UnstableApi (46-357)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Summary
🔇 Additional comments (12)
core/src/test/java/com/linecorp/armeria/common/tls/TlsSpecPerRequestTest.java (1)

1-376: LGTM!

Comprehensive test coverage for the new per-request TLS configuration feature. The tests cover:

  • Successful mTLS configuration
  • Certificate trust failures
  • Custom verifiers (noVerify, always-throwing, delegating)
  • Verifier chaining and invocation order
  • ALPN protocol override behavior
  • Context-based TLS spec mutation
  • Connection pool keying with different TLS specs

The test structure is clean and the helper classes are appropriately scoped as private.

core/src/main/java/com/linecorp/armeria/client/RequestOptions.java (1)

125-131: LGTM!

The new clientTlsSpec() method is correctly added to the RequestOptions interface with proper annotations (@UnstableApi, @Nullable) and documentation. This aligns with the existing patterns in the interface (e.g., responseTimeoutMode()).

core/src/main/java/com/linecorp/armeria/client/RequestOptionsSetters.java (1)

168-175: LGTM!

The new clientTlsSpec method follows the established pattern of other setters in this interface. The @UnstableApi annotation is consistent with similar methods like exchangeType, and the Javadoc clearly explains the fallback behavior.

core/src/main/java/com/linecorp/armeria/client/HttpClientDelegate.java (1)

268-273: LGTM!

The per-request TLS spec override logic is correctly implemented. The code properly prioritizes the request-level clientTlsSpec over factory defaults, and correctly sets ALPN protocols based on the session protocol. This aligns with the PR objectives that state alpnProtocols should be "set based on the SessionProtocol".

scala/scala_2.13/src/main/scala/com/linecorp/armeria/client/scala/ScalaRestClientPreparation.scala (1)

266-270: LGTM!

The new clientTlsSpec override follows the established delegation pattern used by all other methods in this class. Since the class itself is annotated with @UnstableApi, no additional annotation is required on this method. As per coding guidelines, @UnstableApi is not required when the class is already annotated.

core/src/main/java/com/linecorp/armeria/client/RestClientPreparation.java (1)

322-328: LGTM!

The new clientTlsSpec method correctly delegates to the underlying WebClientRequestPreparation and returns this for method chaining. The pattern is consistent with all other setter methods in this class.

core/src/main/java/com/linecorp/armeria/internal/client/DefaultClientRequestContext.java (1)

185-186: Field initialization looks correct.

The clientTlsSpec field is properly declared as @Nullable and initialized from requestOptions.clientTlsSpec() during construction, which aligns with how other request options are handled.

Also applies to: 287-287

core/src/main/java/com/linecorp/armeria/client/WebClientRequestPreparation.java (1)

406-411: LGTM!

The new clientTlsSpec method correctly delegates to the RequestOptionsBuilder and follows the same pattern as other request option setters in this class. The @UnstableApi annotation is appropriately present since WebClientRequestPreparation is not itself annotated with @UnstableApi. As per coding guidelines, new public methods in non-annotated classes require this annotation.

core/src/main/java/com/linecorp/armeria/client/RequestOptionsBuilder.java (1)

151-156: LGTM!

The clientTlsSpec method correctly validates input with requireNonNull, is properly annotated with @UnstableApi, and follows the builder pattern consistently with other setters in this class.

core/src/main/java/com/linecorp/armeria/client/BlockingWebClientRequestPreparation.java (1)

341-346: LGTM!

The clientTlsSpec method correctly follows the established delegation pattern used throughout this class, with proper @UnstableApi annotation for API stability signaling.

core/src/main/java/com/linecorp/armeria/client/DefaultRequestOptions.java (2)

103-107: LGTM!

The clientTlsSpec accessor is properly annotated with @UnstableApi and follows the same pattern as other nullable getters in this class.


126-127: LGTM!

The equals() method correctly uses Objects.equals() for the nullable clientTlsSpec field, which properly handles null comparisons.

@minwoox minwoox left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 👍 👍

@ikhoon ikhoon left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍👍

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants