CoreNetwork HTTP 인프라 추가 - #9
Conversation
|
Warning Review limit reached
Next review available in: 23 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (8)
📝 WalkthroughSummary by CodeRabbit
WalkthroughCoreNetwork에 네트워크 요청 계약과 ChangesCoreNetwork 네트워크 기능
Estimated code review effort: 4 (Complex) | ~45 minutes Sequence Diagram(s)sequenceDiagram
participant Caller
participant DefaultNetworkClient
participant TokenProviding
participant TokenRefreshing
participant URLSession
participant SharedLogger
Caller->>DefaultNetworkClient: request(endpoint)
DefaultNetworkClient->>TokenProviding: accessToken()
DefaultNetworkClient->>URLSession: send URLRequest
URLSession-->>DefaultNetworkClient: 401 response
DefaultNetworkClient->>TokenRefreshing: refresh()
TokenRefreshing-->>DefaultNetworkClient: refreshed token state
DefaultNetworkClient->>TokenProviding: accessToken()
DefaultNetworkClient->>URLSession: retry request once
URLSession-->>DefaultNetworkClient: success response
DefaultNetworkClient->>SharedLogger: log request and response
DefaultNetworkClient-->>Caller: decoded result
Possibly related PRs
Suggested labels: 🚥 Pre-merge checks | ✅ 4✅ Passed checks (4 passed)
Comment |
There was a problem hiding this comment.
Actionable comments posted: 5
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@Projects/Core/Network/Sources/Client/DefaultNetworkClient.swift`:
- Around line 185-200: Update mapStatusCode so unrecognized 4xx status codes are
returned as a client-error NetworkError rather than serverError; keep 5xx and
other statuses mapped to serverError. Add mapping coverage for an unregistered
4xx code such as 405, 422, or 429.
- Around line 22-46: Move the live dependency composition out of
DefaultNetworkClient.plain and DefaultNetworkClient.authed into the App layer.
Keep CoreNetwork focused on the network implementation, with URLSession,
TokenProviding, and TokenRefreshing supplied by App-level composition rather
than selected or assembled by these factories, including the URLSession.shared
default.
- Around line 98-101: Update send and refreshSingleFlight to capture the
access-token generation used by each request and compare it with the current
generation when handling a 401. If the token has already changed, retry the
request without starting another refresh; only refresh when the request used the
current token and allowRefresh is enabled. Add a concurrency test covering
delayed 401 responses arriving after the shared refreshTask has been removed,
asserting that only one refresh occurs.
- Around line 169-173: Update the authenticated request flow in
DefaultNetworkClient around tokenProvider.accessToken() to validate the final
request URL’s scheme before setting the Authorization header; reject any
non-HTTPS URL with NetworkError.invalidURL, while preserving unauthenticated
request behavior. Add coverage for an HTTP baseURL with a token provider and
verify the request is rejected.
In `@Projects/Core/Network/Sources/Logging/NetworkLog.swift`:
- Around line 5-16: NetworkLog의 request, response, error 로깅 경로에서
URL.absoluteString 대신 query와 fragment를 제거한 URL을 사용하도록 공통 정규화 로직을 추가하고 적용하세요.
request 경로의 redact(_:)에만 의존하지 말고 모든 메시지에 동일한 정제된 URL을 반영하며, accessToken=secret
같은 값이 로그에 남지 않는 테스트를 추가하세요.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro Plus
Run ID: 908035e3-8f71-4582-802c-9ccae9042826
📒 Files selected for processing (21)
Projects/Core/Network/Project.swiftProjects/Core/Network/Sources/Auth/TokenProviding.swiftProjects/Core/Network/Sources/Auth/TokenRefreshing.swiftProjects/Core/Network/Sources/Client/DefaultNetworkClient.swiftProjects/Core/Network/Sources/Client/NetworkClient.swiftProjects/Core/Network/Sources/Config/NetworkConfiguration.swiftProjects/Core/Network/Sources/Config/NetworkJSONCoding.swiftProjects/Core/Network/Sources/Endpoint/APIEndpoint.swiftProjects/Core/Network/Sources/Endpoint/HTTPMethod.swiftProjects/Core/Network/Sources/Error/ErrorMessageDTO.swiftProjects/Core/Network/Sources/Error/NetworkError.swiftProjects/Core/Network/Sources/Logging/NetworkLog.swiftProjects/Core/Network/Sources/Placeholder.swiftProjects/Core/Network/Tests/DefaultNetworkClientTests.swiftProjects/Core/Network/Tests/NetworkErrorMappingTests.swiftProjects/Core/Network/Tests/Support/TestEndpoint.swiftProjects/Core/Network/Tests/Support/TokenStubs.swiftProjects/Core/Network/Tests/Support/URLProtocolStub.swiftProjects/Core/Network/Tests/URLRequestBuildingTests.swiftdocs/ARCHITECTURE.mddocs/CONVENTIONS.md
💤 Files with no reviewable changes (1)
- Projects/Core/Network/Sources/Placeholder.swift
There was a problem hiding this comment.
🧹 Nitpick comments (1)
Projects/Core/Network/Tests/Support/TokenStubs.swift (1)
29-33: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win갱신 후 토큰을 사용하는 재시도를 검증하세요.
refresh()는 refresh 횟수, 지연, 오류만 처리합니다.DefaultNetworkClientTests.swiftLine 99-136 및 Line 138-186의 401 응답 핸들러는 요청 헤더를 확인하지 않습니다. 따라서 오래된Authorization헤더로 재시도해도 테스트가 통과할 수 있습니다.
StubTokenRefresher와StubTokenProvider를 연결하거나, 첫 요청과 재시도 요청의 Authorization 값을 각각 기존 토큰과 갱신 토큰으로 검증하세요.TokenProviding과TokenRefreshing계약도 함께 확인하세요.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Projects/Core/Network/Tests/Support/TokenStubs.swift` around lines 29 - 33, Update StubTokenRefresher and StubTokenProvider usage in DefaultNetworkClientTests so the 401 retry path verifies Authorization headers: assert the first request uses the existing token and the retry uses the refreshed token. Ensure the stubs remain connected through the TokenProviding and TokenRefreshing contracts while preserving the existing refresh-count, delay, and error assertions.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Nitpick comments:
In `@Projects/Core/Network/Tests/Support/TokenStubs.swift`:
- Around line 29-33: Update StubTokenRefresher and StubTokenProvider usage in
DefaultNetworkClientTests so the 401 retry path verifies Authorization headers:
assert the first request uses the existing token and the retry uses the
refreshed token. Ensure the stubs remain connected through the TokenProviding
and TokenRefreshing contracts while preserving the existing refresh-count,
delay, and error assertions.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro Plus
Run ID: cfff210b-0509-4675-b23e-a9c85f24bce7
📒 Files selected for processing (4)
Projects/Core/Network/Sources/Client/DefaultNetworkClient.swiftProjects/Core/Network/Tests/DefaultNetworkClientTests.swiftProjects/Core/Network/Tests/Support/TokenStubs.swiftProjects/Core/Network/Tests/Support/URLProtocolStub.swift
🚧 Files skipped from review as they are similar to previous changes (3)
- Projects/Core/Network/Tests/DefaultNetworkClientTests.swift
- Projects/Core/Network/Tests/Support/URLProtocolStub.swift
- Projects/Core/Network/Sources/Client/DefaultNetworkClient.swift
📌 변경 요약
📌 변경 내용
Tuist / CoreNetwork
CoreNetwork API
APIEndpoint,HTTPMethod요청 계약 추가NetworkError모델 추가NetworkConfiguration, JSON coding 기본값 추가TokenProviding,TokenRefreshing포트 추가Client
NetworkClient계약 추가DefaultNetworkClientplain/authed factory 추가Decodable요청 경로 구현Tests
Docs