{"id":15548,"date":"2026-09-05T13:18:33","date_gmt":"2026-09-05T11:18:33","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/narzedzia\/http3-alt-svc-discovery-checker\/"},"modified":"2026-09-05T13:18:33","modified_gmt":"2026-09-05T11:18:33","slug":"http3-alt-svc-discovery-checker","status":"publish","type":"page","link":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/http3-alt-svc-discovery-checker\/","title":{"rendered":"Sprawdzanie HTTP\/3 i wykrywania przez Alt-Svc"},"content":{"rendered":"<div class=\"gtm-analyser-container\" style=\"background: var(--bg-panel, #1e1e24); padding: 25px; border-radius: 8px; border: 1px solid var(--border, #2a2a35);\">\n<p style=\"color: var(--text-secondary, #a0a0b0); margin-bottom: 20px;\">Serwer, kt\u00f3ry obs\u0142uguje HTTP\/3, musi o tym poinformowa\u0107 klient\u00f3w: przez rekord HTTPS w DNS, kt\u00f3ry przegl\u0105darka odczytuje przed pierwszym po\u0142\u0105czeniem, albo przez nag\u0142\u00f3wek Alt-Svc, kt\u00f3ry pomaga dopiero od drugiego po\u0142\u0105czenia. To sprawdzenie wysy\u0142a z tego serwera cztery \u017c\u0105dania pod ten sam adres: tylko HTTP\/1.1, HTTP\/2 jako pierwsz\u0105 wizyt\u0119, kt\u00f3ra uczy si\u0119 nag\u0142\u00f3wka Alt-Svc, tylko HTTP\/3 przez QUIC bez powrotu do TCP oraz drug\u0105 wizyt\u0119 z pami\u0119ci\u0105 podr\u0119czn\u0105 z pierwszej. Ka\u017cdy wiersz pokazuje wynegocjowan\u0105 wersj\u0119 i czas do pierwszego bajtu.<\/p>\n<div style=\"margin-bottom: 14px;\">\n        <label for=\"h3-url\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Adres (https:\/\/ jest zak\u0142adane, przekierowania s\u0105 \u015bledzone)<\/label><br \/>\n        <input id=\"h3-url\" type=\"text\" value=\"cloudflare.com\" class=\"form-control\" style=\"width: 100%; padding: 10px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; box-sizing: border-box; font-family: monospace;\">\n    <\/div>\n<p style=\"color: var(--text-secondary, #a0a0b0); font-size: 0.82rem; margin-bottom: 16px;\">Z tego serwera pod podany adres trafiaj\u0105 przekierowania i cztery kr\u00f3tkie \u017c\u0105dania; tre\u015b\u0107 odpowiedzi jest przerywana po pierwszym pakiecie. Rekord HTTPS jest pobierany z 1.1.1.1 i 8.8.8.8. Hosty w sieciach prywatnych, loopback i link-local s\u0105 odrzucane. Zapytanie chroni reCAPTCHA v3; adres IP wywo\u0142uj\u0105cego i cel s\u0105 przechowywane przez godzin\u0119 w celu ograniczenia cz\u0119stotliwo\u015bci.<\/p>\n<p>    <button id=\"h3-btn\" class=\"button\" style=\"background: var(--accent, #7ee787); color: var(--on-accent, #0b1114); border: none; padding: 12px 24px; border-radius: 6px; font-weight: 700; cursor: pointer;\">Sprawdzenie wykrywania HTTP\/3<\/button><\/p>\n<div id=\"h3-ausgabe\" style=\"margin-top: 22px;\"><\/div>\n<p style=\"color: var(--text-secondary, #a0a0b0); font-size: 0.8rem; margin: 24px 0 0;\">Granice, o kt\u00f3rych warto wiedzie\u0107: sprawdzany jest tylko jeden z rozwi\u0105zanych adres\u00f3w; czasy to pojedynczy pomiar z jednego serwera w Europie z rozgrzanym resolverem i nic nie m\u00f3wi\u0105 o sieci odwiedzaj\u0105cego; czy prawdziwa przegl\u0105darka u\u017cyje rekordu HTTPS, zale\u017cy od przegl\u0105darki i jej \u015bcie\u017cki DNS; a w\u0119ze\u0142 po\u015bredni mi\u0119dzy tym serwerem a celem mo\u017ce blokowa\u0107 UDP 443, podczas gdy odwiedzaj\u0105cy gdzie indziej przechodzi.<\/p>\n<\/div>\n<p><script>\n(function () {\n    'use strict';<\/p>\n<p>    const T = {\"einleitung\":\"Serwer, kt\u00f3ry obs\u0142uguje HTTP\\\/3, musi o tym poinformowa\u0107 klient\u00f3w: przez rekord HTTPS w DNS, kt\u00f3ry przegl\u0105darka odczytuje przed pierwszym po\u0142\u0105czeniem, albo przez nag\u0142\u00f3wek Alt-Svc, kt\u00f3ry pomaga dopiero od drugiego po\u0142\u0105czenia. To sprawdzenie wysy\u0142a z tego serwera cztery \u017c\u0105dania pod ten sam adres: tylko HTTP\\\/1.1, HTTP\\\/2 jako pierwsz\u0105 wizyt\u0119, kt\u00f3ra uczy si\u0119 nag\u0142\u00f3wka Alt-Svc, tylko HTTP\\\/3 przez QUIC bez powrotu do TCP oraz drug\u0105 wizyt\u0119 z pami\u0119ci\u0105 podr\u0119czn\u0105 z pierwszej. Ka\u017cdy wiersz pokazuje wynegocjowan\u0105 wersj\u0119 i czas do pierwszego bajtu.\",\"label_url\":\"Adres (https:\\\/\\\/ jest zak\u0142adane, przekierowania s\u0105 \u015bledzone)\",\"datenschutz\":\"Z tego serwera pod podany adres trafiaj\u0105 przekierowania i cztery kr\u00f3tkie \u017c\u0105dania; tre\u015b\u0107 odpowiedzi jest przerywana po pierwszym pakiecie. Rekord HTTPS jest pobierany z 1.1.1.1 i 8.8.8.8. Hosty w sieciach prywatnych, loopback i link-local s\u0105 odrzucane. Zapytanie chroni reCAPTCHA v3; adres IP wywo\u0142uj\u0105cego i cel s\u0105 przechowywane przez godzin\u0119 w celu ograniczenia cz\u0119stotliwo\u015bci.\",\"knopf\":\"Sprawdzenie wykrywania HTTP\\\/3\",\"laeuft\":\"Trwaj\u0105 cztery \u017c\u0105dania...\",\"grenze\":\"Granice, o kt\u00f3rych warto wiedzie\u0107: sprawdzany jest tylko jeden z rozwi\u0105zanych adres\u00f3w; czasy to pojedynczy pomiar z jednego serwera w Europie z rozgrzanym resolverem i nic nie m\u00f3wi\u0105 o sieci odwiedzaj\u0105cego; czy prawdziwa przegl\u0105darka u\u017cyje rekordu HTTPS, zale\u017cy od przegl\u0105darki i jej \u015bcie\u017cki DNS; a w\u0119ze\u0142 po\u015bredni mi\u0119dzy tym serwerem a celem mo\u017ce blokowa\u0107 UDP 443, podczas gdy odwiedzaj\u0105cy gdzie indziej przechodzi.\",\"h_entdeckung\":\"Wykrywanie\",\"zeile_url\":\"Zmierzony adres\",\"zeile_ip\":\"Rozwi\u0105zane adresy\",\"zeile_server\":\"Nag\u0142\u00f3wek Server\",\"zeile_dns\":\"Rekord HTTPS w DNS\",\"zeile_altsvc\":\"Nag\u0142\u00f3wek Alt-Svc\",\"zeile_weg\":\"Pierwsza wizyta\",\"zeile_dauer\":\"Czas\",\"zeile_limit\":\"Pozosta\u0142e sprawdzenia w tej godzinie\",\"dns_vorhanden\":\"obecny: alpn {alpn}, TTL {ttl} s\",\"dns_keiner\":\"brak\",\"dns_fehler\":\"nieczytelny (brak odpowiedzi resolver\u00f3w)\",\"dns_alias\":\"rekord aliasu wskazuj\u0105cy na {ziel}\",\"dns_ech_zusatz\":\"+ konfiguracja ECH\",\"dns_port_zusatz\":\"(port {port})\",\"weg_dns\":\"HTTP\\\/3 od pierwszego po\u0142\u0105czenia: rekord HTTPS zapowiada je przed jakimkolwiek uzgadnianiem TCP.\",\"weg_alt_svc\":\"HTTP\\\/2 przy pierwszym po\u0142\u0105czeniu, HTTP\\\/3 od drugiego: zapowiada je tylko nag\u0142\u00f3wek Alt-Svc.\",\"weg_unangekuendigt\":\"QUIC odpowiada, ale nic go nie zapowiada. Przegl\u0105darki same nigdy go nie pr\u00f3buj\u0105.\",\"weg_unerreichbar\":\"HTTP\\\/3 jest zapowiedziane, ale QUIC st\u0105d nie odpowiedzia\u0142. Przegl\u0105darki po op\u00f3\u017anieniu wracaj\u0105 do HTTP\\\/2.\",\"weg_keine\":\"Brak HTTP\\\/3: nic go nie zapowiada i QUIC nie odpowiada.\",\"h_protokolle\":\"Cztery \u017c\u0105dania, jeden adres\",\"spalte_versuch\":\"\u017b\u0105danie\",\"spalte_ausgehandelt\":\"Wynegocjowano\",\"spalte_status\":\"Status\",\"spalte_connect\":\"Po\u0142\u0105czenie\",\"spalte_tls\":\"TLS\",\"spalte_ttfb\":\"Pierwszy bajt\",\"spalte_gesamt\":\"\u0141\u0105cznie\",\"versuch_h1\":\"Tylko HTTP\\\/1.1\",\"versuch_h2\":\"HTTP\\\/2, pierwsza wizyta\",\"versuch_h3\":\"Tylko HTTP\\\/3 (QUIC, bez powrotu)\",\"versuch_zweiter\":\"Druga wizyta z pami\u0119ci\u0105 Alt-Svc\",\"fehlgeschlagen\":\"niepowodzenie\",\"curl_refused\":\"po\u0142\u0105czenie odrzucone, na UDP 443 nic nie nas\u0142uchuje\",\"curl_timeout\":\"przekroczono czas, UDP 443 jest prawdopodobnie odrzucane po drodze\",\"curl_tls\":\"uzgadnianie TLS nie powiod\u0142o si\u0119\",\"curl_dns\":\"nazwa nie rozwi\u0105zuje si\u0119\",\"curl_sonstiges\":\"b\u0142\u0105d transportu\",\"h_befunde\":\"Ustalenia\",\"stufe_hoch\":\"Wysoka\",\"stufe_mittel\":\"\u015arednia\",\"stufe_niedrig\":\"Niska\",\"stufe_info\":\"Informacja\",\"stufe_gut\":\"W porz\u0105dku\",\"keine_befunde\":\"Brak uwag.\",\"urteil_gut\":\"Zapowied\u017a i transport s\u0105 ze sob\u0105 zgodne.\",\"urteil_warnung\":\"Dzia\u0142a, ale zapowied\u017a i transport nie pasuj\u0105 do siebie albo brakuje aktualnego protoko\u0142u.\",\"urteil_kritisch\":\"Adresu w og\u00f3le nie da\u0142o si\u0119 pobra\u0107.\",\"ja\":\"tak\",\"nein\":\"nie\",\"wert_keine\":\"brak\",\"fehler_kein_token\":\"Sprawdzenie nie mog\u0142o si\u0119 rozpocz\u0105\u0107, poniewa\u017c reCAPTCHA si\u0119 nie za\u0142adowa\u0142a.\",\"fehler_captcha\":\"reCAPTCHA uzna\u0142a \u017c\u0105danie za zautomatyzowane. Zwykle pomaga ponowne za\u0142adowanie strony.\",\"fehler_zu_viele\":\"Osi\u0105gni\u0119to limit {limit} sprawdze\u0144 na godzin\u0119 dla tego adresu.\",\"fehler_adresse\":\"Tego adresu nie da si\u0119 u\u017cy\u0107.\",\"fehler_zu_viele_spruenge\":\"Adres przekierowuje wi\u0119cej ni\u017c pi\u0119\u0107 razy; \u0142a\u0144cuch nie by\u0142 dalej \u015bledzony.\",\"fehler_nur_http\":\"\u0141a\u0144cuch przekierowa\u0144 ko\u0144czy si\u0119 na zwyk\u0142ym adresie http:\\\/\\\/. HTTP\\\/3 istnieje tylko przez TLS, wi\u0119c nie ma czego mierzy\u0107.\",\"fehler_zaehler\":\"Licznik jest niedost\u0119pny, dlatego nic nie zosta\u0142o sprawdzone.\",\"fehler_pruefdienst\":\"Us\u0142uga reCAPTCHA by\u0142a nieosi\u0105galna.\",\"fehler_aufbau\":\"Us\u0142uga nie jest poprawnie skonfigurowana. B\u0142\u0105d le\u017cy po tej stronie.\",\"fehler_eingabe\":\"\u017b\u0105danie by\u0142o nieczytelne.\",\"fehler_methode\":\"Niew\u0142a\u015bciwa metoda \u017c\u0105dania.\",\"fehler_netz\":\"Us\u0142uga by\u0142a nieosi\u0105galna.\",\"fehler_antwort\":\"Odpowied\u017a by\u0142a nieczytelna.\",\"fehler_unbekannt\":\"Co\u015b posz\u0142o nie tak, a nie ma na to osobnego komunikatu.\",\"grund_leer\":\"Nic nie zosta\u0142o wpisane.\",\"grund_zu_lang\":\"Wpis jest za d\u0142ugi.\",\"grund_unlesbar\":\"To nie jest czytelny adres.\",\"grund_schema\":\"Sprawdzane s\u0105 tylko adresy http i https.\",\"grund_benutzerinfo\":\"Wpisy z danymi logowania s\u0105 odrzucane.\",\"grund_kein_punkt\":\"Nazwa hosta potrzebuje co najmniej jednej kropki.\",\"grund_hostform\":\"Wymagana jest nazwa hosta, nie adres IP.\",\"grund_port\":\"Sprawdzane s\u0105 tylko porty 80, 443, 8080 i 8443.\",\"grund_gesperrter_bereich\":\"Ten host rozwi\u0105zuje si\u0119 do sieci prywatnej lub zarezerwowanej. Takie nigdy nie s\u0105 kontaktowane.\",\"grund_kein_dns\":\"Nazwy hosta nie da si\u0119 rozwi\u0105za\u0107.\",\"grund_abruf\":\"Adres nie odpowiedzia\u0142.\",\"befund_weiterleitung\":\"Przekierowano {n} raz(y) na {ziel} || Pomiary dotycz\u0105 ko\u0144cowego adresu \u0142a\u0144cucha, bo z nim ostatecznie rozmawia przegl\u0105darka.\",\"befund_abruf_fehlgeschlagen\":\"Adres nie odpowiada przez TCP || Ani HTTP\\\/1.1, ani HTTP\\\/2 nie da\u0142y odpowiedzi: {fehler}. Bez \u015bcie\u017cki TCP nie ma z czym por\u00f3wna\u0107 HTTP\\\/3.\",\"befund_https_dns_fehler\":\"Rekordu HTTPS nie da\u0142o si\u0119 odczyta\u0107 || Resolvery nie da\u0142y u\u017cytecznej odpowiedzi ({grund}). To nic nie m\u00f3wi o samym rekordzie; ocena biegnie dalej tylko z nag\u0142\u00f3wkiem Alt-Svc.\",\"befund_https_alias\":\"Rekord HTTPS w trybie aliasu, wskazuje na {ziel} || Rekord aliasu (priorytet 0) deleguje do innej nazwy. Klient pod\u0105\u017ca za nim i tam odczytuje parametry us\u0142ugi; z tego sprawdzenia wida\u0107 tylko delegacj\u0119.\",\"befund_https_eintrag_h3\":\"Rekord HTTPS zapowiada HTTP\\\/3 (alpn {alpn}, TTL {ttl} s) || Rekord jest odpytywany r\u00f3wnolegle z A i AAAA, wi\u0119c przegl\u0105darka z obs\u0142ug\u0105 wie o QUIC przed pierwszym uzgadnianiem TCP i mo\u017ce u\u017cy\u0107 HTTP\\\/3 ju\u017c przy pierwszym po\u0142\u0105czeniu. M\u00f3wi te\u017c przegl\u0105darce, by od razu przej\u015b\u0107 na https. Cel: {ziel}.\",\"befund_https_eintrag_ohne_h3\":\"Rekord HTTPS bez h3 (alpn {alpn}) || Rekord istnieje i nadal co\u015b daje, na przyk\u0142ad podniesienie do https, ale nie zapowiada HTTP\\\/3. Przegl\u0105darka dowiaduje si\u0119 o QUIC tylko z nag\u0142\u00f3wka Alt-Svc, a wi\u0119c dopiero dla drugiego po\u0142\u0105czenia. Cel: {ziel}.\",\"befund_https_ech\":\"Obecna konfiguracja ECH || Rekord niesie klucz Encrypted Client Hello. Przegl\u0105darki z obs\u0142ug\u0105 ECH ukrywaj\u0105 nazw\u0119 serwera w uzgadnianiu TLS przed ka\u017cdym, kto obserwuje \u0142\u0105cze.\",\"befund_https_hints\":\"Podpowiedzi adres\u00f3w w rekordzie: {liste} || ipv4hint i ipv6hint pozwalaj\u0105 klientowi zacz\u0105\u0107 \u0142\u0105czenie, zanim nadejd\u0105 odpowiedzi A i AAAA. To podpowiedzi, nie adresy wi\u0105\u017c\u0105ce.\",\"befund_https_port\":\"Rekord wskazuje na port {port} || Inny port ni\u017c zmierzony; klienci honoruj\u0105cy rekord \u0142\u0105cz\u0105 si\u0119 w\u0142a\u015bnie tam.\",\"befund_https_unbekannte_params\":\"Nieznane parametry us\u0142ugi: klucze {liste} || Parametry, kt\u00f3rych to sprawdzenie nie dekoduje. Klienci ignoruj\u0105 nieznane klucze, chyba \u017ce s\u0105 oznaczone jako obowi\u0105zkowe.\",\"befund_https_eintrag_fehlt\":\"Brak rekordu HTTPS dla {host} || Bez niego przegl\u0105darka nie mo\u017ce wiedzie\u0107 o HTTP\\\/3 przed pierwszym po\u0142\u0105czeniem. Pierwsza wizyta biegnie przez TCP; tylko nag\u0142\u00f3wek Alt-Svc mo\u017ce przenie\u015b\u0107 drug\u0105 na QUIC. Cloudflare i Google publikuj\u0105 ten rekord; gdzie indziej to jeden wpis DNS typu HTTPS z alpn=\\u0022h3,h2\\u0022.\",\"befund_alt_svc_clear\":\"Alt-Svc: clear || Serwer ka\u017ce klientom zapomnie\u0107 ka\u017cd\u0105 zapami\u0119tan\u0105 us\u0142ug\u0119 alternatywn\u0105 dla tego pochodzenia.\",\"befund_alt_svc_h3\":\"Alt-Svc zapowiada {liste} na {ma} s || Nag\u0142\u00f3wek: {roh}. Przegl\u0105darka zapami\u0119tuje to na podany czas (ma, domy\u015blnie 86400 s) i przy nast\u0119pnym po\u0142\u0105czeniu z tym pochodzeniem pr\u00f3buje QUIC. Pierwsze po\u0142\u0105czenie pozostaje bez zmian.\",\"befund_alt_svc_nur_draft\":\"Zapowiedziane tylko wersje robocze ({liste}) || h3-29 i inne identyfikatory robocze nale\u017c\u0105 do wersji QUIC sprzed standardu. Aktualne przegl\u0105darki m\u00f3wi\u0105 tylko ostatecznym h3; bez tego wpisu zapowied\u017a jest ignorowana.\",\"befund_alt_svc_ma_kurz\":\"Kr\u00f3tki czas \u017cycia Alt-Svc: {ma} s || Po tym czasie przegl\u0105darka zapomina alternatyw\u0119 i nast\u0119pn\u0105 wizyt\u0119 zn\u00f3w zaczyna przez TCP. Zwyk\u0142a warto\u015b\u0107 to 86400 s lub wi\u0119cej.\",\"befund_alt_svc_anderer_host\":\"Alt-Svc wskazuje na inny host || {roh}. Kilka przegl\u0105darek ignoruje alternatywy na innych hostach albo wymaga dodatkowych sprawdze\u0144, zanim ich u\u017cyje.\",\"befund_alt_svc_ohne_h3\":\"Alt-Svc bez h3 || Nag\u0142\u00f3wek: {roh}. Nag\u0142\u00f3wek Alt-Svc jest, ale \u017caden z jego wpis\u00f3w nie zapowiada HTTP\\\/3.\",\"befund_alt_svc_fehlt\":\"Brak nag\u0142\u00f3wka Alt-Svc z {host} || Nic nie m\u00f3wi klientom, \u017ce istnieje inny transport. Razem z brakiem rekordu HTTPS oznacza to, \u017ce HTTP\\\/3, je\u015bli serwer w og\u00f3le je obs\u0142uguje, nigdy nie jest u\u017cywane.\",\"befund_h3_erreichbar\":\"HTTP\\\/3 odpowiada przez QUIC (status {status}, pierwszy bajt po {ttfb} ms) || Po\u0142\u0105czenie wy\u0142\u0105cznie przez QUIC, bez powrotu, dotar\u0142o do serwera i dosta\u0142o odpowied\u017a.\",\"befund_h3_angekuendigt_unerreichbar\":\"HTTP\\\/3 jest zapowiedziane, ale nie odpowiada || Zapowiedziane przez {quelle}, a jednak po\u0142\u0105czenie tylko przez QUIC nie powiod\u0142o si\u0119: {fehler}. Typowe przyczyny: UDP 443 nieotwarte na zaporze lub load balancerze, niew\u0142\u0105czony nas\u0142uch HTTP\\\/3 albo \u015bcie\u017cka odrzucaj\u0105ca UDP. Przegl\u0105darki zapami\u0119tuj\u0105 to pochodzenie jako zepsute dla QUIC i wracaj\u0105 do TCP, co kosztuje op\u00f3\u017anienie przy ka\u017cdej \u015bwie\u017cej pr\u00f3bie.\",\"befund_h3_nicht_erreichbar\":\"Brak HTTP\\\/3 przez QUIC ({fehler}) || Nic go nie zapowiada i nic nie odpowiada na UDP 443. To sp\u00f3jne; serwer po prostu nie obs\u0142uguje HTTP\\\/3.\",\"befund_h2_erreichbar\":\"Wynegocjowano HTTP\\\/2 (status {status}, pierwszy bajt po {ttfb} ms) || ALPN w uzgadnianiu TLS wybra\u0142o h2.\",\"befund_h2_fehlt\":\"Brak HTTP\\\/2: po\u0142\u0105czenie TLS wynegocjowa\u0142o HTTP\\\/{version} || Ka\u017cda aktualna przegl\u0105darka oferuje h2 przez ALPN. Bez niego ka\u017cde \u017c\u0105danie potrzebuje w\u0142asnego po\u0142\u0105czenia albo czeka w kolejce; w\u0142\u0105czenie HTTP\\\/2 to jedna linia w ka\u017cdym aktualnym serwerze WWW.\",\"befund_h1_fehlt\":\"HTTP\\\/1.1 odrzucone ({fehler}) || Nietypowe: serwer odpowiedzia\u0142 na HTTP\\\/2, ale nie na zwyk\u0142e \u017c\u0105danie HTTP\\\/1.1.\",\"befund_zweiter_besuch_h3\":\"Druga wizyta u\u017cywa HTTP\\\/3 (pierwszy bajt po {ttfb} ms) || Z informacj\u0105 Alt-Svc zapami\u0119tan\u0105 z pierwszego po\u0142\u0105czenia nast\u0119pne po\u0142\u0105czenie posz\u0142o przez QUIC. Dok\u0142adnie tak robi powracaj\u0105ca przegl\u0105darka.\",\"befund_zweiter_besuch_kein_h3\":\"Druga wizyta mimo zapowiedzi zostaje przy HTTP\\\/{version} || QUIC odpowiada i Alt-Svc go zapowiada, ale klient z zapami\u0119tanym nag\u0142\u00f3wkiem nie prze\u0142\u0105czy\u0142 si\u0119. Zapowiedziany port lub host mog\u0105 r\u00f3\u017cni\u0107 si\u0119 od tego, co faktycznie odpowiada.\",\"befund_zweiter_besuch_bleibt\":\"Druga wizyta zostaje przy HTTP\\\/{version} || Bez zapowiedzi Alt-Svc zapami\u0119tana druga wizyta nie ma na co si\u0119 prze\u0142\u0105czy\u0107.\",\"befund_ttfb_vergleich\":\"Pierwszy bajt: HTTP\\\/2 {h2} ms, HTTP\\\/3 {h3} ms ({delta} ms) || Jeden pomiar z tego serwera. HTTP\\\/3 oszcz\u0119dza jedn\u0105 rund\u0119 przy \u015bwie\u017cym po\u0142\u0105czeniu i lepiej znosi utrat\u0119 pakiet\u00f3w; na czystej, kr\u00f3tkiej \u015bcie\u017cce r\u00f3\u017cnica jest ma\u0142a, a pojedyncza pr\u00f3bka mo\u017ce wskazywa\u0107 w obie strony.\"};<\/p>\n<p>    var ENDPUNKT = '\/lw-h3check.php';\n    var SITEKEY = '6LcrPkEtAAAAAPo1QCOf-IIM2fCL0UfdJz4y2iSY';\n    var STUFEN = ['hoch', 'mittel', 'niedrig', 'info', 'gut'];\n    var VERSUCHE = ['h1', 'h2', 'h3', 'zweiter'];\n    var WEGE = ['dns', 'alt_svc', 'unangekuendigt', 'unerreichbar', 'keine'];<\/p>\n<p>    function liste(w) { return Array.isArray(w) ? w : []; }\n    function zahl(w) { return (typeof w === 'number' && isFinite(w)) ? w : null; }\n    function text(schluessel, daten) {\n        var t = T[schluessel];\n        if (typeof t !== 'string') { return null; }\n        return t.replace(\/\\{([a-z_0-9]+)\\}\/g, function (m, k) {\n            return (daten && daten[k] !== undefined && daten[k] !== null) ? String(daten[k]) : m;\n        });\n    }<\/p>\n<p>    function abruf(r) {\n        r = (r && typeof r === 'object') ? r : {};\n        return { ok: !!r.ok, version: r.version ? String(r.version) : null, status: zahl(r.status), fehler: r.fehler ? String(r.fehler) : null,\n                 fehlerKurz: r.fehler_kurz ? String(r.fehler_kurz) : null,\n                 connect: zahl(r.connect_ms), tls: zahl(r.tls_ms), ttfb: zahl(r.ttfb_ms), gesamt: zahl(r.gesamt_ms) };\n    }<\/p>\n<p>    function bewerten(antwort) {\n        var a = antwort || {};\n        if (a.fehler) { return { fehler: String(a.fehler), grund: a.grund || null, limit: zahl(a.limit), kette: liste(a.kette) }; }\n        var befunde = liste(a.befunde).map(function (f) {\n            return { key: String(f.key || ''), stufe: STUFEN.indexOf(f.stufe) === -1 ? 'info' : f.stufe, daten: (f.daten && typeof f.daten === 'object') ? f.daten : {} };\n        });\n        var gruppen = {};\n        STUFEN.forEach(function (s) { gruppen[s] = befunde.filter(function (f) { return f.stufe === s; }); });\n        var abrufe = {};\n        VERSUCHE.forEach(function (v) { abrufe[v] = abruf(a.abrufe ? a.abrufe[v] : null); });\n        var dns = (a.dns && typeof a.dns === 'object') ? a.dns : {};\n        var alt = (a.alt_svc && typeof a.alt_svc === 'object') ? a.alt_svc : {};\n        return {\n            fehler: null, url: a.url ? String(a.url) : '', host: a.host ? String(a.host) : '', ip: a.ip ? String(a.ip) : '', ips: liste(a.ips), server: a.server ? String(a.server) : null,\n            urteil: (a.urteil === 'gut' || a.urteil === 'warnung' || a.urteil === 'kritisch') ? a.urteil : 'kritisch',\n            weg: WEGE.indexOf(a.weg) === -1 ? 'keine' : a.weg,\n            dns: { fehler: dns.fehler ? String(dns.fehler) : null, alpn: liste(dns.alpn).map(String), h3: !!dns.h3, ech: !!dns.ech, alias: dns.alias ? String(dns.alias) : null,\n                   ttl: zahl(dns.ttl), ziel: dns.ziel ? String(dns.ziel) : '', port: zahl(dns.port), n: zahl(dns.n) || 0, aufloeser: dns.aufloeser ? String(dns.aufloeser) : null },\n            altSvc: { roh: alt.roh ? String(alt.roh) : null, h3: liste(alt.h3).map(String), ma: zahl(alt.ma), clear: !!alt.clear },\n            abrufe: abrufe, befunde: befunde, gruppen: gruppen,\n            kette: liste(a.kette), dauer: zahl(a.dauer_ms), limitRest: zahl(a.limit_rest)\n        };\n    }<\/p>\n<p>    function skriptLaden() {\n        return new Promise(function (auf) {\n            if (window.grecaptcha) { auf(true); return; }\n            var s = document.createElement('script');\n            s.src = 'https:\/\/www.google.com\/recaptcha\/api.js?render=' + SITEKEY;\n            s.onload = function () { auf(true); }; s.onerror = function () { auf(false); };\n            document.head.appendChild(s);\n            setTimeout(function () { auf(!!window.grecaptcha); }, 8000);\n        });\n    }\n    function tokenHolen() {\n        return skriptLaden().then(function (da) {\n            if (!da || !window.grecaptcha || !window.grecaptcha.ready) { return null; }\n            return new Promise(function (auf) {\n                var fertig = false;\n                function einmal(w) { if (!fertig) { fertig = true; auf(w); } }\n                setTimeout(function () { einmal(null); }, 12000);\n                try {\n                    window.grecaptcha.ready(function () {\n                        if (fertig) { return; }\n                        if (!window.grecaptcha.execute) { einmal(null); return; }\n                        window.grecaptcha.execute(SITEKEY, { action: 'h3check' }).then(function (t) { einmal(t || null); }, function () { einmal(null); });\n                    });\n                } catch (e) { einmal(null); }\n            });\n        }, function () { return null; });\n    }\n    function abfragen(url) {\n        return tokenHolen().then(function (token) {\n            return fetch(ENDPUNKT, { method: 'POST', headers: { 'Content-Type': 'application\/json' }, body: JSON.stringify({ url: url, token: token || '' }) })\n                .then(function (r) { return r.json().then(function (j) { return j; }, function () { return { fehler: 'antwort' }; }); }, function () { return { fehler: 'netz' }; });\n        });\n    }<\/p>\n<p>    window.LW_TEST = window.LW_TEST || {};\n    window.LW_TEST.H3 = { bewerten: bewerten, darstellen: null, text: text, ENDPUNKT: ENDPUNKT, STUFEN: STUFEN, VERSUCHE: VERSUCHE, WEGE: WEGE, T: T };<\/p>\n<p>    var btn = document.getElementById('h3-btn');\n    var out = document.getElementById('h3-ausgabe');\n    if (!btn || !out) { return; }<\/p>\n<p>    function el(tag, stil, txt) { var e = document.createElement(tag); if (stil) { e.setAttribute('style', stil); } if (txt !== undefined && txt !== null) { e.textContent = txt; } return e; }\n    function wert(id) { var e = document.getElementById(id); return e ? e.value : ''; }\n    var UEBERSCHRIFT = 'font-family: \"Nunito Sans\", sans-serif; font-weight: 700; color: var(--text-primary, #e8e8ee); font-size: 0.95rem; margin: 22px 0 8px;';\n    var ZELLE = 'padding: 5px 12px 5px 0; color: var(--text-secondary, #a0a0b0); font-size: 0.87rem;';\n    var ZELLE_WERT = 'padding: 5px 12px 5px 0; color: var(--text-primary, #e8e8ee); font-size: 0.87rem; font-family: monospace; word-break: break-all;';\n    var KASTEN = 'background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); border-radius: 8px; padding: 14px 16px; margin: 0 0 10px;';\n    var GUT = ' color: #7ee787;', WARN = ' color: #ffa94d;', ROT = ' color: #ff7b72;', GRAU = ' color: #8a8a99;';\n    var FARBEN = { hoch: '#ff7b72', mittel: '#ffa94d', niedrig: '#e3b341', info: '#8a8a99', gut: '#7ee787' };\n    var URTEIL = { gut: GUT, warnung: WARN, kritisch: ROT };\n    function gitter(sp) { return el('div', 'display: grid; grid-template-columns: ' + sp + '; gap: 0 18px; align-items: baseline;'); }\n    function paar(g, n, w, stil) { g.appendChild(el('div', ZELLE, n)); g.appendChild(el('div', ZELLE_WERT + (stil || ''), w)); }\n    function ms(v) { return v === null ? '-' : v + ' ms'; }<\/p>\n<p>    function dnsText(d) {\n        if (d.fehler) { return T.dns_fehler; }\n        if (d.n === 0) { return T.dns_keiner; }\n        if (d.alias && !d.alpn.length) { return text('dns_alias', { ziel: d.alias }); }\n        var s = text('dns_vorhanden', { alpn: d.alpn.length ? d.alpn.join(', ') : '-', ttl: d.ttl === null ? '?' : d.ttl });\n        if (d.ech) { s += ' ' + T.dns_ech_zusatz; }\n        if (d.port !== null) { s += ' ' + text('dns_port_zusatz', { port: d.port }); }\n        return s;\n    }<\/p>\n<p>    function darstellen(b, ziel) {\n        ziel.innerHTML = '';\n        if (b.fehler) {\n            var txt = T['fehler_' + b.fehler] || T.fehler_unbekannt;\n            if (b.grund && T['grund_' + b.grund]) { txt = txt + ' ' + T['grund_' + b.grund]; }\n            if (b.limit !== null) { txt = txt.replace('{limit}', String(b.limit)); }\n            ziel.appendChild(el('p', ZELLE + WARN + ' margin: 0;', txt));\n            return;\n        }\n        ziel.appendChild(el('div', 'font-size: 1.05rem; font-weight: 700; margin: 0 0 12px;' + URTEIL[b.urteil], T['urteil_' + b.urteil]));<\/p>\n<p>        ziel.appendChild(el('div', UEBERSCHRIFT, T.h_entdeckung));\n        var g = gitter('auto auto');\n        paar(g, T.zeile_url, b.url);\n        paar(g, T.zeile_ip, b.ips.length ? b.ips.join(', ') : b.ip, GRAU);\n        if (b.server) { paar(g, T.zeile_server, b.server, GRAU); }\n        paar(g, T.zeile_dns, dnsText(b.dns), b.dns.h3 ? GUT : (b.dns.fehler ? GRAU : ''));\n        paar(g, T.zeile_altsvc, b.altSvc.roh ? b.altSvc.roh : T.wert_keine, b.altSvc.h3.length ? GUT : '');\n        paar(g, T.zeile_weg, T['weg_' + b.weg], b.weg === 'dns' ? GUT : (b.weg === 'unerreichbar' ? WARN : ''));\n        if (b.dauer !== null) { paar(g, T.zeile_dauer, ms(b.dauer), GRAU); }\n        if (b.limitRest !== null) { paar(g, T.zeile_limit, String(b.limitRest), GRAU); }\n        ziel.appendChild(g);<\/p>\n<p>        ziel.appendChild(el('div', UEBERSCHRIFT, T.h_protokolle));\n        var huelle = el('div', 'overflow-x: auto;');\n        var gp = gitter('auto auto auto auto auto auto auto');\n        [T.spalte_versuch, T.spalte_ausgehandelt, T.spalte_status, T.spalte_connect, T.spalte_tls, T.spalte_ttfb, T.spalte_gesamt].forEach(function (s) { gp.appendChild(el('div', ZELLE + ' font-weight: 700; color: var(--text-primary, #e8e8ee); white-space: nowrap;', s)); });\n        VERSUCHE.forEach(function (v) {\n            var r = b.abrufe[v];\n            gp.appendChild(el('div', ZELLE + ' white-space: nowrap;', T['versuch_' + v]));\n            if (r.ok) {\n                var stil = r.version === '3' ? GUT : (r.version === '2' ? '' : (v === 'h1' ? GRAU : WARN));\n                gp.appendChild(el('div', ZELLE_WERT + stil, r.version ? 'HTTP\/' + r.version : '?'));\n                gp.appendChild(el('div', ZELLE_WERT + GRAU, r.status === null ? '-' : String(r.status)));\n                gp.appendChild(el('div', ZELLE_WERT + GRAU, ms(r.connect)));\n                gp.appendChild(el('div', ZELLE_WERT + GRAU, ms(r.tls)));\n                gp.appendChild(el('div', ZELLE_WERT, ms(r.ttfb)));\n                gp.appendChild(el('div', ZELLE_WERT + GRAU, ms(r.gesamt)));\n            } else {\n                var f = el('div', ZELLE_WERT + (v === 'h3' ? WARN : ROT) + ' grid-column: span 6; white-space: normal;', T.fehlgeschlagen + (r.fehlerKurz && T['curl_' + r.fehlerKurz] ? ' \u2013 ' + T['curl_' + r.fehlerKurz] : '') + (r.fehler ? ' (' + r.fehler + ')' : ''));\n                gp.appendChild(f);\n            }\n        });\n        huelle.appendChild(gp);\n        ziel.appendChild(huelle);<\/p>\n<p>        ziel.appendChild(el('div', UEBERSCHRIFT, T.h_befunde));\n        var irgendwas = false;\n        STUFEN.forEach(function (s) {\n            var gr = b.gruppen[s];\n            if (!gr.length) { return; }\n            irgendwas = true;\n            ziel.appendChild(el('div', 'font-weight: 700; font-size: 0.82rem; text-transform: uppercase; letter-spacing: 0.5px; margin: 14px 0 6px; color: ' + FARBEN[s] + ';', T['stufe_' + s] + ' (' + gr.length + ')'));\n            gr.forEach(function (f) {\n                var k = el('div', KASTEN + ' border-left: 3px solid ' + FARBEN[s] + ';');\n                var t = text('befund_' + f.key, f.daten) || f.key;\n                var teile = t.split(' || ');\n                k.appendChild(el('div', 'color: var(--text-primary, #e8e8ee); font-size: 0.9rem; font-weight: 700;', teile[0]));\n                if (teile[1]) { k.appendChild(el('div', ZELLE + ' padding: 6px 0 0; line-height: 1.55;', teile[1])); }\n                ziel.appendChild(k);\n            });\n        });\n        if (!irgendwas) { ziel.appendChild(el('p', ZELLE + ' margin: 0;', T.keine_befunde)); }\n    }\n    window.LW_TEST.H3.darstellen = darstellen;<\/p>\n<p>    var laeuft = false;\n    btn.addEventListener('click', function () {\n        if (laeuft) { return; }\n        laeuft = true; btn.disabled = true;\n        out.innerHTML = '';\n        out.appendChild(el('p', ZELLE + GRAU + ' margin: 0;', T.laeuft));\n        abfragen(wert('h3-url')).then(function (a) { darstellen(bewerten(a), out); laeuft = false; btn.disabled = false; },\n            function () { darstellen(bewerten({ fehler: 'netz' }), out); laeuft = false; btn.disabled = false; });\n    });\n})();\n<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Pobiera adres z tego serwera przez HTTP\/1.1, HTTP\/2 i HTTP\/3, odczytuje rekord HTTPS w DNS i nag\u0142\u00f3wek Alt-Svc oraz pokazuje, jak przegl\u0105darka przy pierwszej wizycie dowiaduje si\u0119 o HTTP\/3, czy QUIC naprawd\u0119 odpowiada i co negocjuje druga wizyta.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":9284,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"template-tool-base.php","meta":{"footnotes":""},"tags":[92229,92310,92283],"class_list":["post-15548","page","type-page","status-publish","hentry","tag-devops-pl","tag-networking-pl","tag-web-performance-pl"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Sprawdzanie HTTP\/3 i wykrywania przez Alt-Svc - Lukas Wojcik - Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/http3-alt-svc-discovery-checker\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Sprawdzanie HTTP\/3 i wykrywania przez Alt-Svc - Lukas Wojcik - Blog\" \/>\n<meta property=\"og:description\" content=\"Pobiera adres z tego serwera przez HTTP\/1.1, HTTP\/2 i HTTP\/3, odczytuje rekord HTTPS w DNS i nag\u0142\u00f3wek Alt-Svc oraz pokazuje, jak przegl\u0105darka przy pierwszej wizycie dowiaduje si\u0119 o HTTP\/3, czy QUIC naprawd\u0119 odpowiada i co negocjuje druga wizyta.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/http3-alt-svc-discovery-checker\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/http3-alt-svc-discovery-checker\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/http3-alt-svc-discovery-checker\\\/\",\"name\":\"Sprawdzanie HTTP\\\/3 i wykrywania przez Alt-Svc - Lukas Wojcik - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-09-05T11:18:33+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/http3-alt-svc-discovery-checker\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/http3-alt-svc-discovery-checker\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/narzedzia\\\/http3-alt-svc-discovery-checker\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Toolbox\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/toolbox-3\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Sprawdzanie HTTP\\\/3 i wykrywania przez Alt-Svc\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"luky\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"luky\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Sprawdzanie HTTP\/3 i wykrywania przez Alt-Svc - Lukas Wojcik - Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/http3-alt-svc-discovery-checker\/","og_locale":"en_US","og_type":"article","og_title":"Sprawdzanie HTTP\/3 i wykrywania przez Alt-Svc - Lukas Wojcik - Blog","og_description":"Pobiera adres z tego serwera przez HTTP\/1.1, HTTP\/2 i HTTP\/3, odczytuje rekord HTTPS w DNS i nag\u0142\u00f3wek Alt-Svc oraz pokazuje, jak przegl\u0105darka przy pierwszej wizycie dowiaduje si\u0119 o HTTP\/3, czy QUIC naprawd\u0119 odpowiada i co negocjuje druga wizyta.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/http3-alt-svc-discovery-checker\/","og_site_name":"Lukas Wojcik - Blog","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/http3-alt-svc-discovery-checker\/","url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/http3-alt-svc-discovery-checker\/","name":"Sprawdzanie HTTP\/3 i wykrywania przez Alt-Svc - Lukas Wojcik - Blog","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"datePublished":"2026-09-05T11:18:33+00:00","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/http3-alt-svc-discovery-checker\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/http3-alt-svc-discovery-checker\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/narzedzia\/http3-alt-svc-discovery-checker\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Toolbox","item":"https:\/\/www.lukaswojcik.com\/blog\/toolbox-3\/"},{"@type":"ListItem","position":3,"name":"Sprawdzanie HTTP\/3 i wykrywania przez Alt-Svc"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"luky","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"luky"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/15548","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=15548"}],"version-history":[{"count":0,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/15548\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/9284"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=15548"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=15548"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}