initial commit
This commit is contained in:
commit
8de962eeb8
44 changed files with 4843 additions and 0 deletions
68
APIConfiguration.swift
Normal file
68
APIConfiguration.swift
Normal file
|
|
@ -0,0 +1,68 @@
|
|||
import Foundation
|
||||
|
||||
/// Connection configuration for the MCMS REST API.
|
||||
///
|
||||
/// This is intentionally URL-driven so the same build works whether you hit the
|
||||
/// PON Controller **directly** or through a **reverse proxy** — the only thing
|
||||
/// that changes is `baseURL` (and possibly `refererOverride` / cookie names).
|
||||
///
|
||||
/// Direct example: `https://10.2.10.29/api`
|
||||
/// Proxy example: `https://mcms.internal.example.com` (proxy forwards to /api)
|
||||
///
|
||||
/// NOTE: confirm the exact prefix (`/api/v1` vs `/v1`) against the shipped
|
||||
/// `openapi.json` before shipping. `apiVersion` is applied per-request by the
|
||||
/// endpoint builder, so it is kept separate from `baseURL`.
|
||||
struct APIConfiguration: Equatable, Codable {
|
||||
|
||||
/// Scheme + host (+ optional port) + any fixed path prefix, WITHOUT the
|
||||
/// version segment. e.g. `https://10.2.10.29/api`
|
||||
var baseURL: URL
|
||||
|
||||
/// API version segment inserted after `baseURL`. Endpoints are versioned
|
||||
/// independently; default to v1 and override per-call where needed.
|
||||
var apiVersion: String = "v1"
|
||||
|
||||
/// The MCMS database to select for the session (optional). When non-nil the
|
||||
/// client issues `PUT /v{n}/databases/selection/` after login.
|
||||
var databaseId: String?
|
||||
|
||||
/// Value sent in the `Referer` header. The API uses this to identify the
|
||||
/// calling client. Defaults to `baseURL` when nil. Behind a proxy you may
|
||||
/// need to set this to the proxy's public origin.
|
||||
var refererOverride: String?
|
||||
|
||||
/// Cookie names returned by the server on login. These match a standard
|
||||
/// Django/DRF backend, which is what the CSRF + `Referer` requirements
|
||||
/// imply — but verify against a real login response and override if needed.
|
||||
var sessionCookieName: String = "sessionid"
|
||||
var csrfCookieName: String = "csrftoken"
|
||||
|
||||
/// How to treat the server's TLS certificate. These boxes typically present
|
||||
/// a self-signed / internal-CA cert. See `ServerTrustEvaluator`.
|
||||
var trustPolicy: ServerTrustPolicy = .system
|
||||
|
||||
/// Request timeout (seconds).
|
||||
var timeout: TimeInterval = 30
|
||||
|
||||
init(
|
||||
baseURL: URL,
|
||||
apiVersion: String = "v1",
|
||||
databaseId: String? = nil,
|
||||
refererOverride: String? = nil,
|
||||
trustPolicy: ServerTrustPolicy = .system
|
||||
) {
|
||||
self.baseURL = baseURL
|
||||
self.apiVersion = apiVersion
|
||||
self.databaseId = databaseId
|
||||
self.refererOverride = refererOverride
|
||||
self.trustPolicy = trustPolicy
|
||||
}
|
||||
|
||||
/// The value to send in the `Referer` header.
|
||||
var refererValue: String {
|
||||
refererOverride ?? baseURL.absoluteString
|
||||
}
|
||||
|
||||
/// Host used for trust pinning / cookie scoping.
|
||||
var host: String { baseURL.host ?? "" }
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue