Skip to content

Commit 8435000

Browse files
authored
Merge pull request #853 from dienhoa/fix/ws-hdrs-lookup
Fix ws header lookup key mismatch
2 parents d5b5415 + d17be3c commit 8435000

2 files changed

Lines changed: 35 additions & 17 deletions

File tree

fasthtml/core.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ async def _handle(f, *args, **kwargs):
267267

268268
# %% ../nbs/api/00_core.ipynb #ad0f0e87
269269
async def _wrap_ws(ws, data, params):
270-
hdrs = {k.lower().replace('-','_'):v for k,v in data.pop('HEADERS', {}).items()}
270+
hdrs = Headers({k.lower():v for k,v in data.pop('HEADERS', {}).items()})
271271
return await _find_ps(ws, data, hdrs, params)
272272

273273
# %% ../nbs/api/00_core.ipynb #dcc15129

nbs/api/00_core.ipynb

Lines changed: 34 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -132,10 +132,10 @@
132132
{
133133
"data": {
134134
"text/plain": [
135-
"datetime.datetime(2026, 3, 24, 14, 0)"
135+
"datetime.datetime(2026, 3, 27, 14, 0)"
136136
]
137137
},
138-
"execution_count": null,
138+
"execution_count": 13,
139139
"metadata": {},
140140
"output_type": "execute_result"
141141
}
@@ -156,7 +156,7 @@
156156
"True"
157157
]
158158
},
159-
"execution_count": null,
159+
"execution_count": 14,
160160
"metadata": {},
161161
"output_type": "execute_result"
162162
}
@@ -191,7 +191,7 @@
191191
"'Snake-Case'"
192192
]
193193
},
194-
"execution_count": null,
194+
"execution_count": 16,
195195
"metadata": {},
196196
"output_type": "execute_result"
197197
}
@@ -261,7 +261,7 @@
261261
"HtmxHeaders(boosted=None, current_url=None, history_restore_request=None, prompt=None, request='1', target=None, trigger_name=None, trigger=None)"
262262
]
263263
},
264-
"execution_count": null,
264+
"execution_count": 19,
265265
"metadata": {},
266266
"output_type": "execute_result"
267267
}
@@ -428,7 +428,7 @@
428428
"'HX-Trigger-After-Settle'"
429429
]
430430
},
431-
"execution_count": null,
431+
"execution_count": 29,
432432
"metadata": {},
433433
"output_type": "execute_result"
434434
}
@@ -464,7 +464,7 @@
464464
"HttpHeader(k='HX-Trigger-After-Settle', v='hi')"
465465
]
466466
},
467-
"execution_count": null,
467+
"execution_count": 31,
468468
"metadata": {},
469469
"output_type": "execute_result"
470470
}
@@ -499,7 +499,7 @@
499499
"{'a': int, 'b': str}"
500500
]
501501
},
502-
"execution_count": null,
502+
"execution_count": 33,
503503
"metadata": {},
504504
"output_type": "execute_result"
505505
}
@@ -522,7 +522,7 @@
522522
"{'x': str, 'y': str}"
523523
]
524524
},
525-
"execution_count": null,
525+
"execution_count": 34,
526526
"metadata": {},
527527
"output_type": "execute_result"
528528
}
@@ -672,7 +672,7 @@
672672
"Foo(d={'a': 1})"
673673
]
674674
},
675-
"execution_count": null,
675+
"execution_count": 43,
676676
"metadata": {},
677677
"output_type": "execute_result"
678678
}
@@ -762,7 +762,7 @@
762762
"\"['1', '2']\""
763763
]
764764
},
765-
"execution_count": null,
765+
"execution_count": 47,
766766
"metadata": {},
767767
"output_type": "execute_result"
768768
}
@@ -894,7 +894,7 @@
894894
"name": "stdout",
895895
"output_type": "stream",
896896
"text": [
897-
"{'req': <starlette.requests.Request object>, 'this': <starlette.applications.Starlette object>, 'a': '1', 'b': HttpHeader(k='value1', v='value3'), 'state': <starlette.datastructures.State object>}\n"
897+
"{'req': <starlette.requests.Request object at 0x78026faa9ee0>, 'this': <starlette.applications.Starlette object at 0x78026fa67170>, 'a': '1', 'b': HttpHeader(k='value1', v='value3'), 'state': <starlette.datastructures.State object at 0x78026faa8ad0>}\n"
898898
]
899899
}
900900
],
@@ -920,7 +920,7 @@
920920
"name": "stdout",
921921
"output_type": "stream",
922922
"text": [
923-
"{'req': <starlette.requests.Request object>, 'this': <starlette.applications.Starlette object>, 'a': '1', 'b': HttpHeader(k='value1', v='value3')}\n"
923+
"{'req': <starlette.requests.Request object at 0x78026faaaff0>, 'this': <starlette.applications.Starlette object at 0x78026faa95e0>, 'a': '1', 'b': HttpHeader(k='value1', v='value3')}\n"
924924
]
925925
}
926926
],
@@ -962,7 +962,7 @@
962962
"name": "stdout",
963963
"output_type": "stream",
964964
"text": [
965-
"{'req': <starlette.requests.Request object>, 'this': <starlette.applications.Starlette object>, 'a': ''}\n"
965+
"{'req': <starlette.requests.Request object at 0x78026faabad0>, 'this': <starlette.applications.Starlette object at 0x78026faaaae0>, 'a': ''}\n"
966966
]
967967
}
968968
],
@@ -1083,7 +1083,7 @@
10831083
"source": [
10841084
"#| export\n",
10851085
"async def _wrap_ws(ws, data, params):\n",
1086-
" hdrs = {k.lower().replace('-','_'):v for k,v in data.pop('HEADERS', {}).items()}\n",
1086+
" hdrs = Headers({k.lower():v for k,v in data.pop('HEADERS', {}).items()})\n",
10871087
" return await _find_ps(ws, data, hdrs, params)"
10881088
]
10891089
},
@@ -1139,6 +1139,21 @@
11391139
" assert data == 'Message text was: Hi!', data"
11401140
]
11411141
},
1142+
{
1143+
"cell_type": "code",
1144+
"execution_count": null,
1145+
"id": "bda2e425",
1146+
"metadata": {},
1147+
"outputs": [],
1148+
"source": [
1149+
"def on_receive(hx_trigger:str): return f\"trigger: {hx_trigger}\"\n",
1150+
"cli = TestClient(Starlette(routes=[WebSocketRoute('/', _ws_endp(on_receive))]))\n",
1151+
"with cli.websocket_connect('/') as ws:\n",
1152+
" ws.send_text(json.dumps({\"HEADERS\": {\"Hx-Trigger\": \"my-btn\"}}))\n",
1153+
" data = ws.receive_text()\n",
1154+
" assert data == 'trigger: my-btn', data\n"
1155+
]
1156+
},
11421157
{
11431158
"cell_type": "code",
11441159
"execution_count": null,
@@ -4296,7 +4311,10 @@
42964311
]
42974312
}
42984313
],
4299-
"metadata": {},
4314+
"metadata": {
4315+
"solveit_dialog_mode": "learning",
4316+
"solveit_ver": 2
4317+
},
43004318
"nbformat": 4,
43014319
"nbformat_minor": 5
43024320
}

0 commit comments

Comments
 (0)