Skip to main content

tokn_headers/
keys.rs

1//! Catalogue of popular header names as compile-time `static` constants.
2//!
3//! Use these in place of ad-hoc `HeaderName::new(...)` for any header that
4//! appears in this list — both for clarity and to avoid the (small) cost of
5//! re-allocating the `SmolStr` on each construction.
6
7use crate::name::HeaderName;
8
9macro_rules! key {
10  ($name:ident, $original:literal, $lower:literal) => {
11    pub static $name: HeaderName = HeaderName::new_static($original, $lower);
12  };
13}
14
15// Core HTTP transport
16key!(AUTHORIZATION, "Authorization", "authorization");
17key!(CONTENT_TYPE, "Content-Type", "content-type");
18key!(CONTENT_ENCODING, "Content-Encoding", "content-encoding");
19key!(CONTENT_LENGTH, "Content-Length", "content-length");
20key!(ACCEPT, "Accept", "accept");
21key!(ACCEPT_ENCODING, "Accept-Encoding", "accept-encoding");
22key!(ACCEPT_LANGUAGE, "Accept-Language", "accept-language");
23key!(CONNECTION, "Connection", "connection");
24key!(UPGRADE, "Upgrade", "upgrade");
25key!(COOKIE, "Cookie", "cookie");
26key!(USER_AGENT, "User-Agent", "user-agent");
27key!(HOST, "Host", "host");
28
29// Tool / persona identity
30key!(EDITOR_VERSION, "Editor-Version", "editor-version");
31key!(EDITOR_PLUGIN_VERSION, "Editor-Plugin-Version", "editor-plugin-version");
32key!(
33  COPILOT_INTEGRATION_ID,
34  "Copilot-Integration-Id",
35  "copilot-integration-id"
36);
37key!(
38  COPILOT_VISION_REQUEST,
39  "Copilot-Vision-Request",
40  "copilot-vision-request"
41);
42key!(OPENAI_INTENT, "OpenAI-Intent", "openai-intent");
43key!(OPENAI_BETA, "OpenAI-Beta", "openai-beta");
44key!(CHATGPT_ACCOUNT_ID, "chatgpt-account-id", "chatgpt-account-id");
45key!(ANTHROPIC_BETA, "Anthropic-Beta", "anthropic-beta");
46key!(ANTHROPIC_VERSION, "Anthropic-Version", "anthropic-version");
47key!(X_API_KEY, "X-Api-Key", "x-api-key");
48
49// Router-injected correlation
50key!(X_SESSION_ID, "X-Session-Id", "x-session-id");
51key!(X_SESSION_AFFINITY, "X-Session-Affinity", "x-session-affinity");
52key!(X_PARENT_SESSION_ID, "X-Parent-Session-Id", "x-parent-session-id");
53key!(X_REQUEST_ID, "X-Request-Id", "x-request-id");
54key!(X_INITIATOR, "X-Initiator", "x-initiator");
55key!(X_PROJECT_CWD, "X-Project-Cwd", "x-project-cwd");
56key!(X_INTERACTION_ID, "X-Interaction-Id", "x-interaction-id");
57key!(X_BEHAVE_AS, "X-Behave-As", "x-behave-as");
58
59// Codex CLI native (lowercase, no x- prefix in real captures)
60key!(ORIGINATOR, "originator", "originator");
61key!(VERSION, "version", "version");
62key!(SESSION_ID_LOWER, "session_id", "session_id");
63key!(THREAD_ID, "thread_id", "thread_id");
64key!(X_CLIENT_REQUEST_ID, "x-client-request-id", "x-client-request-id");
65key!(X_CODEX_BETA_FEATURES, "x-codex-beta-features", "x-codex-beta-features");
66key!(X_CODEX_TURN_METADATA, "x-codex-turn-metadata", "x-codex-turn-metadata");
67key!(X_CODEX_WINDOW_ID, "x-codex-window-id", "x-codex-window-id");
68
69// Copilot CLI / Stainless SDK family
70key!(X_GITHUB_API_VERSION, "X-GitHub-Api-Version", "x-github-api-version");
71key!(X_INTERACTION_TYPE, "X-Interaction-Type", "x-interaction-type");
72key!(X_CLIENT_SESSION_ID, "X-Client-Session-Id", "x-client-session-id");
73key!(X_AGENT_TASK_ID, "X-Agent-Task-Id", "x-agent-task-id");
74key!(SEC_FETCH_MODE, "Sec-Fetch-Mode", "sec-fetch-mode");
75key!(
76  SEC_WEBSOCKET_EXTENSIONS,
77  "Sec-WebSocket-Extensions",
78  "sec-websocket-extensions"
79);
80key!(SEC_WEBSOCKET_KEY, "Sec-WebSocket-Key", "sec-websocket-key");
81key!(SEC_WEBSOCKET_VERSION, "Sec-WebSocket-Version", "sec-websocket-version");
82key!(
83  X_STAINLESS_RETRY_COUNT,
84  "X-Stainless-Retry-Count",
85  "x-stainless-retry-count"
86);
87key!(X_STAINLESS_TIMEOUT, "X-Stainless-Timeout", "x-stainless-timeout");
88key!(X_STAINLESS_LANG, "X-Stainless-Lang", "x-stainless-lang");
89key!(
90  X_STAINLESS_PACKAGE_VERSION,
91  "X-Stainless-Package-Version",
92  "x-stainless-package-version"
93);
94key!(X_STAINLESS_OS, "X-Stainless-OS", "x-stainless-os");
95key!(X_STAINLESS_ARCH, "X-Stainless-Arch", "x-stainless-arch");
96key!(X_STAINLESS_RUNTIME, "X-Stainless-Runtime", "x-stainless-runtime");
97key!(
98  X_STAINLESS_RUNTIME_VERSION,
99  "X-Stainless-Runtime-Version",
100  "x-stainless-runtime-version"
101);
102key!(
103  X_STAINLESS_HELPER_METHOD,
104  "x-stainless-helper-method",
105  "x-stainless-helper-method"
106);
107key!(X_APP, "X-App", "x-app");
108key!(
109  ANTHROPIC_DANGEROUS_DIRECT_BROWSER_ACCESS,
110  "Anthropic-Dangerous-Direct-Browser-Access",
111  "anthropic-dangerous-direct-browser-access"
112);
113key!(X_GOOG_API_KEY, "x-goog-api-key", "x-goog-api-key");
114
115#[cfg(test)]
116mod tests {
117  use super::*;
118
119  /// Sanity test: every catalogued key's original form must lowercase to its
120  /// declared lowercase form. Catches typos in `key!()` macro calls.
121  #[test]
122  fn original_lowercases_to_canonical() {
123    macro_rules! check {
124      ($($name:ident),* $(,)?) => {
125        $({
126          let n = &$name;
127          assert_eq!(
128            n.original().to_ascii_lowercase(),
129            n.as_str(),
130            "key {} declared lower form does not match", stringify!($name)
131          );
132        })*
133      };
134    }
135    check!(
136      AUTHORIZATION,
137      CONTENT_TYPE,
138      CONTENT_ENCODING,
139      CONTENT_LENGTH,
140      ACCEPT,
141      ACCEPT_ENCODING,
142      ACCEPT_LANGUAGE,
143      CONNECTION,
144      UPGRADE,
145      COOKIE,
146      USER_AGENT,
147      HOST,
148      EDITOR_VERSION,
149      EDITOR_PLUGIN_VERSION,
150      COPILOT_INTEGRATION_ID,
151      COPILOT_VISION_REQUEST,
152      OPENAI_INTENT,
153      OPENAI_BETA,
154      CHATGPT_ACCOUNT_ID,
155      ANTHROPIC_BETA,
156      ANTHROPIC_VERSION,
157      X_API_KEY,
158      X_SESSION_ID,
159      X_SESSION_AFFINITY,
160      X_PARENT_SESSION_ID,
161      X_REQUEST_ID,
162      X_INITIATOR,
163      X_PROJECT_CWD,
164      X_INTERACTION_ID,
165      X_BEHAVE_AS,
166      ORIGINATOR,
167      VERSION,
168      SESSION_ID_LOWER,
169      THREAD_ID,
170      X_CLIENT_REQUEST_ID,
171      X_CODEX_BETA_FEATURES,
172      X_CODEX_TURN_METADATA,
173      X_CODEX_WINDOW_ID,
174      X_GITHUB_API_VERSION,
175      X_INTERACTION_TYPE,
176      X_CLIENT_SESSION_ID,
177      X_AGENT_TASK_ID,
178      SEC_FETCH_MODE,
179      SEC_WEBSOCKET_EXTENSIONS,
180      SEC_WEBSOCKET_KEY,
181      SEC_WEBSOCKET_VERSION,
182      X_STAINLESS_RETRY_COUNT,
183      X_STAINLESS_TIMEOUT,
184      X_STAINLESS_LANG,
185      X_STAINLESS_PACKAGE_VERSION,
186      X_STAINLESS_OS,
187      X_STAINLESS_ARCH,
188      X_STAINLESS_RUNTIME,
189      X_STAINLESS_RUNTIME_VERSION,
190      X_STAINLESS_HELPER_METHOD,
191      X_APP,
192      ANTHROPIC_DANGEROUS_DIRECT_BROWSER_ACCESS,
193      X_GOOG_API_KEY,
194    );
195  }
196
197  #[test]
198  fn keys_are_case_insensitive_to_arbitrary_input() {
199    use crate::HeaderName;
200    assert_eq!(AUTHORIZATION, HeaderName::new("AUTHORIZATION"));
201    assert_eq!(EDITOR_VERSION, HeaderName::new("editor-version"));
202  }
203}