pyhttp-app 2.0.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,372 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <script>
5
+ // apply the theme before first paint (the server value is synced after load)
6
+ (function () {
7
+ try {
8
+ var t = localStorage.getItem('pyhttp.theme') || 'dark';
9
+ if (t === 'system') t = window.matchMedia('(prefers-color-scheme: light)').matches ? 'light' : 'dark';
10
+ document.documentElement.setAttribute('data-theme', t);
11
+ var fs = localStorage.getItem('pyhttp.fontsize');
12
+ if (fs) document.documentElement.style.setProperty('--editor-font', fs + 'px');
13
+ var uf = localStorage.getItem('pyhttp.uifont'), mf = localStorage.getItem('pyhttp.monofont');
14
+ if (uf) document.documentElement.style.setProperty('--sans', uf);
15
+ if (mf) document.documentElement.style.setProperty('--mono', mf);
16
+ } catch (e) { document.documentElement.setAttribute('data-theme', 'dark'); }
17
+ })();
18
+ </script>
19
+ <meta charset="utf-8">
20
+ <meta name="viewport" content="width=device-width, initial-scale=1">
21
+ <title>pyhttp</title>
22
+ <link rel="icon" type="image/svg+xml" href="/static/logo.svg">
23
+ <link rel="stylesheet" href="/static/style.css">
24
+ <link rel="stylesheet" href="/static/features.css">
25
+ </head>
26
+ <body>
27
+ <header class="topbar">
28
+ <button id="btn-sidebar" class="icon-btn hamburger on" title="Hide the sidebar (Ctrl+\)" aria-label="Show or hide the sidebar">
29
+ <svg viewBox="0 0 24 24" width="20" height="20" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" d="M4 7h16M4 12h16M4 17h16"/></svg>
30
+ </button>
31
+ <div class="brand" title="pyhttp: local HTTP client">
32
+ <svg class="brand-mark" viewBox="0 0 32 32" width="28" height="28" aria-hidden="true">
33
+ <defs><linearGradient id="brand-g" x1="0" y1="0" x2="1" y2="1"><stop offset="0" stop-color="#3b82f6"/><stop offset="1" stop-color="#10b981"/></linearGradient></defs>
34
+ <rect x="1" y="1" width="30" height="30" rx="8" fill="url(#brand-g)"/>
35
+ <g fill="none" stroke="#fff" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round">
36
+ <path d="M8 12h15M19 8l4 4-4 4"/>
37
+ <path d="M24 20H9M13 16l-4 4 4 4" opacity=".8"/>
38
+ </g>
39
+ </svg>
40
+ <span class="brand-word">py<span>http</span></span>
41
+ </div>
42
+ <div class="topbar-actions">
43
+ <button id="btn-update" class="update-pill" hidden title="A newer version is available">⬆ Update</button>
44
+ <div class="env-picker" title="Active environment: its variables override global variables">
45
+ <span class="env-dot"></span>
46
+ <select id="env-select"></select>
47
+ </div>
48
+ <button id="btn-envs" title="Create and edit environments (Dev, QA, Prod…)">Environments</button>
49
+ <button id="btn-variables" title="Global variables, used by every environment">Variables</button>
50
+ <button id="btn-cookies" title="Cookie jar: cookies stored from responses and sent with requests">Cookies</button>
51
+ <button id="btn-monitors" title="Scheduled checks: picked requests sent on an interval while the app is open; failures are flagged and can ping a webhook">Monitors<span id="mon-badge" class="tab-n fail" hidden></span></button>
52
+ <button id="btn-mocks" title="Mock servers: fake endpoints answered by pyhttp itself, on the port it already runs on (http://host:port/mock/&lt;name&gt;/…)">Mocks<span id="mock-badge" class="tab-n" hidden></span></button>
53
+ <button id="btn-import" title="Import a pyhttp export, a Postman collection or environment, or a cURL command">Import</button>
54
+ <button id="btn-export" title="Export as pyhttp JSON or as a Postman collection">Export ▾</button>
55
+ <button id="btn-help" class="icon-btn settings-btn" title="Keyboard shortcuts (?)">?</button>
56
+ <button id="btn-settings" class="icon-btn settings-btn" title="Settings: theme, SSL verification, redirects, proxy, certificates">
57
+ <svg viewBox="0 0 24 24" width="18" height="18" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" d="M12 15.5a3.5 3.5 0 1 0 0-7 3.5 3.5 0 0 0 0 7z"/><path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" d="M19.4 15a1.7 1.7 0 0 0 .3 1.8l.1.1a2 2 0 1 1-2.8 2.8l-.1-.1a1.7 1.7 0 0 0-1.8-.3 1.7 1.7 0 0 0-1 1.5V21a2 2 0 1 1-4 0v-.1a1.7 1.7 0 0 0-1.1-1.5 1.7 1.7 0 0 0-1.8.3l-.1.1a2 2 0 1 1-2.8-2.8l.1-.1a1.7 1.7 0 0 0 .3-1.8 1.7 1.7 0 0 0-1.5-1H3a2 2 0 1 1 0-4h.1a1.7 1.7 0 0 0 1.5-1.1 1.7 1.7 0 0 0-.3-1.8l-.1-.1a2 2 0 1 1 2.8-2.8l.1.1a1.7 1.7 0 0 0 1.8.3h0a1.7 1.7 0 0 0 1-1.5V3a2 2 0 1 1 4 0v.1a1.7 1.7 0 0 0 1 1.5 1.7 1.7 0 0 0 1.8-.3l.1-.1a2 2 0 1 1 2.8 2.8l-.1.1a1.7 1.7 0 0 0-.3 1.8v0a1.7 1.7 0 0 0 1.5 1H21a2 2 0 1 1 0 4h-.1a1.7 1.7 0 0 0-1.5 1z"/></svg>
58
+ </button>
59
+ <span id="meta-info" class="muted small"></span>
60
+ </div>
61
+ </header>
62
+
63
+ <main class="layout">
64
+ <!-- ------------------------------------------------ sidebar: collection -->
65
+ <aside class="sidebar">
66
+ <div class="tab-panels grow-panels" id="side-panels">
67
+ <div class="tab-panel side-panel" data-panel="collection">
68
+ <div class="sidebar-head">
69
+ <input id="search" type="search" placeholder="Search name, tags, url, description… (Ctrl+K)" autocomplete="off">
70
+ <button id="btn-new" class="primary" title="New request (Ctrl+N)">+<span class="btn-text"> New</span></button>
71
+ <button id="btn-new-folder" class="icon-btn folder-btn" title="New folder">
72
+ <svg viewBox="0 0 24 24" width="18" height="18" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linejoin="round" d="M3 7.5A1.5 1.5 0 0 1 4.5 6H9l2 2h8.5A1.5 1.5 0 0 1 21 9.5v8a1.5 1.5 0 0 1-1.5 1.5h-15A1.5 1.5 0 0 1 3 17.5z"/><path stroke="currentColor" stroke-width="1.8" stroke-linecap="round" d="M12 11v5M9.5 13.5h5"/></svg>
73
+ </button>
74
+ </div>
75
+ <div id="tag-filter" class="tag-filter"></div>
76
+ <div class="select-bar">
77
+ <label title="Select everything currently shown"><input type="checkbox" id="select-all"> All shown</label>
78
+ <span id="selected-count" class="muted small">0 selected</span>
79
+ <button id="btn-clear-sel" class="link small" hidden>clear</button>
80
+ <span class="run-group">
81
+ <button id="btn-run" class="accent" disabled title="Choose a name, order and options, then run">▶ Run selected</button>
82
+ <button id="btn-run-now" class="icon" disabled title="Run now: skip the dialog and send the selected requests with the last run's options"><svg viewBox="0 0 24 24" width="15" height="15" aria-hidden="true"><path fill="currentColor" d="M13 2 3.5 13.5H11l-1 8.5 9.5-11.5H13z"/></svg></button>
83
+ </span>
84
+ </div>
85
+ <ul id="req-list" class="req-list"></ul>
86
+ </div>
87
+ </div>
88
+ </aside>
89
+
90
+ <!-- --------------------------------------------------- editor + response -->
91
+ <section class="editor" id="editor-section">
92
+ <div id="req-tabs" class="req-tabs" hidden></div>
93
+ <div id="editor-empty" class="empty">
94
+ <svg class="empty-mark" viewBox="0 0 24 24" width="40" height="40" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" d="M21 3 10.5 13.5M21 3l-6.5 18-4-7.5L3 9.5z"/></svg>
95
+ <p>Select a request on the left, or create a new one.</p>
96
+ <div class="empty-keys">
97
+ <span><kbd>Ctrl</kbd> <kbd>N</kbd> new request</span>
98
+ <span><kbd>Ctrl</kbd> <kbd>K</kbd> search</span>
99
+ <span><kbd>Ctrl</kbd> <kbd>Enter</kbd> send</span>
100
+ <span><kbd>?</kbd> all shortcuts</span>
101
+ </div>
102
+ <p class="muted small">Tip: use <code>{{variable}}</code> in URL, headers and body. In a run, <code>{{prev.json.token}}</code> reads the previous response.</p>
103
+ </div>
104
+ <div id="editor-form" hidden>
105
+ <div class="editor-request">
106
+ <div class="row url-row">
107
+ <select id="f-method" class="method-select">
108
+ <option>GET</option><option>POST</option><option>PUT</option><option>PATCH</option>
109
+ <option>DELETE</option><option>HEAD</option><option>OPTIONS</option>
110
+ </select>
111
+ <input id="f-url" class="grow mono" placeholder="https://api.example.com/users/:id?page={{page}}" spellcheck="false">
112
+ <button id="btn-code" class="icon-btn code-btn" title="Code snippet: cURL, Python, JavaScript… (Ctrl+Shift+C)">&lt;/&gt;</button>
113
+ <span class="send-group">
114
+ <button id="btn-send" class="accent" title="Ctrl+Enter">Send</button>
115
+ <button id="btn-send-mode" class="accent send-mode" hidden title="How the checked bodies are sent: in order or in parallel">▾</button>
116
+ </span>
117
+ </div>
118
+ <div class="meta-bar">
119
+ <span id="crumb" class="crumb"></span>
120
+ <input id="f-name" class="name-inline" placeholder="Untitled request" title="Request name (click to rename)" spellcheck="false">
121
+ <span id="meta-tags" class="meta-tags"></span>
122
+ <button id="btn-details" class="link small" title="Edit tags and description">Details ▾</button>
123
+ <span class="grow"></span>
124
+ <span id="save-state" class="save-state" title="Changes save automatically (Ctrl+S saves now)"></span>
125
+ </div>
126
+ <div id="details" class="details" hidden>
127
+ <label class="field">Tags <input id="f-tags" class="grow" placeholder="comma separated, e.g. auth, users, smoke"></label>
128
+ <div class="row tight">
129
+ <span class="muted small grow">Description (Markdown)</span>
130
+ <button id="btn-desc-preview" class="link small">Preview</button>
131
+ </div>
132
+ <textarea id="f-description" rows="3" placeholder="What this request is for. Markdown works: **bold**, `code`, lists, [links](https://…)"></textarea>
133
+ <div id="desc-preview" class="md" hidden></div>
134
+ </div>
135
+
136
+ <div class="tabs" id="editor-tabs">
137
+ <button data-tab="params" class="active">Params<span class="tab-n" id="n-params"></span></button>
138
+ <button data-tab="auth">Auth<span class="tab-n" id="n-auth"></span></button>
139
+ <button data-tab="headers">Headers<span class="tab-n" id="n-headers"></span></button>
140
+ <button data-tab="body">Body<span class="tab-n" id="n-body"></span></button>
141
+ <button data-tab="tests" title="Pre-request variables and script; tests, extractions and the test script that run on the response">Scripts<span class="tab-n" id="n-tests"></span></button>
142
+ <button data-tab="settings">Settings</button>
143
+ </div>
144
+ <div class="tab-panels" id="editor-panels">
145
+ <div class="tab-panel" data-panel="params">
146
+ <div id="kv-params" class="kv"></div>
147
+ <div id="path-vars" class="path-vars" hidden></div>
148
+ </div>
149
+ <div class="tab-panel" data-panel="auth" hidden><div id="auth-panel"></div></div>
150
+ <div class="tab-panel" data-panel="headers" hidden>
151
+ <div id="inherited-headers" class="inherited" hidden></div>
152
+ <div id="kv-headers" class="kv"></div>
153
+ </div>
154
+ <div class="tab-panel" data-panel="body" hidden>
155
+ <div class="row">
156
+ <select id="f-body-type">
157
+ <option value="none">No body</option>
158
+ <option value="json">JSON</option>
159
+ <option value="text">Text</option>
160
+ <option value="xml">XML</option>
161
+ <option value="html">HTML</option>
162
+ <option value="javascript">JavaScript</option>
163
+ <option value="form">Form (x-www-form-urlencoded)</option>
164
+ <option value="multipart">Form-data (multipart, files)</option>
165
+ <option value="binary">Binary file</option>
166
+ <option value="graphql">GraphQL</option>
167
+ </select>
168
+ <span id="bodies-hint" class="muted small grow"></span>
169
+ </div>
170
+ <div class="bodies">
171
+ <div class="bodies-side">
172
+ <div class="row tight">
173
+ <input id="body-search" type="search" class="grow" placeholder="Search bodies…" autocomplete="off">
174
+ <button id="btn-body-add" title="Add a new named body">+ Body</button>
175
+ </div>
176
+ <div class="row tight small">
177
+ <button id="btn-body-all" class="link small">check all</button>
178
+ <button id="btn-body-none" class="link small">uncheck all</button>
179
+ <span class="grow"></span>
180
+ <span id="bodies-count" class="muted small"></span>
181
+ </div>
182
+ <ul id="body-list" class="body-list"></ul>
183
+ </div>
184
+ <div class="bodies-main">
185
+ <div id="body-editor-empty" class="empty small">Add a body with “+ Body”. Each named body is sent separately when you press Send.</div>
186
+ <div id="body-editor" hidden>
187
+ <div class="row tight">
188
+ <input id="body-name" class="grow" placeholder="Body name, e.g. valid user / missing email">
189
+ <button id="btn-format-json" class="link" title="Beautify (Ctrl+B)">Beautify</button>
190
+ <button id="btn-body-dup" title="Duplicate this body">Duplicate</button>
191
+ <button id="btn-body-del" class="danger" title="Delete this body">Delete</button>
192
+ </div>
193
+ <div id="body-text-wrap">
194
+ <textarea id="f-body" class="mono body-input" rows="14" spellcheck="false" placeholder='{"name": "{{user_name}}"} // Ctrl+/ comments a line'></textarea>
195
+ <div class="muted small body-hint" id="body-hint"></div>
196
+ </div>
197
+ <div id="body-form-wrap" hidden>
198
+ <div id="kv-form" class="kv"></div>
199
+ <p class="muted small" id="form-hint"></p>
200
+ </div>
201
+ <div id="body-binary-wrap" hidden>
202
+ <div class="row tight">
203
+ <input id="f-binary-path" class="grow mono" placeholder="Path to the file to send, e.g. C:\data\photo.jpg" spellcheck="false">
204
+ <button id="btn-binary-browse">Browse…</button>
205
+ </div>
206
+ <p class="muted small" id="binary-info"></p>
207
+ </div>
208
+ <div id="body-graphql-wrap" hidden>
209
+ <div class="gql">
210
+ <div><div class="muted small">Query</div><textarea id="f-gql-query" class="mono" rows="10" spellcheck="false" placeholder="query { me { id name } }"></textarea></div>
211
+ <div><div class="muted small">Variables (JSON)</div><textarea id="f-gql-vars" class="mono" rows="10" spellcheck="false" placeholder='{"id": 1}'></textarea></div>
212
+ </div>
213
+ </div>
214
+ </div>
215
+ </div>
216
+ </div>
217
+ </div>
218
+ <div class="tab-panel" data-panel="tests" hidden><div id="tests-panel"></div></div>
219
+ <div class="tab-panel" data-panel="settings" hidden>
220
+ <label class="field">Timeout (seconds) <input id="f-timeout" type="number" min="1" step="1" value="30"></label>
221
+ <label class="field">Follow redirects
222
+ <select id="f-redirects"><option value="">Use global setting</option><option value="1">Yes</option><option value="0">No</option></select>
223
+ </label>
224
+ <label class="field"><input type="checkbox" id="f-send-cookies" checked> Send stored cookies with this request</label>
225
+ <label class="field"><input type="checkbox" id="f-store-cookies" checked> Store cookies from the response</label>
226
+ <label class="field"><input type="checkbox" id="f-stream"> Stream the response live <span class="muted small">(Server-Sent Events, chunked and AI-style streaming endpoints)</span></label>
227
+ <div class="ts-sub" style="margin-top:16px">Depends on another request</div>
228
+ <p class="muted small">Send another request first, for example one that fetches a token and saves it with an extraction or <code>pm.environment.set("token", …)</code>. It is sent again only when its last result is older than the expiry, so one token serves many sends.</p>
229
+ <label class="field">Request <select id="f-dep"><option value="">none</option></select></label>
230
+ <div id="f-dep-opts" hidden>
231
+ <label class="field">Send it again after <input id="f-dep-ttl" type="number" min="0" step="1" value="30" style="width:80px"> <select id="f-dep-unit"><option value="60">minutes</option><option value="1">seconds</option><option value="3600">hours</option></select> <span class="muted small">0 = before every send</span></label>
232
+ <label class="field"><input type="checkbox" id="f-dep-retry" checked> If this request gets 401 or 403, refresh it and retry once</label>
233
+ <div class="muted small" id="f-dep-status"></div>
234
+ </div>
235
+ <p class="muted small">SSL verification, proxy, client certificates and the redirect default live in <button id="link-settings" class="link small" style="padding:0">⚙ Settings</button>.</p>
236
+ </div>
237
+ </div>
238
+ </div>
239
+
240
+ <div id="response" class="response" hidden>
241
+ <div id="resp-bodies" class="resp-bodies" hidden></div>
242
+ <div class="response-head">
243
+ <span id="r-body-name" class="badge" hidden></span>
244
+ <span id="r-status" class="status"></span>
245
+ <span id="r-time" class="muted small"></span>
246
+ <span id="r-size" class="muted small"></span>
247
+ <span id="r-tests-badge" class="tests-badge" hidden></span>
248
+ <span id="r-dep" class="dep-badge" hidden></span>
249
+ <span class="grow"></span>
250
+ <div class="tabs small" id="resp-tabs">
251
+ <button data-tab="body" class="active">Body</button>
252
+ <button data-tab="cookies">Cookies<span class="tab-n" id="n-r-cookies"></span></button>
253
+ <button data-tab="headers">Headers<span class="tab-n" id="n-r-headers"></span></button>
254
+ <button data-tab="tests">Tests<span class="tab-n" id="n-r-tests"></span></button>
255
+ <button data-tab="request">Request</button>
256
+ </div>
257
+ <button id="r-layout" class="copy-btn icon-only" title="Move the response to the right of the request"><svg viewBox="0 0 16 16" aria-hidden="true"><rect x="2" y="2" width="5" height="12" rx="1"/><rect x="9" y="2" width="5" height="12" rx="1" opacity=".45"/></svg></button>
258
+ <button id="r-max" class="copy-btn icon-only" title="Maximize the response (Esc restores)">⤢</button>
259
+ <button id="r-collapse" class="copy-btn icon-only" title="Hide the response to see the whole request">▾</button>
260
+ <button id="r-save" class="copy-btn" title="Save the response body to a file">
261
+ <svg viewBox="0 0 24 24" width="14" height="14" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" d="M12 4v11m0 0l-4-4m4 4l4-4M5 19h14"/></svg>
262
+ <span>Save</span>
263
+ </button>
264
+ <button id="r-copy" class="copy-btn" title="Copy the response body">
265
+ <svg viewBox="0 0 24 24" width="14" height="14" aria-hidden="true"><rect x="9" y="9" width="11" height="11" rx="2" fill="none" stroke="currentColor" stroke-width="1.8"/><path d="M5 15V6a2 2 0 0 1 2-2h9" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/></svg>
266
+ <span>Copy</span>
267
+ </button>
268
+ </div>
269
+ <div class="tab-panels" id="resp-panels">
270
+ <div id="r-body" class="tab-panel r-panel" data-panel="body"></div>
271
+ <div id="r-cookies" class="tab-panel r-panel" data-panel="cookies" hidden></div>
272
+ <div id="r-headers" class="tab-panel r-panel" data-panel="headers" hidden></div>
273
+ <div id="r-tests" class="tab-panel r-panel" data-panel="tests" hidden></div>
274
+ <div id="r-request" class="tab-panel r-panel" data-panel="request" hidden></div>
275
+ </div>
276
+ </div>
277
+ </div>
278
+ </section>
279
+
280
+ <!-- -------------------------------------------------------------- runs -->
281
+ <aside class="runs" id="runs-panel">
282
+ <div class="tabs" id="runs-tabs">
283
+ <button data-tab="current" class="active">Current run</button>
284
+ <button data-tab="history" title="Collection runs and multi-body sends, newest first">Run history</button>
285
+ <button data-tab="requests" title="Every request sent, newest first">Request history</button>
286
+ <span class="grow"></span>
287
+ <button id="runs-close" class="icon-btn tabs-close" title="Hide this panel (the Runs button in the status bar brings it back)">✕</button>
288
+ </div>
289
+ <div class="tab-panels grow-panels" id="runs-panels">
290
+ <div id="run-current" class="tab-panel run-panel" data-panel="current">
291
+ <div class="empty"><p>No run yet.</p><p class="muted small">Tick requests in the list and press “Run selected”. Each one is sent in order and every response is saved to a folder.</p></div>
292
+ </div>
293
+ <div id="run-history" class="tab-panel run-panel" data-panel="history" hidden></div>
294
+ <div class="tab-panel side-panel" data-panel="requests" hidden>
295
+ <div class="sidebar-head">
296
+ <input id="history-search" type="search" placeholder="Filter by name, URL, method or status…" autocomplete="off">
297
+ <button id="btn-history-clear" class="link small" title="Clear the whole request history">Clear</button>
298
+ </div>
299
+ <div id="history-filters" class="h-filters">
300
+ <button data-status="" class="on">All</button><button data-status="2xx" class="ok-text">2xx</button><button data-status="3xx">3xx</button><button data-status="4xx" class="warn-text">4xx</button><button data-status="5xx" class="err-text">5xx</button><button data-status="error" class="err-text" title="No response: network errors and cancelled sends">Errors</button>
301
+ </div>
302
+ <div id="history-compare" class="h-compare" hidden></div>
303
+ <ul id="history-list" class="req-list history-list"></ul>
304
+ </div>
305
+ </div>
306
+ </aside>
307
+ </main>
308
+
309
+ <section id="console" class="console" hidden>
310
+ <div id="console-resize" class="console-resize" title="Drag to resize"></div>
311
+ <div class="console-bar">
312
+ <strong>Console</strong>
313
+ <input id="console-filter" type="search" placeholder="Filter by URL, method, status, request…" autocomplete="off">
314
+ <label class="small"><input type="checkbox" id="console-errors"> Errors only</label>
315
+ <span id="console-info" class="muted small"></span>
316
+ <span class="grow"></span>
317
+ <button id="console-expand" class="link small" title="Expand or collapse all entries">Expand all</button>
318
+ <button id="console-clear" class="link small" title="Clear the log">Clear</button>
319
+ <button id="console-close" class="icon-btn" title="Close console (Ctrl+Alt+C)">✕</button>
320
+ </div>
321
+ <div id="console-list" class="console-list"></div>
322
+ </section>
323
+ <footer class="statusbar">
324
+ <button id="btn-console" class="status-btn" title="Show every request sent by the backend (Ctrl+Alt+C)">
325
+ <svg viewBox="0 0 24 24" width="14" height="14" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" d="M4 6l5 6-5 6M12 18h8"/></svg>
326
+ Console <span id="console-count" class="sb-count"></span><span id="console-errcount" class="sb-count err" hidden></span>
327
+ </button>
328
+ <span id="sb-last" class="sb-last"></span>
329
+ <button id="sb-ssl" class="sb-ssl" hidden title="SSL certificate verification is off. Click to change.">⚠ SSL verification off</button>
330
+ <button id="sb-proxy" class="sb-ssl" hidden title="Requests go through a proxy. Click to change.">⇄ Proxy on</button>
331
+ <button id="sb-monitors" class="sb-ssl" hidden title="A monitor is failing. Click to see the checks.">⚠ Monitor failing</button>
332
+ <span class="grow"></span>
333
+ <button id="sb-runs" class="status-btn" title="Show or hide the runs and history panel">▶ Runs &amp; history</button>
334
+ <span id="sb-layout" class="sb-seg" title="Where the response is shown">
335
+ <span class="sb-seg-label">Response</span>
336
+ <button data-layout="below" class="on" title="Show the response below the request"><svg viewBox="0 0 16 16" aria-hidden="true"><rect x="2" y="2" width="12" height="5" rx="1"/><rect x="2" y="9" width="12" height="5" rx="1" opacity=".45"/></svg>below</button>
337
+ <button data-layout="beside" title="Show the response to the right of the request"><svg viewBox="0 0 16 16" aria-hidden="true"><rect x="2" y="2" width="5" height="12" rx="1"/><rect x="9" y="2" width="5" height="12" rx="1" opacity=".45"/></svg>right</button>
338
+ </span>
339
+ <span id="sb-env" class="sb-env"></span>
340
+ </footer>
341
+
342
+ <datalist id="header-names">
343
+ <option value="Accept"><option value="Accept-Encoding"><option value="Accept-Language"><option value="Authorization">
344
+ <option value="Cache-Control"><option value="Content-Type"><option value="Cookie"><option value="If-Match"><option value="If-None-Match">
345
+ <option value="If-Modified-Since"><option value="Origin"><option value="Referer"><option value="User-Agent"><option value="X-API-Key">
346
+ <option value="X-Requested-With"><option value="X-Request-ID"><option value="X-Correlation-ID"><option value="Idempotency-Key">
347
+ </datalist>
348
+ <datalist id="header-values">
349
+ <option value="application/json"><option value="application/xml"><option value="text/plain"><option value="text/html">
350
+ <option value="application/x-www-form-urlencoded"><option value="multipart/form-data"><option value="Bearer {{token}}">
351
+ <option value="Basic {{credentials}}"><option value="no-cache"><option value="gzip, deflate"><option value="*/*">
352
+ </datalist>
353
+
354
+ <div id="modal" class="modal-backdrop" hidden>
355
+ <div class="modal">
356
+ <div class="modal-head"><h3 id="modal-title"></h3><button id="modal-close" class="link">✕</button></div>
357
+ <div id="modal-body" class="modal-body"></div>
358
+ <div id="modal-foot" class="modal-foot"></div>
359
+ </div>
360
+ </div>
361
+ <div id="toast" class="toast" hidden></div>
362
+ <input type="file" id="import-file" accept="application/json,.json,.yaml,.yml,.har,.txt,.sh" hidden>
363
+ <input type="file" id="data-file" accept=".csv,.json,text/csv,application/json" hidden>
364
+
365
+ <script src="/static/vendor/codemirror.js"></script>
366
+ <script src="/static/editor.js"></script>
367
+ <script src="/static/viewer.js"></script>
368
+ <script src="/static/codegen.js"></script>
369
+ <script src="/static/app.js"></script>
370
+ <script src="/static/features.js"></script>
371
+ </body>
372
+ </html>
pyhttp/static/logo.svg ADDED
@@ -0,0 +1,13 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32" height="32">
2
+ <defs>
3
+ <linearGradient id="g" x1="0" y1="0" x2="1" y2="1">
4
+ <stop offset="0" stop-color="#3b82f6"/>
5
+ <stop offset="1" stop-color="#10b981"/>
6
+ </linearGradient>
7
+ </defs>
8
+ <rect x="1" y="1" width="30" height="30" rx="8" fill="url(#g)"/>
9
+ <g fill="none" stroke="#fff" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round">
10
+ <path d="M8 12h15M19 8l4 4-4 4"/>
11
+ <path d="M24 20H9M13 16l-4 4 4 4" opacity=".8"/>
12
+ </g>
13
+ </svg>