Application Log
2026/05/30 21:44:00 manager.go:96: [chromecast] found: Nest display (Google Nest Hub) at 192.168.86.188:8009
2026/05/30 21:44:00 manager.go:96: [chromecast] found: Upstairs (Google Cast Group) at 192.168.86.188:32003
2026/05/30 21:44:08 manager.go:243: [chromecast] sending Load to athan (192.168.86.188:32068) url=http://192.168.86.5:28427/media/media_Athan.mp3
2026/05/30 21:44:08 manager.go:249: [chromecast] Load command accepted by athan
2026/05/30 21:44:09 server.go:101: [media] serving embedded file: media_Athan.mp3
2026/05/30 23:16:00 scheduler.go:264: [scheduler] firing Isha Athan
2026/05/30 23:16:00 manager.go:147: [chromecast] PlayAthan: prayer=Isha file=media_Athan.mp3 full_url=http://192.168.86.5:28427/media/media_Athan.mp3
2026/05/30 23:16:00 manager.go:77: [chromecast] discovering devices via mDNS...
2026/05/30 23:16:00 manager.go:96: [chromecast] found: SHIELD (SHIELD Android TV) at 192.168.86.169:8009
2026/05/30 23:16:00 manager.go:96: [chromecast] found: Kitchen speaker (Google Nest Mini) at 192.168.86.148:8009
2026/05/30 23:16:00 manager.go:96: [chromecast] found: Downstairs (Google Cast Group) at 192.168.86.148:32081
2026/05/30 23:16:00 manager.go:96: [chromecast] found: All Nest minis (Google Cast Group) at 192.168.86.148:32124
2026/05/30 23:16:00 manager.go:96: [chromecast] found: Playroom Speaker (Google Nest Mini) at 192.168.86.234:8009
2026/05/30 23:16:00 manager.go:96: [chromecast] found: Party (Google Cast Group) at 192.168.86.188:32102
2026/05/30 23:16:00 manager.go:96: [chromecast] found: All Speakers (Google Cast Group) at 192.168.86.188:32197
2026/05/30 23:16:00 manager.go:96: [chromecast] found: athan (Google Cast Group) at 192.168.86.188:32068
2026/05/30 23:16:00 manager.go:96: [chromecast] found: Nest display (Google Nest Hub) at 192.168.86.188:8009
2026/05/30 23:16:00 manager.go:96: [chromecast] found: Upstairs (Google Cast Group) at 192.168.86.188:32003
2026/05/30 23:16:11 manager.go:302: [chromecast] connect attempt 1/3 failed: unable to connect to chromecast at '192.168.86.188:32068': dial tcp 192.168.86.188:32068: i/o timeout
2026/05/30 23:16:16 manager.go:302: [chromecast] connect attempt 2/3 failed: unable to connect to chromecast at '192.168.86.188:32068': dial tcp 192.168.86.188:32068: i/o timeout
2026/05/30 23:16:21 manager.go:302: [chromecast] connect attempt 3/3 failed: unable to connect to chromecast at '192.168.86.188:32068': dial tcp 192.168.86.188:32068: i/o timeout
2026/05/30 23:16:23 main.go:170: [main] speaker athan (Isha): connect to athan: failed to connect after 3 attempts
2026/05/31 01:00:00 scheduler.go:89: [scheduler] daily refresh triggered
2026/05/31 01:00:05 timesync.go:93: [timesync] synced via NTP server pool.ntp.org: 2026-05-31T01:00:05+01:00
2026/05/31 01:00:05 scheduler.go:274: [scheduler] scheduled Pre-Fajr Quran at 02:33 (in 93 min)
2026/05/31 01:00:05 scheduler.go:274: [scheduler] scheduled Fajr Athan at 03:03 (in 123 min)
2026/05/31 01:00:05 scheduler.go:274: [scheduler] scheduled Dhuhr Athan at 13:27 (in 747 min)
2026/05/31 01:00:05 scheduler.go:274: [scheduler] scheduled Asr Athan at 17:49 (in 1009 min)
2026/05/31 01:00:05 scheduler.go:274: [scheduler] scheduled Maghrib Athan at 21:45 (in 1245 min)
2026/05/31 01:00:05 scheduler.go:274: [scheduler] scheduled Isha Athan at 23:16 (in 1336 min)
2026/05/31 02:33:00 scheduler.go:264: [scheduler] firing Pre-Fajr Quran
2026/05/31 02:33:00 controller.go:48: [quran] starting speaker stream (dur=30m0s)
2026/05/31 02:33:00 manager.go:77: [chromecast] discovering devices via mDNS...
2026/05/31 02:33:00 manager.go:96: [chromecast] found: SHIELD (SHIELD Android TV) at 192.168.86.169:8009
2026/05/31 02:33:00 manager.go:96: [chromecast] found: Kitchen speaker (Google Nest Mini) at 192.168.86.148:8009
2026/05/31 02:33:00 manager.go:96: [chromecast] found: Downstairs (Google Cast Group) at 192.168.86.148:32081
2026/05/31 02:33:00 manager.go:96: [chromecast] found: All Nest minis (Google Cast Group) at 192.168.86.148:32124
2026/05/31 02:33:00 manager.go:96: [chromecast] found: Playroom Speaker (Google Nest Mini) at 192.168.86.234:8009
2026/05/31 02:33:00 manager.go:96: [chromecast] found: Party (Google Cast Group) at 192.168.86.188:32102
2026/05/31 02:33:00 manager.go:96: [chromecast] found: All Speakers (Google Cast Group) at 192.168.86.188:32197
2026/05/31 02:33:00 manager.go:96: [chromecast] found: athan (Google Cast Group) at 192.168.86.188:32068
2026/05/31 02:33:00 manager.go:96: [chromecast] found: Nest display (Google Nest Hub) at 192.168.86.188:8009
2026/05/31 02:33:00 manager.go:96: [chromecast] found: Upstairs (Google Cast Group) at 192.168.86.188:32003
2026/05/31 02:33:11 manager.go:302: [chromecast] connect attempt 1/3 failed: unable to connect to chromecast at '192.168.86.188:32068': dial tcp 192.168.86.188:32068: i/o timeout
2026/05/31 02:33:16 manager.go:302: [chromecast] connect attempt 2/3 failed: unable to connect to chromecast at '192.168.86.188:32068': dial tcp 192.168.86.188:32068: i/o timeout
2026/05/31 02:33:21 manager.go:302: [chromecast] connect attempt 3/3 failed: unable to connect to chromecast at '192.168.86.188:32068': dial tcp 192.168.86.188:32068: i/o timeout
2026/05/31 02:33:23 controller.go:52: [quran] speaker stream error: connect to athan: failed to connect after 3 attempts
2026/05/31 03:03:00 scheduler.go:264: [scheduler] firing Fajr Athan
2026/05/31 03:03:00 manager.go:147: [chromecast] PlayAthan: prayer=Fajr file=media_adhan_al_fajr.mp3 full_url=http://192.168.86.5:28427/media/media_adhan_al_fajr.mp3
2026/05/31 03:03:00 manager.go:77: [chromecast] discovering devices via mDNS...
2026/05/31 03:03:00 manager.go:96: [chromecast] found: SHIELD (SHIELD Android TV) at 192.168.86.169:8009
2026/05/31 03:03:00 manager.go:96: [chromecast] found: Playroom Speaker (Google Nest Mini) at 192.168.86.234:8009
2026/05/31 03:03:00 manager.go:96: [chromecast] found: Kitchen speaker (Google Nest Mini) at 192.168.86.148:8009
2026/05/31 03:03:00 manager.go:96: [chromecast] found: Downstairs (Google Cast Group) at 192.168.86.148:32081
2026/05/31 03:03:00 manager.go:96: [chromecast] found: All Nest minis (Google Cast Group) at 192.168.86.148:32124
2026/05/31 03:03:00 manager.go:96: [chromecast] found: Party (Google Cast Group) at 192.168.86.188:32102
2026/05/31 03:03:00 manager.go:96: [chromecast] found: All Speakers (Google Cast Group) at 192.168.86.188:32197
2026/05/31 03:03:00 manager.go:96: [chromecast] found: athan (Google Cast Group) at 192.168.86.188:32068
2026/05/31 03:03:00 manager.go:96: [chromecast] found: Nest display (Google Nest Hub) at 192.168.86.188:8009
2026/05/31 03:03:00 manager.go:96: [chromecast] found: Upstairs (Google Cast Group) at 192.168.86.188:32003
2026/05/31 03:03:11 manager.go:302: [chromecast] connect attempt 1/3 failed: unable to connect to chromecast at '192.168.86.188:32068': dial tcp 192.168.86.188:32068: i/o timeout
2026/05/31 03:03:16 manager.go:302: [chromecast] connect attempt 2/3 failed: unable to connect to chromecast at '192.168.86.188:32068': dial tcp 192.168.86.188:32068: i/o timeout
2026/05/31 03:03:21 manager.go:302: [chromecast] connect attempt 3/3 failed: unable to connect to chromecast at '192.168.86.188:32068': dial tcp 192.168.86.188:32068: i/o timeout
2026/05/31 03:03:23 main.go:170: [main] speaker athan (Fajr): connect to athan: failed to connect after 3 attempts
2026/05/31 03:58:37 server.go:308: [web/ws] client connected from 127.0.0.1:37516
2026/05/31 03:58:41 server.go:314: [web/ws] client disconnected from 127.0.0.1:37516
2026/05/31 09:54:56 server.go:308: [web/ws] client connected from 127.0.0.1:36926
2026/05/31 09:54:58 server.go:314: [web/ws] client disconnected from 127.0.0.1:36926
2026/05/31 09:54:58 server.go:308: [web/ws] client connected from 127.0.0.1:59460
2026/05/31 09:57:17 server.go:308: [web/ws] client connected from 127.0.0.1:51522
2026/05/31 09:57:21 server.go:314: [web/ws] client disconnected from 127.0.0.1:51522
2026/05/31 09:57:52 main.go:90: === Automated Azan Agent starting ===
2026/05/31 09:57:57 timesync.go:93: [timesync] synced via NTP server pool.ntp.org: 2026-05-31T09:57:57+01:00
2026/05/31 09:57:57 main.go:104: [main] config dir: /root/.config/azan-agent
2026/05/31 09:57:57 main.go:105: [main] data dir: /root/.local/share/azan-agent
2026/05/31 09:57:57 main.go:106: [main] log dir: /root/.local/share/azan-agent/logs
2026/05/31 09:57:57 main.go:107: [main] media dir: /app/Media
2026/05/31 09:57:57 main.go:111: [main] WARNING: media dir not found (/app/Media): open /app/Media: no such file or directory — Chromecast playback will fail
2026/05/31 09:57:57 main.go:132: [main] media server: http://192.168.86.5:28427/media/
2026/05/31 09:57:57 main.go:138: [main] chromecast media base URL: http://192.168.86.5:28427/media/
2026/05/31 09:57:57 server.go:53: [media] serving /app/Media on 0.0.0.0:28427 (embedded fallback enabled)
2026/05/31 09:57:57 manager.go:77: [chromecast] discovering devices via mDNS...
2026/05/31 09:57:57 scheduler.go:254: [scheduler] skipping Pre-Fajr Quran at 02:33 (past)
2026/05/31 09:57:57 scheduler.go:254: [scheduler] skipping Fajr Athan at 03:03 (past)
2026/05/31 09:57:57 scheduler.go:274: [scheduler] scheduled Dhuhr Athan at 13:27 (in 209 min)
2026/05/31 09:57:57 scheduler.go:274: [scheduler] scheduled Asr Athan at 17:49 (in 471 min)
2026/05/31 09:57:57 scheduler.go:274: [scheduler] scheduled Maghrib Athan at 21:45 (in 707 min)
2026/05/31 09:57:57 scheduler.go:274: [scheduler] scheduled Isha Athan at 23:16 (in 798 min)
2026/05/31 09:57:57 scheduler.go:95: [scheduler] started
2026/05/31 09:57:57 main.go:243: [main] dashboard at http://localhost:28426
2026/05/31 09:57:57 server.go:171: [web] dashboard at http://localhost:28426
2026/05/31 09:57:57 watcher.go:60: [config-watcher] watching /config/azan.toml
2026/05/31 09:57:57 main.go:271: [main] prayer times for naas on 2026-05-31:
2026/05/31 09:57:57 main.go:272: Fajr=03:03 Dhuhr=13:27 Asr=17:49 Maghrib=21:45 Isha=23:16
2026/05/31 09:57:57 main.go:277: [main] next prayer: Dhuhr at 13:27
2026/05/31 09:57:57 manager.go:96: [chromecast] found: SHIELD (SHIELD Android TV) at 192.168.86.169:8009
2026/05/31 09:57:57 manager.go:96: [chromecast] found: Kitchen speaker (Google Nest Mini) at 192.168.86.148:8009
2026/05/31 09:57:57 manager.go:96: [chromecast] found: Downstairs (Google Cast Group) at 192.168.86.148:32081
2026/05/31 09:57:57 manager.go:96: [chromecast] found: All Nest minis (Google Cast Group) at 192.168.86.148:32124
2026/05/31 09:57:57 manager.go:96: [chromecast] found: Playroom Speaker (Google Nest Mini) at 192.168.86.234:8009
2026/05/31 09:57:57 manager.go:96: [chromecast] found: All Speakers (Google Cast Group) at 192.168.86.188:32197
2026/05/31 09:57:58 manager.go:96: [chromecast] found: Upstairs (Google Cast Group) at 192.168.86.188:32003
2026/05/31 09:57:58 manager.go:96: [chromecast] found: Party (Google Cast Group) at 192.168.86.188:32101
2026/05/31 09:57:58 manager.go:96: [chromecast] found: athan (Google Cast Group) at 192.168.86.188:32067
2026/05/31 09:57:58 manager.go:96: [chromecast] found: Nest display (Google Nest Hub) at 192.168.86.188:8009
2026/05/31 09:58:05 server.go:308: [web/ws] client connected from 127.0.0.1:45002
2026/05/31 09:58:05 main.go:147: [main] found 10 chromecast device(s)
2026/05/31 10:04:03 server.go:314: [web/ws] client disconnected from 127.0.0.1:45002
2026/05/31 10:04:03 server.go:308: [web/ws] client connected from 127.0.0.1:58940
2026/05/31 10:07:33 server.go:308: [web/ws] client connected from 127.0.0.1:39080
2026/05/31 10:07:58 server.go:314: [web/ws] client disconnected from 127.0.0.1:58940
2026/05/31 10:07:58 server.go:314: [web/ws] client disconnected from 127.0.0.1:39080
2026/05/31 10:08:12 server.go:308: [web/ws] client connected from 127.0.0.1:33756
2026/05/31 10:11:30 server.go:314: [web/ws] client disconnected from 127.0.0.1:33756
2026/05/31 10:11:30 server.go:308: [web/ws] client connected from 127.0.0.1:54176
2026/05/31 10:11:50 manager.go:77: [chromecast] discovering devices via mDNS...
2026/05/31 10:11:50 manager.go:96: [chromecast] found: SHIELD (SHIELD Android TV) at 192.168.86.169:8009
2026/05/31 10:11:50 manager.go:96: [chromecast] found: Playroom Speaker (Google Nest Mini) at 192.168.86.234:8009
2026/05/31 10:11:50 manager.go:96: [chromecast] found: Kitchen speaker (Google Nest Mini) at 192.168.86.148:8009
2026/05/31 10:11:50 manager.go:96: [chromecast] found: Downstairs (Google Cast Group) at 192.168.86.148:32081
2026/05/31 10:11:50 manager.go:96: [chromecast] found: All Nest minis (Google Cast Group) at 192.168.86.148:32124
2026/05/31 10:11:51 manager.go:96: [chromecast] found: All Speakers (Google Cast Group) at 192.168.86.188:32197
2026/05/31 10:11:51 manager.go:96: [chromecast] found: Upstairs (Google Cast Group) at 192.168.86.188:32003
2026/05/31 10:11:51 manager.go:96: [chromecast] found: Party (Google Cast Group) at 192.168.86.188:32101
2026/05/31 10:11:51 manager.go:96: [chromecast] found: athan (Google Cast Group) at 192.168.86.188:32067
2026/05/31 10:11:51 manager.go:96: [chromecast] found: Nest display (Google Nest Hub) at 192.168.86.188:8009
2026/05/31 10:13:21 manager.go:77: [chromecast] discovering devices via mDNS...
2026/05/31 10:13:21 manager.go:96: [chromecast] found: SHIELD (SHIELD Android TV) at 192.168.86.169:8009
2026/05/31 10:13:21 manager.go:96: [chromecast] found: Playroom Speaker (Google Nest Mini) at 192.168.86.234:8009
2026/05/31 10:13:21 manager.go:96: [chromecast] found: Kitchen speaker (Google Nest Mini) at 192.168.86.148:8009
2026/05/31 10:13:21 manager.go:96: [chromecast] found: Downstairs (Google Cast Group) at 192.168.86.148:32081
2026/05/31 10:13:21 manager.go:96: [chromecast] found: All Nest minis (Google Cast Group) at 192.168.86.148:32124
2026/05/31 10:13:21 manager.go:96: [chromecast] found: All Speakers (Google Cast Group) at 192.168.86.188:32197
2026/05/31 10:13:21 manager.go:96: [chromecast] found: Upstairs (Google Cast Group) at 192.168.86.188:32003
2026/05/31 10:13:21 manager.go:96: [chromecast] found: Party (Google Cast Group) at 192.168.86.188:32101
2026/05/31 10:13:21 manager.go:96: [chromecast] found: athan (Google Cast Group) at 192.168.86.188:32067
2026/05/31 10:13:21 manager.go:96: [chromecast] found: Nest display (Google Nest Hub) at 192.168.86.188:8009
2026/05/31 10:13:29 server.go:314: [web/ws] client disconnected from 127.0.0.1:54176
2026/05/31 10:13:29 server.go:308: [web/ws] client connected from 127.0.0.1:32830
2026/05/31 11:12:18 server.go:308: [web/ws] client connected from 127.0.0.1:38274
2026/05/31 11:12:21 server.go:314: [web/ws] client disconnected from 127.0.0.1:38274
2026/05/31 11:13:03 server.go:308: [web/ws] client connected from 127.0.0.1:36484
2026/05/31 11:13:05 server.go:314: [web/ws] client disconnected from 127.0.0.1:36484
2026/05/31 11:13:05 server.go:308: [web/ws] client connected from 127.0.0.1:36546
2026/05/31 11:13:05 server.go:308: [web/ws] client connected from 127.0.0.1:36570
2026/05/31 11:13:06 server.go:314: [web/ws] client disconnected from 127.0.0.1:36570
2026/05/31 11:13:06 server.go:308: [web/ws] client connected from 127.0.0.1:36622
2026/05/31 11:13:06 server.go:314: [web/ws] client disconnected from 127.0.0.1:36622
2026/05/31 11:13:06 server.go:308: [web/ws] client connected from 127.0.0.1:36650
2026/05/31 11:13:07 server.go:314: [web/ws] client disconnected from 127.0.0.1:36650
2026/05/31 11:13:07 server.go:308: [web/ws] client connected from 127.0.0.1:36720
2026/05/31 11:13:09 server.go:314: [web/ws] client disconnected from 127.0.0.1:36720
2026/05/31 11:13:09 server.go:308: [web/ws] client connected from 127.0.0.1:48980
2026/05/31 11:13:15 server.go:314: [web/ws] client disconnected from 127.0.0.1:48980
2026/05/31 11:13:16 server.go:314: [web/ws] client disconnected from 127.0.0.1:36546
2026/05/31 11:13:32 server.go:308: [web/ws] client connected from 127.0.0.1:55830
2026/05/31 11:13:37 server.go:314: [web/ws] client disconnected from 127.0.0.1:55830
2026/05/31 11:13:37 server.go:308: [web/ws] client connected from 127.0.0.1:49306
2026/05/31 11:14:21 server.go:314: [web/ws] client disconnected from 127.0.0.1:49306
2026/05/31 11:14:21 server.go:308: [web/ws] client connected from 127.0.0.1:57518
2026/05/31 11:14:26 server.go:314: [web/ws] client disconnected from 127.0.0.1:57518
2026/05/31 11:14:27 server.go:308: [web/ws] client connected from 127.0.0.1:57558
2026/05/31 11:14:29 server.go:314: [web/ws] client disconnected from 127.0.0.1:57558
2026/05/31 11:17:29 server.go:308: [web/ws] client connected from 127.0.0.1:34898
2026/05/31 11:17:31 server.go:314: [web/ws] client disconnected from 127.0.0.1:34898
2026/05/31 11:17:31 server.go:308: [web/ws] client connected from 127.0.0.1:34936
2026/05/31 11:17:31 server.go:314: [web/ws] client disconnected from 127.0.0.1:34936
2026/05/31 11:17:31 server.go:308: [web/ws] client connected from 127.0.0.1:35000
2026/05/31 11:17:44 server.go:314: [web/ws] client disconnected from 127.0.0.1:35000
2026/05/31 11:17:44 server.go:308: [web/ws] client connected from 127.0.0.1:60662
2026/05/31 11:20:50 server.go:314: [web/ws] client disconnected from 127.0.0.1:60662
2026/05/31 11:20:50 server.go:308: [web/ws] client connected from 127.0.0.1:48454
2026/05/31 11:20:54 server.go:314: [web/ws] client disconnected from 127.0.0.1:48454
2026/05/31 11:21:10 server.go:308: [web/ws] client connected from 127.0.0.1:47208
2026/05/31 11:21:14 server.go:314: [web/ws] client disconnected from 127.0.0.1:47208
2026/05/31 11:25:29 server.go:308: [web/ws] client connected from 192.168.86.199:60363
2026/05/31 11:36:06 server.go:300: [web/ws] upgrade error: websocket: the client is not using the websocket protocol: 'upgrade' token not found in 'Connection' header
2026/05/31 11:38:16 server.go:300: [web/ws] upgrade error: websocket: the client is not using the websocket protocol: 'upgrade' token not found in 'Connection' header
2026/05/31 12:19:36 server.go:314: [web/ws] client disconnected from 192.168.86.199:60363
2026/05/31 12:35:19 server.go:314: [web/ws] client disconnected from 127.0.0.1:32830
2026/05/31 13:27:00 scheduler.go:264: [scheduler] firing Dhuhr Athan
2026/05/31 13:27:00 manager.go:147: [chromecast] PlayAthan: prayer=Dhuhr file=media_Athan.mp3 full_url=http://192.168.86.5:28427/media/media_Athan.mp3
2026/05/31 13:27:00 manager.go:77: [chromecast] discovering devices via mDNS...
2026/05/31 13:27:00 manager.go:96: [chromecast] found: SHIELD (SHIELD Android TV) at 192.168.86.169:8009
2026/05/31 13:27:00 manager.go:96: [chromecast] found: All Speakers (Google Cast Group) at 192.168.86.188:32197
2026/05/31 13:27:00 manager.go:96: [chromecast] found: Upstairs (Google Cast Group) at 192.168.86.188:32003
2026/05/31 13:27:00 manager.go:96: [chromecast] found: Nest display (Google Nest Hub) at 192.168.86.188:8009
2026/05/31 13:27:00 manager.go:96: [chromecast] found: athan (Google Cast Group) at 192.168.86.188:32067
2026/05/31 13:27:00 manager.go:96: [chromecast] found: Party (Google Cast Group) at 192.168.86.188:32101
2026/05/31 13:27:00 manager.go:96: [chromecast] found: Upstairs (Google Cast Group) at 192.168.86.234:32003
2026/05/31 13:27:00 manager.go:96: [chromecast] found: All Speakers (Google Cast Group) at 192.168.86.234:32197
2026/05/31 13:27:00 manager.go:96: [chromecast] found: Party (Google Cast Group) at 192.168.86.234:32101
2026/05/31 13:27:00 manager.go:96: [chromecast] found: athan (Google Cast Group) at 192.168.86.148:32067
2026/05/31 13:27:08 manager.go:302: [chromecast] connect attempt 1/3 failed: unable to connect to chromecast at '192.168.86.148:32067': dial tcp 192.168.86.148:32067: connect: connection refused
2026/05/31 13:27:10 manager.go:302: [chromecast] connect attempt 2/3 failed: unable to connect to chromecast at '192.168.86.148:32067': dial tcp 192.168.86.148:32067: connect: connection refused
2026/05/31 13:27:12 manager.go:302: [chromecast] connect attempt 3/3 failed: unable to connect to chromecast at '192.168.86.148:32067': dial tcp 192.168.86.148:32067: connect: connection refused
2026/05/31 13:27:14 main.go:170: [main] speaker athan (Dhuhr): connect to athan: failed to connect after 3 attempts
2026/05/31 13:34:53 server.go:300: [web/ws] upgrade error: websocket: the client is not using the websocket protocol: 'upgrade' token not found in 'Connection' header
2026/05/31 13:34:58 server.go:300: [web/ws] upgrade error: websocket: the client is not using the websocket protocol: 'upgrade' token not found in 'Connection' header