1use 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
15key!(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
29key!(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
49key!(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
59key!(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
69key!(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 #[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}