httpdbg 2.1.0__tar.gz → 2.1.2__tar.gz

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.
Files changed (100) hide show
  1. {httpdbg-2.1.0 → httpdbg-2.1.2}/PKG-INFO +1 -1
  2. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/__init__.py +1 -1
  3. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/export.py +1 -0
  4. httpdbg-2.1.2/httpdbg/webapp/static/api.js +187 -0
  5. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/webapp/static/index.htm +38 -4
  6. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/webapp/static/render.js +15 -9
  7. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg.egg-info/PKG-INFO +1 -1
  8. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg.egg-info/SOURCES.txt +0 -1
  9. httpdbg-2.1.0/httpdbg/webapp/static/api.js +0 -175
  10. httpdbg-2.1.0/httpdbg/webapp/static/icons/information-mark-circle-outline-icon.svg +0 -1
  11. {httpdbg-2.1.0 → httpdbg-2.1.2}/LICENSE +0 -0
  12. {httpdbg-2.1.0 → httpdbg-2.1.2}/README.md +0 -0
  13. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/__main__.py +0 -0
  14. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/args.py +0 -0
  15. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/env.py +0 -0
  16. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/exception.py +0 -0
  17. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/hooks/__init__.py +0 -0
  18. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/hooks/aiohttp.py +0 -0
  19. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/hooks/all.py +0 -0
  20. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/hooks/external.py +0 -0
  21. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/hooks/fastapi.py +0 -0
  22. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/hooks/flask.py +0 -0
  23. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/hooks/generic.py +0 -0
  24. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/hooks/h2.py +0 -0
  25. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/hooks/http.py +0 -0
  26. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/hooks/httpx.py +0 -0
  27. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/hooks/pytest.py +0 -0
  28. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/hooks/record.py +0 -0
  29. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/hooks/recordhttp1.py +0 -0
  30. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/hooks/recordhttp2.py +0 -0
  31. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/hooks/requests.py +0 -0
  32. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/hooks/socket.py +0 -0
  33. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/hooks/starlette.py +0 -0
  34. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/hooks/template_sitecustomize.py +0 -0
  35. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/hooks/unittest.py +0 -0
  36. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/hooks/urllib3.py +0 -0
  37. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/hooks/utils.py +0 -0
  38. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/hooks/uvicorn.py +0 -0
  39. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/http_status_code.py +0 -0
  40. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/initiator.py +0 -0
  41. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/log.py +0 -0
  42. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/mode_console.py +0 -0
  43. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/mode_module.py +0 -0
  44. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/mode_script.py +0 -0
  45. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/preview.py +0 -0
  46. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/records.py +0 -0
  47. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/server.py +0 -0
  48. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/utils.py +0 -0
  49. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/webapp/__init__.py +0 -0
  50. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/webapp/api.py +0 -0
  51. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/webapp/app.py +0 -0
  52. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/webapp/static/column.css +0 -0
  53. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/webapp/static/configuration.css +0 -0
  54. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/webapp/static/configuration.js +0 -0
  55. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/webapp/static/detail.css +0 -0
  56. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/webapp/static/favicon.ico +0 -0
  57. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/webapp/static/filter.js +0 -0
  58. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/webapp/static/icons/chevron-direction-top-outline-icon.svg +0 -0
  59. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/webapp/static/icons/download-install-line-icon.svg +0 -0
  60. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/webapp/static/icons/engine-gears-icon.svg +0 -0
  61. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/webapp/static/icons/eye-blind-icon.svg +0 -0
  62. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/webapp/static/icons/eye-icon.svg +0 -0
  63. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/webapp/static/icons/files-papers-outline-icon.svg +0 -0
  64. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/webapp/static/icons/filter-outline-icon.svg +0 -0
  65. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/webapp/static/icons/lock-line-icon.svg +0 -0
  66. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/webapp/static/icons/lock-open-line-icon.svg +0 -0
  67. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/webapp/static/icons/math-multiplication-icon.svg +0 -0
  68. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/webapp/static/icons/push-pin-green-icon.svg +0 -0
  69. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/webapp/static/icons/question-mark-round-line-icon.svg +0 -0
  70. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/webapp/static/icons/recycle-bin-line-icon.svg +0 -0
  71. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/webapp/static/icons/wait-sandclock-icon.svg +0 -0
  72. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/webapp/static/main.js +0 -0
  73. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/webapp/static/mustache.min.js +0 -0
  74. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/webapp/static/style.css +0 -0
  75. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg/webapp/static/table.css +0 -0
  76. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg.egg-info/dependency_links.txt +0 -0
  77. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg.egg-info/entry_points.txt +0 -0
  78. {httpdbg-2.1.0 → httpdbg-2.1.2}/httpdbg.egg-info/top_level.txt +0 -0
  79. {httpdbg-2.1.0 → httpdbg-2.1.2}/pyproject.toml +0 -0
  80. {httpdbg-2.1.0 → httpdbg-2.1.2}/setup.cfg +0 -0
  81. {httpdbg-2.1.0 → httpdbg-2.1.2}/tests/test_api.py +0 -0
  82. {httpdbg-2.1.0 → httpdbg-2.1.2}/tests/test_cli.py +0 -0
  83. {httpdbg-2.1.0 → httpdbg-2.1.2}/tests/test_context_manager.py +0 -0
  84. {httpdbg-2.1.0 → httpdbg-2.1.2}/tests/test_hook_aiohttp.py +0 -0
  85. {httpdbg-2.1.0 → httpdbg-2.1.2}/tests/test_hook_h2.py +0 -0
  86. {httpdbg-2.1.0 → httpdbg-2.1.2}/tests/test_hook_httpx.py +0 -0
  87. {httpdbg-2.1.0 → httpdbg-2.1.2}/tests/test_hook_pytest.py +0 -0
  88. {httpdbg-2.1.0 → httpdbg-2.1.2}/tests/test_hook_requests.py +0 -0
  89. {httpdbg-2.1.0 → httpdbg-2.1.2}/tests/test_hook_unittest.py +0 -0
  90. {httpdbg-2.1.0 → httpdbg-2.1.2}/tests/test_hook_urllib3.py +0 -0
  91. {httpdbg-2.1.0 → httpdbg-2.1.2}/tests/test_initiator.py +0 -0
  92. {httpdbg-2.1.0 → httpdbg-2.1.2}/tests/test_mode_console.py +0 -0
  93. {httpdbg-2.1.0 → httpdbg-2.1.2}/tests/test_mode_module_pytest.py +0 -0
  94. {httpdbg-2.1.0 → httpdbg-2.1.2}/tests/test_mode_script.py +0 -0
  95. {httpdbg-2.1.0 → httpdbg-2.1.2}/tests/test_multiprocess.py +0 -0
  96. {httpdbg-2.1.0 → httpdbg-2.1.2}/tests/test_preview.py +0 -0
  97. {httpdbg-2.1.0 → httpdbg-2.1.2}/tests/test_pyhttpdbg_server.py +0 -0
  98. {httpdbg-2.1.0 → httpdbg-2.1.2}/tests/test_server.py +0 -0
  99. {httpdbg-2.1.0 → httpdbg-2.1.2}/tests/test_server_hook_fastapi.py +0 -0
  100. {httpdbg-2.1.0 → httpdbg-2.1.2}/tests/test_server_hook_flask.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: httpdbg
3
- Version: 2.1.0
3
+ Version: 2.1.2
4
4
  Summary: A very simple tool to debug HTTP(S) client and server requests.
5
5
  Author-email: cle-b <cle@tictac.pm>
6
6
  License: Apache-2.0
@@ -1,4 +1,4 @@
1
- __version__ = "2.1.0"
1
+ __version__ = "2.1.2"
2
2
 
3
3
  __all__ = ["export_html", "httprecord", "HTTPRecords"]
4
4
 
@@ -94,6 +94,7 @@ def generate_html(records: HTTPRecords, for_export: bool = True) -> str:
94
94
  global.static_requests = JSON.parse(
95
95
  document.getElementById('requests-map').textContent
96
96
  );
97
+ global.connected = false;
97
98
  </script>
98
99
  """
99
100
 
@@ -0,0 +1,187 @@
1
+ "use strict";
2
+
3
+ const global = {
4
+ session: null,
5
+ sessions: {},
6
+ requests: {},
7
+ initiators: {},
8
+ groups: {},
9
+ connected: false,
10
+ group_collapse: [],
11
+ groupby: "default"
12
+ }
13
+
14
+ function save_request(request_id, request, session_id) {
15
+ const initiator = global.initiators[request.initiator_id] ?? null;
16
+ if (initiator !== null) { // the initiator may be missing if the clean list is executed in parrallel
17
+ request.loaded = false;
18
+ request.to_refresh = true;
19
+ if (request.pin == undefined) {
20
+ request.pin = "";
21
+ }
22
+ if (request.filter == undefined) {
23
+ request.filter = "---";
24
+ }
25
+ request.session_id = session_id;
26
+ request.initiator = initiator;
27
+
28
+ if (request.in_progress) {
29
+ request.status_code_view = '<svg class="icon" alt="loading"><use href="#wait-sandclock-icon"></use></svg>';
30
+ } else {
31
+ switch (request.status_code) {
32
+ case 0:
33
+ request.status_code_view = '<svg class="icon" alt="loading"><use href="#wait-sandclock-icon"></use></svg>';
34
+ break;
35
+ case -1:
36
+ request.status_code_view = '<svg class="icon" alt="load failed"><use href="#math-multiplication-icon"></use></svg>';
37
+ break;
38
+ default:
39
+ request.status_code_view = request.status_code;
40
+ break;
41
+ }
42
+ }
43
+
44
+ global.requests[request_id] = request;
45
+
46
+ if (!request.pin) {
47
+ get_request(request_id);
48
+ }
49
+ }
50
+ }
51
+
52
+ async function load_all_requests() {
53
+ // export mode
54
+ if (typeof global.static_all_requests !== "undefined") {
55
+ global.connected = false;
56
+ return global.static_all_requests;
57
+ }
58
+
59
+ // connected mode
60
+ var requests_already_loaded = 0
61
+ for (const [request_id, request] of Object.entries(global.requests)) {
62
+ if (request.loaded && (global.session == request.session_id)) {
63
+ requests_already_loaded += 1;
64
+ }
65
+ }
66
+ var url = "/requests?" + new URLSearchParams({
67
+ "id": global.session,
68
+ "requests_already_loaded": requests_already_loaded,
69
+ })
70
+
71
+ try {
72
+ const res = await fetch(url);
73
+ const data = await res.json();
74
+ global.connected = true;
75
+ return data;
76
+ } catch (error) {
77
+ global.connected = false;
78
+ return null;
79
+ }
80
+ }
81
+
82
+
83
+ async function get_all_requests() {
84
+
85
+ const data = await load_all_requests();
86
+
87
+ if (!data) {
88
+ return;
89
+ }
90
+
91
+ if (data.session.id != global.session) {
92
+ clean();
93
+ global.session = data.session.id;
94
+ global.sessions[data.session.id] = data.session;
95
+ };
96
+
97
+ // for the initiators and the groups, we can just save them without any verification
98
+ Object.assign(global.initiators, data.initiators);
99
+ Object.assign(global.groups, data.groups);
100
+
101
+ // for the requests, we may have to update them
102
+ for (const [request_id, request] of Object.entries(data.requests)) {
103
+ if (!(request_id in global.requests)) {
104
+ // this is a new request
105
+ save_request(request_id, request, data.session.id);
106
+ } else {
107
+ if (global.requests[request_id].last_update < request.last_update) {
108
+ // this request has been updated (probably a "big" file)
109
+ save_request(request_id, request, data.session.id);
110
+ }
111
+ };
112
+ };
113
+ }
114
+
115
+ async function load_request(request_id) {
116
+ if (typeof global.static_requests !== "undefined") {
117
+ global.connected = false;
118
+ return global.static_requests[request_id];
119
+ }
120
+
121
+ try {
122
+ const res = await fetch("/request/" + request_id);
123
+ const data = await res.json();
124
+ global.connected = true;
125
+ return data;
126
+ } catch (error) {
127
+ global.connected = false;
128
+ return null;
129
+ }
130
+ }
131
+
132
+ async function get_request(request_id) {
133
+
134
+ const data = await load_request(request_id);
135
+
136
+ if (!data) {
137
+ return;
138
+ }
139
+
140
+ global.requests[request_id].filter = prepare_for_filter(global.requests[request_id].url);
141
+
142
+ global.requests[request_id].request = data.request;
143
+ if (data.request.body && data.request.body.text) {
144
+ global.requests[request_id].filter += " " + prepare_for_filter(
145
+ parse_raw_text(
146
+ data.request.body.text,
147
+ data.request.body.content_type
148
+ ) || data.request.body.text
149
+ );
150
+ }
151
+
152
+ global.requests[request_id].response = data.response;
153
+ if (data.response.body && data.response.body.text) {
154
+ global.requests[request_id].filter += " " + prepare_for_filter(
155
+ parse_raw_text(
156
+ data.response.body.text,
157
+ data.response.body.content_type
158
+ ) || data.response.body.text
159
+ );
160
+ }
161
+
162
+ // the full stack is not present in request summary
163
+ global.requests[request_id].initiator_id = data.initiator_id;
164
+ global.requests[request_id].exception = data.exception;
165
+
166
+ global.requests[request_id].to_refresh = true;
167
+
168
+ global.requests[request_id].loaded = true;
169
+ }
170
+
171
+ async function pol_new_data() {
172
+
173
+ while (true) {
174
+ await Promise.all([
175
+ get_all_requests(),
176
+ wait_for(1000)
177
+ ]);
178
+ }
179
+ }
180
+
181
+ function pin_request(request_id, pin) {
182
+ if (pin) {
183
+ global.requests[request_id].pin = "checked";
184
+ } else {
185
+ global.requests[request_id].pin = "";
186
+ }
187
+ }
@@ -8,6 +8,22 @@
8
8
 
9
9
  <link rel="shortcut icon" href="static/favicon.ico">
10
10
 
11
+ <style>
12
+ .compact-mode {
13
+ display: none !important;
14
+ }
15
+
16
+ @media (max-width: 900px) {
17
+ .default-mode {
18
+ display: none !important;
19
+ }
20
+
21
+ .compact-mode {
22
+ display: block !important;
23
+ }
24
+ }
25
+ </style>
26
+
11
27
  $**PRELOAD_ICONS**$
12
28
 
13
29
  <link rel="stylesheet" href="static/style.css">
@@ -28,7 +44,7 @@
28
44
  </head>
29
45
 
30
46
  <body>
31
- <header>
47
+ <header class="default-mode">
32
48
  <nav id="navbar">
33
49
  <div class="menu-left">
34
50
  <button id="trash" type="button" onclick="clean(true)" title="Delete all unpinned requests.">
@@ -126,7 +142,7 @@
126
142
  </nav>
127
143
  </header>
128
144
 
129
- <div id="help">
145
+ <div id="help" class="default-mode">
130
146
  <h4>About</h4>
131
147
  httpdbg v$**HTTPDBG_VERSION**$
132
148
  <br>
@@ -163,7 +179,7 @@
163
179
  <br>
164
180
  </div>
165
181
 
166
- <div class="grid-container">
182
+ <div class="grid-container default-mode">
167
183
 
168
184
  <div class="grid-column grid-column-left">
169
185
 
@@ -361,7 +377,6 @@
361
377
  {{#body}}
362
378
  {{#body.path}}
363
379
  <a href="{{body.path}}" download="{{body.filename}}" class="need-server"><button title="download"><svg class="icon"><use href="#download-install-line-icon"></use></svg></button></a>
364
- <svg class="icon need-server-info"><use href="#information-mark-circle-outline-icon"></use></svg>
365
380
  {{/body.path}}
366
381
 
367
382
  {{#body.text}}
@@ -430,6 +445,25 @@
430
445
  </table>
431
446
  </div>
432
447
  </div>
448
+
449
+ <div class="compact-mode">
450
+ <b><i>You're seeing a simplified view of the HTTP traces report. Make your window larger to see the full
451
+ interface.</i></b>
452
+ <br>
453
+ <ul id="requests-list-compact-mode">
454
+ <script id="template_request_compact_mode" type="x-tmpl-mustache">
455
+ <li id="request-compact-mode-{{id}}">
456
+ {{verb}} {{{status_code_view}}} {{netloc}}{{urlext}}
457
+ </li>
458
+ </script>
459
+ </ul>
460
+
461
+ <b><i>You're seeing a simplified view of the HTTP traces report. Make your window larger to see the full
462
+ interface.</i></b>
463
+ <br>
464
+ httpdbg v$**HTTPDBG_VERSION**$
465
+ </div>
466
+
433
467
  $**EXPORT**$
434
468
  <script>
435
469
  load_config_from_url(true);
@@ -14,6 +14,7 @@ async function refresh_resquests() {
14
14
 
15
15
  for (const [request_id, request] of Object.entries(global.requests)) {
16
16
  if (request.to_refresh) {
17
+ // refresh the default mode
17
18
  var elt = document.getElementById("request-" + request.id);
18
19
 
19
20
  request.title = request.url;
@@ -24,7 +25,7 @@ async function refresh_resquests() {
24
25
 
25
26
  let groupby = get_groupby(global.groupby, request);
26
27
 
27
- if(groupby) { // the group may be missing if the clean list is executed in parrallel
28
+ if (groupby) { // the group may be missing if the clean list is executed in parrallel
28
29
  request.groupby_id = groupby.id;
29
30
 
30
31
  var rendered = Mustache.render(template_request, request);
@@ -39,9 +40,20 @@ async function refresh_resquests() {
39
40
  } else {
40
41
  elt.innerHTML = rendered;
41
42
  };
42
-
43
- request.to_refresh = false;
43
+
44
+ request.to_refresh = false;
44
45
  }
46
+
47
+ // refresh the compact mode
48
+ var elt_compact_mode = document.getElementById("request-compact-mode" + request.id);
49
+ var template_request_compact_mode = document.getElementById("template_request_compact_mode").innerHTML;
50
+ var rendered_compact_mode = Mustache.render(template_request_compact_mode, request);
51
+ if (!elt_compact_mode) {
52
+ var elt_requests_list_compact_mode = document.getElementById("requests-list-compact-mode");
53
+ elt_requests_list_compact_mode.insertAdjacentHTML("beforeend", rendered_compact_mode);
54
+ } else {
55
+ elt_compact_mode.innerHTML = rendered_compact_mode;
56
+ };
45
57
  }
46
58
  };
47
59
  filter_requests_count();
@@ -248,7 +260,6 @@ async function disable_link_if_server_disconnected() {
248
260
 
249
261
  if (global.connected) {
250
262
  sheet.insertRule(".need-server {}");
251
- sheet.insertRule(".need-server-info {display: none;}");
252
263
  } else {
253
264
  sheet.insertRule(".need-server {\
254
265
  color: var(--link-server-disconnected);\
@@ -256,11 +267,6 @@ async function disable_link_if_server_disconnected() {
256
267
  opacity: 0.5;\
257
268
  text-decoration: none;\
258
269
  }");
259
- sheet.insertRule(".need-server-info {\
260
- display: inline;\
261
- color: var(--link-server-disconnected);\
262
- opacity: 0.5;\
263
- }");
264
270
  }
265
271
  }
266
272
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: httpdbg
3
- Version: 2.1.0
3
+ Version: 2.1.2
4
4
  Summary: A very simple tool to debug HTTP(S) client and server requests.
5
5
  Author-email: cle-b <cle@tictac.pm>
6
6
  License: Apache-2.0
@@ -68,7 +68,6 @@ httpdbg/webapp/static/icons/eye-blind-icon.svg
68
68
  httpdbg/webapp/static/icons/eye-icon.svg
69
69
  httpdbg/webapp/static/icons/files-papers-outline-icon.svg
70
70
  httpdbg/webapp/static/icons/filter-outline-icon.svg
71
- httpdbg/webapp/static/icons/information-mark-circle-outline-icon.svg
72
71
  httpdbg/webapp/static/icons/lock-line-icon.svg
73
72
  httpdbg/webapp/static/icons/lock-open-line-icon.svg
74
73
  httpdbg/webapp/static/icons/math-multiplication-icon.svg
@@ -1,175 +0,0 @@
1
- "use strict";
2
-
3
- const global = {
4
- session: null,
5
- sessions: {},
6
- requests: {},
7
- initiators: {},
8
- groups: {},
9
- connected: false,
10
- group_collapse: [],
11
- groupby: "default"
12
- }
13
-
14
- function save_request(request_id, request, session_id) {
15
- const initiator = global.initiators[request.initiator_id] ?? null;
16
- if (initiator !== null) { // the initiator may be missing if the clean list is executed in parrallel
17
- request.loaded = false;
18
- request.to_refresh = true;
19
- if (request.pin == undefined) {
20
- request.pin = "";
21
- }
22
- if (request.filter == undefined) {
23
- request.filter = "---";
24
- }
25
- request.session_id = session_id;
26
- request.initiator = initiator;
27
-
28
- if (request.in_progress) {
29
- request.status_code_view = '<svg class="icon" alt="loading"><use href="#wait-sandclock-icon"></use></svg>';
30
- } else {
31
- switch (request.status_code) {
32
- case 0:
33
- request.status_code_view = '<svg class="icon" alt="loading"><use href="#wait-sandclock-icon"></use></svg>';
34
- break;
35
- case -1:
36
- request.status_code_view = '<svg class="icon" alt="load failed"><use href="#math-multiplication-icon"></use></svg>';
37
- break;
38
- default:
39
- request.status_code_view = request.status_code;
40
- break;
41
- }
42
- }
43
-
44
- global.requests[request_id] = request;
45
-
46
- if (!request.pin) {
47
- get_request(request_id);
48
- }
49
- }
50
- }
51
-
52
- async function load_all_requests() {
53
- if (typeof global.static_all_requests !== "undefined") {
54
- return global.static_all_requests;
55
- }
56
-
57
- var requests_already_loaded = 0
58
- for (const [request_id, request] of Object.entries(global.requests)) {
59
- if (request.loaded && (global.session == request.session_id)) {
60
- requests_already_loaded += 1;
61
- }
62
- }
63
- var url = "/requests?" + new URLSearchParams({
64
- "id": global.session,
65
- "requests_already_loaded": requests_already_loaded,
66
- })
67
-
68
- const res = await fetch(url);
69
- const data = await res.json();
70
- return data;
71
- }
72
-
73
-
74
- async function get_all_requests() {
75
-
76
- await load_all_requests()
77
- .then(data => {
78
- global.connected = true;
79
-
80
- if (data.session.id != global.session) {
81
- clean();
82
- global.session = data.session.id;
83
- global.sessions[data.session.id] = data.session;
84
- };
85
-
86
- // for the initiators and the groups, we can just save them without any verification
87
- Object.assign(global.initiators, data.initiators);
88
- Object.assign(global.groups, data.groups);
89
-
90
- // for the requests, we may have to update them
91
- for (const [request_id, request] of Object.entries(data.requests)) {
92
- if (!(request_id in global.requests)) {
93
- // this is a new request
94
- save_request(request_id, request, data.session.id);
95
- } else {
96
- if (global.requests[request_id].last_update < request.last_update) {
97
- // this request has been updated (probably a "big" file)
98
- save_request(request_id, request, data.session.id);
99
- }
100
- };
101
- };
102
- })
103
- .catch((error) => {
104
- global.connected = false;
105
- });
106
- }
107
-
108
- async function load_request(request_id) {
109
- if (typeof global.static_requests !== "undefined") {
110
- return global.static_requests[request_id];
111
- }
112
-
113
- const res = await fetch("/request/" + request_id);
114
- const data = await res.json();
115
- return data;
116
- }
117
-
118
- async function get_request(request_id) {
119
-
120
- await load_request(request_id)
121
- .then(data => {
122
- global.connected = true;
123
- global.requests[request_id].filter = prepare_for_filter(global.requests[request_id].url);
124
-
125
- global.requests[request_id].request = data.request;
126
- if (data.request.body && data.request.body.text) {
127
- global.requests[request_id].filter += " " + prepare_for_filter(
128
- parse_raw_text(
129
- data.request.body.text,
130
- data.request.body.content_type
131
- ) || data.request.body.text
132
- );
133
- }
134
-
135
- global.requests[request_id].response = data.response;
136
- if (data.response.body && data.response.body.text) {
137
- global.requests[request_id].filter += " " + prepare_for_filter(
138
- parse_raw_text(
139
- data.response.body.text,
140
- data.response.body.content_type
141
- ) || data.response.body.text
142
- );
143
- }
144
-
145
- // the full stack is not present in request summary
146
- global.requests[request_id].initiator_id = data.initiator_id;
147
- global.requests[request_id].exception = data.exception;
148
-
149
- global.requests[request_id].to_refresh = true;
150
-
151
- global.requests[request_id].loaded = true;
152
- })
153
- .catch((error) => {
154
- global.connected = false;
155
- });
156
-
157
- }
158
-
159
- async function pol_new_data() {
160
-
161
- while (true) {
162
- await Promise.all([
163
- get_all_requests(),
164
- wait_for(1000)
165
- ]);
166
- }
167
- }
168
-
169
- function pin_request(request_id, pin) {
170
- if (pin) {
171
- global.requests[request_id].pin = "checked";
172
- } else {
173
- global.requests[request_id].pin = "";
174
- }
175
- }
@@ -1 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" shape-rendering="geometricPrecision" text-rendering="geometricPrecision" image-rendering="optimizeQuality" fill-rule="evenodd" clip-rule="evenodd" viewBox="0 0 512 512"><path fill-rule="nonzero" d="M256 0c70.69 0 134.7 28.66 181.02 74.98C483.34 121.31 512 185.31 512 256c0 70.69-28.66 134.7-74.98 181.02C390.7 483.34 326.69 512 256 512c-70.69 0-134.7-28.66-181.02-74.98C28.66 390.7 0 326.69 0 256c0-70.69 28.66-134.69 74.98-181.02C121.3 28.66 185.31 0 256 0zm17.75 342.25h29.15v29.32h-93.79v-29.32h28.76v-92.34h-28.76v-29.32h64.64v121.66zm-27.94-150.37c-7.08-.05-13.12-2.53-18.2-7.56-5.08-5.01-7.56-11.11-7.56-18.25 0-7.01 2.48-13.06 7.56-18.08 5.08-5.02 11.12-7.55 18.2-7.55 6.95 0 12.99 2.53 18.08 7.55 5.13 5.02 7.67 11.07 7.67 18.08 0 4.72-1.2 9.07-3.56 12.94-2.36 3.93-5.45 7.07-9.31 9.37-3.87 2.3-8.17 3.45-12.88 3.5zm171.9-97.59C376.33 52.92 319.15 27.32 256 27.32c-63.15 0-120.33 25.6-161.71 66.97C52.92 135.68 27.32 192.85 27.32 256c0 63.15 25.6 120.33 66.97 161.71 41.38 41.37 98.56 66.97 161.71 66.97 63.15 0 120.33-25.6 161.71-66.97 41.37-41.38 66.97-98.56 66.97-161.71 0-63.15-25.6-120.32-66.97-161.71z"/></svg>
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes