use std::pin::Pin;
use std::sync::atomic::{AtomicBool, AtomicU64, Ordering};
use std::sync::Arc;
use std::task::{Context, Poll};
use axum::body::Body;
use axum::extract::{Request, State};
use axum::http::header::{
ACCEPT_ENCODING, CONNECTION, CONTENT_LENGTH, HOST, PROXY_AUTHENTICATE, PROXY_AUTHORIZATION, TE,
TRAILER, TRANSFER_ENCODING, UPGRADE,
};
use axum::http::{request::Parts, HeaderMap, HeaderValue, Method, StatusCode};
use axum::response::Response;
use axum::Json;
use bytes::Bytes;
use futures_core::Stream;
use tokio::sync::mpsc::Sender;
use tokio::sync::OwnedSemaphorePermit;
use crate::cloud::CloudEvent;
use crate::privacy::PrivacyFilter;
use super::billing::detect_billing;
use super::capture::{self, CaptureGap, CostBasis, Usage, UsageAccumulator};
use super::emit::{self, Observation};
use super::preflight::PREFLIGHT_HEADER;
use super::session::resolve_session;
use super::tokenize::{classify_model, Estimator};
use super::{BoundaryState, MAX_MATERIALIZE_BYTES};
const INSTALL_ID_HEADER: &str = "x-openlatch-install-id";
static PASS_THROUGH_FAILURES: AtomicU64 = AtomicU64::new(0);
static UPSTREAM_FAILURES: AtomicU64 = AtomicU64::new(0);
static INJECT_OBSERVE_PANIC: AtomicBool = AtomicBool::new(false);
#[cfg(test)]
static INJECT_SCAN_PANIC: AtomicBool = AtomicBool::new(false);
pub fn pass_through_failures() -> u64 {
PASS_THROUGH_FAILURES.load(Ordering::Relaxed)
}
pub fn upstream_failures() -> u64 {
UPSTREAM_FAILURES.load(Ordering::Relaxed)
}
pub fn set_inject_observe_panic(on: bool) {
INJECT_OBSERVE_PANIC.store(on, Ordering::Relaxed);
}
#[cfg(test)]
pub fn set_inject_scan_panic(on: bool) {
INJECT_SCAN_PANIC.store(on, Ordering::Relaxed);
}
fn record_pass_through_failure(reason: &'static str) {
PASS_THROUGH_FAILURES.fetch_add(1, Ordering::Relaxed);
tracing::warn!(
reason,
"boundary pass-through failure — forwarding unmodified"
);
}
fn observe_request(st: &BoundaryState, headers: &HeaderMap, bytes: &Bytes) -> Observation {
if INJECT_OBSERVE_PANIC.load(Ordering::Relaxed) {
panic!("injected observe panic (D-24 bench)");
}
let occurred_at = crate::envelope::current_timestamp();
let event_id = uuid::Uuid::now_v7().to_string();
let body: serde_json::Value = serde_json::from_slice(bytes).unwrap_or(serde_json::Value::Null);
let model = capture::model_of(&body);
let model_known = model
.as_deref()
.map(|m| classify_model(m).is_some())
.unwrap_or(false);
let billing = detect_billing(headers);
let pricing = capture::derive_pricing_inputs(&body, headers);
let install_id = headers
.get(INSTALL_ID_HEADER)
.and_then(|v| v.to_str().ok())
.map(str::to_string)
.unwrap_or_default();
let session = resolve_session(&st.registry, &install_id);
let session_key = session.session_id.clone().unwrap_or_default();
let churn = st.churn.observe(&install_id, &session_key, bytes);
if let Some(f) = &churn {
retention_store(f, &occurred_at);
}
let resident = st.resident_request_rules();
let authored: &[crate::generated::types::PolicyRule] = resident
.as_ref()
.and_then(|guard| guard.as_ref().as_ref())
.map(|bundle| bundle.request_rules.as_slice())
.unwrap_or(&[]);
let transform = super::transforms::evaluate_would_have_with(&body, authored);
Observation {
measured: true,
event_id,
occurred_at,
model,
model_known,
billing,
install_id,
session,
pricing,
churn,
request_body_len: bytes.len(),
has_breakpoint: capture::has_cache_breakpoint(bytes),
transform,
}
}
fn retention_store(f: &super::churn::ChurnFinding, occurred_at: &str) {
super::retention::store(&super::retention::FindingRecord {
finding_id: f.finding_id.clone(),
captured_at: occurred_at.to_string(),
churn_layer: f.churn_layer.as_str().to_string(),
churn_class: f.churn_class.as_str().to_string(),
divergence_offset: f.divergence_offset,
churn_byte_len: f.churn_byte_len,
churn_block_index: f.churn_block_index,
block: f.block.clone(),
});
}
fn observe_request_metadata_only(st: &BoundaryState, headers: &HeaderMap) -> Observation {
let install_id = headers
.get(INSTALL_ID_HEADER)
.and_then(|v| v.to_str().ok())
.map(str::to_string)
.unwrap_or_default();
Observation {
measured: true,
event_id: uuid::Uuid::now_v7().to_string(),
occurred_at: crate::envelope::current_timestamp(),
billing: detect_billing(headers),
session: resolve_session(&st.registry, &install_id),
install_id,
..Observation::none()
}
}
fn is_preflight(headers: &HeaderMap) -> bool {
headers.contains_key(PREFLIGHT_HEADER)
}
fn opaque_measure_ctx(st: &Arc<BoundaryState>, headers: &HeaderMap) -> Option<MeasureCtx> {
if is_preflight(headers) {
return None;
}
st.cloud_tx.as_ref().map(|_| MeasureCtx {
obs: observe_request_metadata_only(st, headers),
tokenizer: st.tokenizer,
cloud_tx: st.cloud_tx.clone(),
privacy: st.privacy.clone(),
wire_format_unknown: true,
})
}
pub async fn proxy_any(State(st): State<Arc<BoundaryState>>, req: Request) -> Response {
let (parts, body) = req.into_parts();
let is_messages = parts.method == Method::POST && parts.uri.path() == "/v1/messages";
if !is_messages {
return stream_through_opaque(&st, parts, body, None).await;
}
let len = content_length(&parts.headers);
if len.is_none_or(|n| n > MAX_MATERIALIZE_BYTES) {
let ctx = opaque_measure_ctx(&st, &parts.headers);
return stream_through_opaque(&st, parts, body, ctx).await;
}
let permit = match st.inflight.clone().try_acquire_owned() {
Ok(p) => p,
Err(_) => {
let ctx = opaque_measure_ctx(&st, &parts.headers);
return stream_through_opaque(&st, parts, body, ctx).await;
}
};
let bytes = match axum::body::to_bytes(body, MAX_MATERIALIZE_BYTES).await {
Ok(b) => b,
Err(_) => {
record_pass_through_failure("body_read");
return synth_502();
}
};
let mut observation = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| {
observe_request(&st, &parts.headers, &bytes)
}))
.unwrap_or_else(|_| {
record_pass_through_failure("observe_panic");
Observation::none()
});
if is_preflight(&parts.headers) {
observation.measured = false;
}
forward_streaming(&st, parts, bytes, permit, observation).await
}
async fn stream_through_opaque(
st: &Arc<BoundaryState>,
parts: Parts,
body: Body,
measure_ctx: Option<MeasureCtx>,
) -> Response {
let url = match upstream_url(st, &parts) {
Some(u) => u,
None => {
emit_terminal_error(measure_ctx);
return synth_502();
}
};
let req_body = reqwest::Body::wrap_stream(body.into_data_stream());
let send = st
.client
.request(parts.method.clone(), url)
.headers(forward_headers(&parts.headers))
.body(req_body)
.send();
let upstream = match tokio::time::timeout(st.header_timeout, send).await {
Ok(res) => res,
Err(_elapsed) => {
emit_terminal_error(measure_ctx);
return synth_502();
}
};
relay(upstream, None, measure_ctx)
}
async fn forward_streaming(
st: &Arc<BoundaryState>,
parts: Parts,
bytes: Bytes,
permit: OwnedSemaphorePermit,
observation: Observation,
) -> Response {
let measure_ctx = if observation.measured && st.cloud_tx.is_some() {
Some(MeasureCtx {
obs: observation,
tokenizer: st.tokenizer,
cloud_tx: st.cloud_tx.clone(),
privacy: st.privacy.clone(),
wire_format_unknown: false,
})
} else {
None
};
let url = match upstream_url(st, &parts) {
Some(u) => u,
None => {
emit_terminal_error(measure_ctx);
return synth_502();
}
};
let send = st
.client
.request(parts.method.clone(), url)
.headers(forward_headers(&parts.headers))
.body(bytes) .send();
let upstream = match tokio::time::timeout(st.header_timeout, send).await {
Ok(res) => res,
Err(_elapsed) => {
emit_terminal_error(measure_ctx);
return synth_502();
}
};
relay(upstream, Some(permit), measure_ctx)
}
fn relay(
upstream: Result<reqwest::Response, reqwest::Error>,
permit: Option<OwnedSemaphorePermit>,
measure_ctx: Option<MeasureCtx>,
) -> Response {
let resp = match upstream {
Ok(r) => r,
Err(_) => {
emit_terminal_error(measure_ctx);
return synth_502();
}
};
let status = resp.status();
let mut headers = resp.headers().clone();
strip_hop_by_hop_headers(&mut headers);
let measure = measure_ctx.map(|ctx| ctx.into_measure(status.is_success()));
let guarded = GuardedBody {
inner: Box::pin(resp.bytes_stream()),
_permit: permit,
measure,
};
let mut out = Response::new(Body::from_stream(guarded));
*out.status_mut() = status;
*out.headers_mut() = headers;
out
}
fn emit_terminal_error(measure_ctx: Option<MeasureCtx>) {
if let Some(ctx) = measure_ctx {
let mut m = ctx.into_measure(false);
m.finalize();
}
}
fn upstream_url(st: &Arc<BoundaryState>, parts: &Parts) -> Option<reqwest::Url> {
let pq = parts
.uri
.path_and_query()
.map(|x| x.as_str())
.unwrap_or("/");
st.upstream_base.join(pq).ok()
}
fn content_length(headers: &HeaderMap) -> Option<usize> {
headers.get(CONTENT_LENGTH)?.to_str().ok()?.parse().ok()
}
fn forward_headers(src: &HeaderMap) -> HeaderMap {
let mut h = src.clone();
h.remove(HOST); h.remove(ACCEPT_ENCODING);
h.remove(PREFLIGHT_HEADER);
strip_hop_by_hop_headers(&mut h);
h
}
fn strip_hop_by_hop_headers(h: &mut HeaderMap) {
let connection_named: Vec<String> = h
.get_all(CONNECTION)
.iter()
.filter_map(|v| v.to_str().ok())
.flat_map(|v| v.split(','))
.map(|t| t.trim().to_ascii_lowercase())
.filter(|t| !t.is_empty())
.collect();
for name in connection_named {
h.remove(name.as_str());
}
h.remove(CONNECTION);
h.remove("keep-alive");
h.remove(TRANSFER_ENCODING);
h.remove(TE);
h.remove(TRAILER);
h.remove(UPGRADE);
h.remove(PROXY_AUTHENTICATE);
h.remove(PROXY_AUTHORIZATION);
h.remove(CONTENT_LENGTH);
}
fn synth_502() -> Response {
UPSTREAM_FAILURES.fetch_add(1, Ordering::Relaxed);
let mut out = Response::new(Body::empty());
*out.status_mut() = StatusCode::BAD_GATEWAY;
out.headers_mut().insert(
"x-openlatch-upstream",
HeaderValue::from_static("unreachable"),
);
out
}
pub async fn boundary_status(State(st): State<Arc<BoundaryState>>) -> Json<serde_json::Value> {
let verdict = st.wiring.verdict();
Json(serde_json::json!({
"status": "up",
"port": st.port,
"upstream": st.upstream_base.as_str(),
"inflight_available": st.inflight.available_permits(),
"uptime_secs": st.started_at.elapsed().as_secs(),
"pass_through_failures": pass_through_failures(),
"upstream_failures": upstream_failures(),
"wired": st.wiring.is_wired(),
"preflight": verdict.label(),
"preflight_error": verdict.error(),
}))
}
struct MeasureCtx {
obs: Observation,
tokenizer: Estimator,
cloud_tx: Option<Sender<CloudEvent>>,
privacy: PrivacyFilter,
wire_format_unknown: bool,
}
impl MeasureCtx {
fn into_measure(self, status_ok: bool) -> Measure {
Measure {
obs: self.obs,
acc: UsageAccumulator::default(),
status_ok,
emitted: false,
wire_format_unknown: self.wire_format_unknown,
tokenizer: self.tokenizer,
cloud_tx: self.cloud_tx,
privacy: self.privacy,
}
}
}
struct Measure {
obs: Observation,
acc: UsageAccumulator,
status_ok: bool,
emitted: bool,
wire_format_unknown: bool,
tokenizer: Estimator,
cloud_tx: Option<Sender<CloudEvent>>,
privacy: PrivacyFilter,
}
impl Measure {
fn finalize(&mut self) {
if self.emitted {
return;
}
self.emitted = true;
let model = self.obs.model.clone().unwrap_or_default();
let (usage, basis, gap) = if !self.status_ok {
(
Usage::default(),
CostBasis::ProviderReported,
Some(CaptureGap::ProviderError),
)
} else if self.acc.is_terminal() {
(
self.acc.usage(),
CostBasis::ProviderReported,
base_gap(&self.obs),
)
} else {
let est = self.tokenizer.estimate(&model, self.obs.request_body_len);
let usage = Usage {
input_tokens: est.input_tokens,
..Usage::default()
};
let gap = base_gap(&self.obs).or(Some(CaptureGap::StreamInterrupted));
(usage, CostBasis::TokenizerEstimated, gap)
};
let gap = if self.wire_format_unknown && self.status_ok {
Some(CaptureGap::UnknownWireFormat)
} else {
gap
};
let cache_preserved = capture::infer_cache_preserved(&usage);
emit::build_and_emit(
&self.obs,
&usage,
basis,
gap,
cache_preserved,
&self.privacy,
self.cloud_tx.as_ref(),
);
}
}
fn base_gap(obs: &Observation) -> Option<CaptureGap> {
if obs.model.is_some() && !obs.model_known {
Some(CaptureGap::UnknownModel)
} else {
None
}
}
struct GuardedBody {
inner: Pin<Box<dyn Stream<Item = reqwest::Result<Bytes>> + Send>>,
_permit: Option<OwnedSemaphorePermit>,
measure: Option<Measure>,
}
impl Stream for GuardedBody {
type Item = reqwest::Result<Bytes>;
fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {
let this = self.get_mut();
let polled = this.inner.as_mut().poll_next(cx);
match &polled {
Poll::Ready(Some(Ok(chunk))) => {
let scan_panicked = if let Some(m) = this.measure.as_mut() {
let acc = &mut m.acc;
std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| {
#[cfg(test)]
if INJECT_SCAN_PANIC.load(Ordering::Relaxed) {
panic!("injected usage-scan panic (FIX 3 test)");
}
acc.scan_chunk(chunk)
}))
.is_err()
} else {
false
};
if scan_panicked {
record_pass_through_failure("usage_scan_panic");
this.measure = None;
}
}
Poll::Ready(None) | Poll::Ready(Some(Err(_))) => {
if let Some(m) = this.measure.as_mut() {
m.finalize();
}
}
Poll::Pending => {}
}
polled
}
}
impl Drop for GuardedBody {
fn drop(&mut self) {
if let Some(m) = self.measure.as_mut() {
m.finalize();
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::boundary::{mock, serve_ephemeral, BoundaryState};
use futures_util::StreamExt;
use std::time::{Duration, Instant};
fn state_for(upstream_port: u16) -> Arc<BoundaryState> {
let base = reqwest::Url::parse(&format!("http://127.0.0.1:{upstream_port}")).unwrap();
Arc::new(BoundaryState::new(base, 0, 8, &[]))
}
#[test]
fn content_length_parses_and_defaults() {
let mut h = HeaderMap::new();
assert_eq!(content_length(&h), None); h.insert(CONTENT_LENGTH, HeaderValue::from_static("42"));
assert_eq!(content_length(&h), Some(42));
}
#[test]
fn forward_headers_strips_framing_keeps_credential() {
let mut h = HeaderMap::new();
h.insert(HOST, HeaderValue::from_static("127.0.0.1:7600"));
h.insert(CONTENT_LENGTH, HeaderValue::from_static("10"));
h.insert("x-api-key", HeaderValue::from_static("sk-ant-xyz"));
h.insert("anthropic-version", HeaderValue::from_static("2023-06-01"));
let out = forward_headers(&h);
assert!(
out.get(HOST).is_none(),
"host must be stripped (reqwest sets it)"
);
assert!(
out.get(CONTENT_LENGTH).is_none(),
"content-length must be stripped"
);
assert_eq!(out.get("x-api-key").unwrap(), "sk-ant-xyz");
assert_eq!(out.get("anthropic-version").unwrap(), "2023-06-01");
}
#[test]
fn forward_headers_strips_accept_encoding_for_readable_usage() {
let mut h = HeaderMap::new();
h.insert(ACCEPT_ENCODING, HeaderValue::from_static("gzip, br, zstd"));
h.insert("x-api-key", HeaderValue::from_static("sk-ant-xyz"));
let out = forward_headers(&h);
assert!(
out.get(ACCEPT_ENCODING).is_none(),
"accept-encoding must be stripped so the response body is scannable"
);
assert_eq!(out.get("x-api-key").unwrap(), "sk-ant-xyz");
}
#[test]
fn forward_headers_strips_connection_listed_and_hop_by_hop() {
let mut h = HeaderMap::new();
h.insert(CONNECTION, HeaderValue::from_static("x-internal-foo"));
h.insert("x-internal-foo", HeaderValue::from_static("secret"));
h.insert("keep-alive", HeaderValue::from_static("timeout=5"));
h.insert("x-api-key", HeaderValue::from_static("sk-ant-xyz"));
h.insert("authorization", HeaderValue::from_static("Bearer tok"));
let out = forward_headers(&h);
assert!(
out.get("x-internal-foo").is_none(),
"a Connection-listed header must be stripped"
);
assert!(
out.get("keep-alive").is_none(),
"Keep-Alive is hop-by-hop and must be stripped"
);
assert!(
out.get(CONNECTION).is_none(),
"Connection itself is stripped"
);
assert_eq!(out.get("x-api-key").unwrap(), "sk-ant-xyz");
assert_eq!(out.get("authorization").unwrap(), "Bearer tok");
}
#[tokio::test(flavor = "multi_thread")]
async fn header_wait_times_out_to_synth_502() {
let hang_port = mock::spawn_hang_after_accept().await;
let base = reqwest::Url::parse(&format!("http://127.0.0.1:{hang_port}")).unwrap();
let state = Arc::new(
BoundaryState::new(base, 0, 8, &[]).with_header_timeout(Duration::from_millis(200)),
);
let port = serve_ephemeral(state).await;
let resp = tokio::time::timeout(
Duration::from_secs(5),
reqwest::Client::new()
.post(format!("http://127.0.0.1:{port}/v1/messages"))
.header("content-type", "application/json")
.body(br#"{"model":"x","messages":[]}"#.to_vec())
.send(),
)
.await
.expect("request must return within 5s, not hang")
.unwrap();
assert_eq!(resp.status(), StatusCode::BAD_GATEWAY);
assert_eq!(
resp.headers().get("x-openlatch-upstream").unwrap(),
"unreachable"
);
}
#[tokio::test(flavor = "multi_thread")]
async fn admin_status_endpoint_reports_the_listener() {
let port = serve_ephemeral(state_for(0)).await;
let resp = reqwest::Client::new()
.get(format!("http://127.0.0.1:{port}/admin/boundary/status"))
.send()
.await
.unwrap();
assert!(resp.status().is_success());
let v: serde_json::Value = resp.json().await.unwrap();
assert_eq!(v["status"], "up");
assert!(v["port"].is_number());
assert!(v["pass_through_failures"].is_number());
}
#[tokio::test]
async fn synth_502_shape() {
let r = synth_502();
assert_eq!(r.status(), StatusCode::BAD_GATEWAY);
assert_eq!(
r.headers().get("x-openlatch-upstream").unwrap(),
"unreachable"
);
}
#[tokio::test(flavor = "multi_thread")]
async fn opaque_get_models_forwarded() {
let up = mock::spawn_capture_200().await;
let port = serve_ephemeral(state_for(up.port)).await;
let resp = reqwest::Client::new()
.get(format!("http://127.0.0.1:{port}/v1/models"))
.send()
.await
.unwrap();
assert!(resp.status().is_success());
assert_eq!(resp.bytes().await.unwrap().as_ref(), b"ok");
let line = up.received_request_line.lock().unwrap().clone().unwrap();
assert!(
line.starts_with("GET /v1/models"),
"opaque path forwards verbatim: {line}"
);
}
#[tokio::test(flavor = "multi_thread")]
async fn materialized_messages_forwards_body_and_credential() {
let up = mock::spawn_capture_200().await;
let port = serve_ephemeral(state_for(up.port)).await;
let body = br#"{"model":"claude-opus-4-8","messages":[{"role":"user","content":"hi"}]}"#;
let resp = reqwest::Client::new()
.post(format!("http://127.0.0.1:{port}/v1/messages"))
.header("content-type", "application/json")
.header("x-api-key", "sk-ant-test123")
.body(body.to_vec())
.send()
.await
.unwrap();
assert!(resp.status().is_success());
assert_eq!(
up.received_body.lock().unwrap().clone().unwrap(),
body.to_vec()
);
assert_eq!(up.header("x-api-key").as_deref(), Some("sk-ant-test123"));
assert_eq!(
up.header("host").as_deref(),
Some(format!("127.0.0.1:{}", up.port).as_str())
);
}
#[tokio::test(flavor = "multi_thread")]
async fn breakpoint_body_round_trips_byte_identical() {
let up = mock::spawn_capture_200().await;
let port = serve_ephemeral(state_for(up.port)).await;
let body = br#"{"model":"claude-opus-4-8","system":[{"type":"text","text":"x","cache_control":{"type":"ephemeral"}}],"messages":[]}"#;
let resp = reqwest::Client::new()
.post(format!("http://127.0.0.1:{port}/v1/messages"))
.header("content-type", "application/json")
.body(body.to_vec())
.send()
.await
.unwrap();
assert!(resp.status().is_success());
let received = up.received_body.lock().unwrap().clone().unwrap();
assert_eq!(
received,
body.to_vec(),
"cache_control breakpoint must round-trip byte-identically"
);
}
#[tokio::test(flavor = "multi_thread")]
async fn count_tokens_forwarded_opaque_with_body() {
let up = mock::spawn_capture_200().await;
let port = serve_ephemeral(state_for(up.port)).await;
let body = br#"{"model":"claude-opus-4-8","messages":[]}"#;
let resp = reqwest::Client::new()
.post(format!("http://127.0.0.1:{port}/v1/messages/count_tokens"))
.header("content-type", "application/json")
.body(body.to_vec())
.send()
.await
.unwrap();
assert!(resp.status().is_success());
assert_eq!(
up.received_body.lock().unwrap().clone().unwrap(),
body.to_vec()
);
}
#[tokio::test(flavor = "multi_thread")]
async fn unreachable_upstream_yields_synth_502() {
let dead = mock::closed_port().await;
let port = serve_ephemeral(state_for(dead)).await;
let resp = reqwest::Client::new()
.post(format!("http://127.0.0.1:{port}/v1/messages"))
.header("content-type", "application/json")
.body(br#"{"model":"x","messages":[]}"#.to_vec())
.send()
.await
.unwrap();
assert_eq!(resp.status(), StatusCode::BAD_GATEWAY);
assert_eq!(
resp.headers().get("x-openlatch-upstream").unwrap(),
"unreachable"
);
}
#[tokio::test(flavor = "multi_thread")]
async fn an_unreachable_upstream_is_counted_as_an_upstream_failure() {
let dead = mock::closed_port().await;
let port = serve_ephemeral(state_for(dead)).await;
let upstream_before = upstream_failures();
let pass_through_before = pass_through_failures();
let resp = reqwest::Client::new()
.post(format!("http://127.0.0.1:{port}/v1/messages"))
.header("content-type", "application/json")
.body(br#"{"model":"x","messages":[]}"#.to_vec())
.send()
.await
.unwrap();
assert_eq!(resp.status(), StatusCode::BAD_GATEWAY);
assert!(
upstream_failures() > upstream_before,
"a request the agent got no answer to must be counted"
);
assert_eq!(
pass_through_failures(),
pass_through_before,
"an unreachable upstream is not a degraded-to-pass-through step"
);
}
#[tokio::test(flavor = "multi_thread")]
async fn preflight_probe_forwards_without_measuring_or_leaking_its_marker() {
use crate::boundary::preflight::PREFLIGHT_HEADER;
use crate::boundary::session::SessionRegistry;
let up = mock::spawn_capture_200().await;
let base = reqwest::Url::parse(&format!("http://127.0.0.1:{}", up.port)).unwrap();
let (tx, mut rx) = tokio::sync::mpsc::channel(8);
let reg = Arc::new(SessionRegistry::default());
reg.upsert("agt_1", "agt_1", "claude-code", "sess_a");
let state = Arc::new(BoundaryState::new(base, 0, 8, &[]).with_measurement(reg, Some(tx)));
let port = serve_ephemeral(state).await;
let resp = reqwest::Client::new()
.post(format!("http://127.0.0.1:{port}/v1/messages"))
.header("content-type", "application/json")
.header("x-openlatch-install-id", "agt_1")
.header(PREFLIGHT_HEADER, "1")
.body(
br#"{"model":"claude-opus-4-8","max_tokens":1,"messages":[{"role":"user","content":"ping"}]}"#
.to_vec(),
)
.send()
.await
.unwrap();
assert!(
resp.status().is_success(),
"the probe must be forwarded like any other request"
);
let _ = resp.bytes().await;
for _ in 0..50 {
if up.received_headers.lock().unwrap().is_some() {
break;
}
tokio::time::sleep(Duration::from_millis(20)).await;
}
let sent = up.received_headers.lock().unwrap().clone().unwrap();
assert!(
!sent.to_ascii_lowercase().contains(PREFLIGHT_HEADER),
"the preflight marker must be stripped before the request leaves for the provider, \
got headers: {sent}"
);
tokio::time::sleep(Duration::from_millis(50)).await;
assert!(
rx.try_recv().is_err(),
"a preflight probe must emit ZERO economics events"
);
}
#[tokio::test(flavor = "multi_thread")]
async fn an_unmarked_request_on_the_same_path_is_measured() {
use crate::boundary::session::SessionRegistry;
let up = mock::spawn_capture_200().await;
let base = reqwest::Url::parse(&format!("http://127.0.0.1:{}", up.port)).unwrap();
let (tx, mut rx) = tokio::sync::mpsc::channel(8);
let reg = Arc::new(SessionRegistry::default());
reg.upsert("agt_1", "agt_1", "claude-code", "sess_a");
let state = Arc::new(BoundaryState::new(base, 0, 8, &[]).with_measurement(reg, Some(tx)));
let port = serve_ephemeral(state).await;
let resp = reqwest::Client::new()
.post(format!("http://127.0.0.1:{port}/v1/messages"))
.header("content-type", "application/json")
.header("x-openlatch-install-id", "agt_1")
.body(
br#"{"model":"claude-opus-4-8","max_tokens":1,"messages":[{"role":"user","content":"ping"}]}"#
.to_vec(),
)
.send()
.await
.unwrap();
let _ = resp.bytes().await;
tokio::time::sleep(Duration::from_millis(50)).await;
assert!(
rx.try_recv().is_ok(),
"an ordinary /v1/messages request must still emit its economics event"
);
}
#[tokio::test(flavor = "multi_thread")]
async fn usage_scan_panic_degrades_to_unmeasured() {
use crate::boundary::session::SessionRegistry;
let up = mock::spawn_capture_usage_sse(10, 0, 0, 0, 0, 20).await;
let base = reqwest::Url::parse(&format!("http://127.0.0.1:{}", up.port)).unwrap();
let (tx, mut rx) = tokio::sync::mpsc::channel(8);
let reg = Arc::new(SessionRegistry::default());
reg.upsert("agt_1", "agt_1", "claude-code", "sess_a");
let state = Arc::new(BoundaryState::new(base, 0, 8, &[]).with_measurement(reg, Some(tx)));
let port = serve_ephemeral(state).await;
let failures_before = pass_through_failures();
set_inject_scan_panic(true);
let body = br#"{"model":"claude-opus-4-8","stream":true,"messages":[{"role":"user","content":"hi"}]}"#.to_vec();
let resp = reqwest::Client::new()
.post(format!("http://127.0.0.1:{port}/v1/messages"))
.header("content-type", "application/json")
.header("x-openlatch-install-id", "agt_1")
.body(body.clone())
.send()
.await
.unwrap();
assert!(
resp.status().is_success(),
"forward must complete despite the scan panic"
);
let received = resp.bytes().await.expect("response body drains cleanly");
assert!(!received.is_empty(), "response body still flows through");
set_inject_scan_panic(false);
for _ in 0..50 {
if up.received_body.lock().unwrap().is_some() {
break;
}
tokio::time::sleep(Duration::from_millis(20)).await;
}
assert_eq!(
up.received_body.lock().unwrap().clone().unwrap(),
body,
"request body must be byte-identical despite the scan panic"
);
assert!(
pass_through_failures() > failures_before,
"a usage-scan panic must be recorded as a pass-through failure"
);
assert!(
tokio::time::timeout(Duration::from_millis(500), rx.recv())
.await
.ok()
.flatten()
.is_none(),
"a usage-scan panic must emit NO event (unmeasured, not corrupt)"
);
}
#[tokio::test(flavor = "multi_thread")]
async fn streaming_is_zero_buffer() {
let gap = Duration::from_millis(60);
let trickle = mock::spawn_trickle_sse(3, gap).await;
let port = serve_ephemeral(state_for(trickle.port)).await;
let resp = reqwest::Client::new()
.post(format!("http://127.0.0.1:{port}/v1/messages"))
.header("content-type", "application/json")
.body(br#"{"model":"x","messages":[],"stream":true}"#.to_vec())
.send()
.await
.unwrap();
assert!(resp.status().is_success());
let mut stream = resp.bytes_stream();
let first = stream.next().await;
let first_byte_at = Instant::now();
assert!(first.is_some(), "expected at least one streamed chunk");
assert!(first.unwrap().is_ok());
while stream.next().await.is_some() {}
let final_written_at = trickle
.final_written_at
.lock()
.unwrap()
.expect("mock must have finished writing");
assert!(
first_byte_at < final_written_at,
"first client byte must arrive BEFORE the upstream stream completes (zero-buffer)"
);
}
}