Ogólne#

URLs#

W tym miejscu umieszczam powtarzające się specyficzne pojęcia i algorytmy w dziale URLs, czyli mogą mieć one zastosowanie dla wszystkich interfejsów z tego działu.

Terminology#

Niektóre terminy użyte w specyfikacji URL są definiowane przez standardy DOM, Encoding oraz IDNA.

ASCII digits

Cyfry ASCII # (ASCII digits) to punkty kodowe w zakresie U+0030 do U+0039.

ASCII hex digits

Szesnastkowe cyfry ASCII # (ASCII hex digits) to cyfry ASCII lub punkty kodowe w zakresach U+0041 do U+0046 i U+0061 do U+0066.

ASCII alpha

Litery ASCII # (ASCII alpha) to punkty kodowe w zakresach U+0041 do U+005A i U+0061 do U+007A.

ASCII alphanumeric

Alfanumeryczne znaki ASCII # (ASCII alpha) to cyfry ASCII lub litery ASCII.

Parsers#

EOF code point

Punkt kodowy EOF # (EOF code point) to koncepcyjny punkt kodowy, który oznacza koniec łańcucha znakowego lub strumienia punktów kodowych.

parse error

Błąd parsera # (parse error) wskazuje na niekrytyczną rozbieżność między wejściem i wymaganiami. Aplikacje klienckie są zachęcane do eksponowania błędów parsera w jakiś sposób.

c

W ramach algorytmu parsera, który używa zmiennej pointer, c # (c) wskazuje na kod znaku, do którego odwołuje się zmienna pointer.

remaining

W ramach algorytmu parsera bazującego na łańcuchu znakowym, który używa zmiennej pointer, pozostałość # (remaining) wskazuje na część łańcuch znakowego za pointer w przetwarzanym łańcuchu znakowym.

Dla przykładu, jeśli "mailto:username@example" jest przetwarzanym łańcuchem znakowym i pointer wskazuje na "@", to c jest "@" i pozostałością jest "example".

Percent-encoded bytes#

percent-encoded byte

Zakodowanym procentowo bajtem # (percent-encoded byte) jest "%", po którym następują dwie szesnastkowe cyfry ASCII. Sekwencja zakodowanych procentowo bajtów, po konwersji do bajtów, nie powinna powodować dla dekodera utf-8 uruchomienia jakichkolwiek błędów.

percent encode

Aby zakodować procentowo # (percent encode) bajt byte do zakodowanego procentowo bajtu należy zwrócić łańcuch znakowy składający się z "%", po którym następuje dwucyfrowa, zapisana dużymi literami, szesnastkowa reprezentacja bajtu.

percent decode

Aby zdekodować procentowo # (percent decode) sekwencję bajtów input należy wykonać następujące kroki:

Stosowanie jedynie dekodera utf-8, gdy wejście input zawiera bajty poza zakresem 0x00 do 0x7F, może być niebezpieczne i nie jest zalecane.

  1. Niech output będzie pustą sekwencją bajtów.
  2. Dla każdego (for each) bajtu byte z input wykonaj poniższe podkroki:

    1. Jeśli byte nie jest "%", to dodaj byte do output.
    2. W przeciwnym razie, jeśli byte jest "%" i następne dwa bajty za byte w input nie są w zakresach 0x30 do 0x39, 0x41 do 0x46 i 0x61 do 0x66, to dodaj byte do output.
    3. W przeciwnym razie wykonaj poniższe wewnętrzne podkroki:

      1. Niech bytePoint będzie parą dwóch bajtów za byte w input, zdekodowaną w utf-8 bez BOM, i następnie zinterpretowaną jako liczba szesnastkowa.
      2. Dodaj do output bajt, którego wartością jest bytePoint.
      3. Pomiń kolejne dwa bajty w input.
  3. Zwróć output.

simple encode set

Prosty zestaw kodowania # (simple encode set) to wszystkie punkty kodowe mniejsze od U+0020 (z wykluczeniem U+0020) i wszystkie punkty kodowe większe od U+007E (włącznie z U+007E).

default encode set

Domyślny zestaw kodowania # (default encode set) to prosty zestaw kodowania i punkty kodowe U+0020, '"', "<", ">", "?" oraz "`".

password encode set

Zestaw kodowania hasła # (password encode set) to domyślny zestaw kodowania i punkty kodowe "/", "@" oraz "\".

username encode set

Zestaw kodowania nazwy użytkownika # (username encode set) to zestaw kodowania hasła i punkty kodowy ":".

utf-8 percent encode

Aby zakodować procentowo w utf-8 # (utf-8 percent encode) punkt kodowy code point, z użyciem zestawu kodowania encode set, należy wykonać następujące kroki:

  1. Jeśli code point nie znajduje się w encode set, to zwróć code point.
  2. Niech bytes będzie wynikiem kodowania w uft-8 na code point.
  3. Koduj procentowo każdy bajt z bytes, a następnie zwróć ich połączenie, w tej samej kolejności.

Hosts (domains and IP addresses)#

host

Host # (host) to adres sieciowy w postaci domeny lub adresu IPv6.

domain

Domena # (domain) identyfikuje obszar w obrębie sieci.

IPv6 address

Adres IPv6 # (IPv6 address) to 128-bitowy identyfikator i dla celów specyfikacji URL reprezentuje uporządkowaną listę ośmiu 16-bitowych części # (16-bit pieces).

IDNA#

domain to ASCII

Aby przekonwertować domenę na ASCII # (domain to ASCII) z przekazaniem domeny domain należy wykonać następujące kroki:

  1. Niech result będzie wynikiem uruchomienia Unicode ToASCII z domain_name ustawionym na domain, UseSTD3ASCIIRules ustawionym na boolowska wartość false, processing_option ustawionym na Transitional_Processing oraz VerifyDnsLength ustawionym na boolowska wartość false.
  2. Jeśli result jest błędną wartością, to zwróć błąd.
  3. Zwróć result.
domain to Unicode

Aby przekonwertować domenę na Unicode # (domain to Unicode) z przekazaniem domeny domain należy wykonać następujące kroki:

  1. Niech result będzie wynikiem uruchomienia Unicode ToUnicode z domain_name ustawionym na domain oraz UseSTD3ASCIIRules ustawionym na boolowska wartość false.
  2. Zwróć result ignorując wszelkie zwracane błędy.

    Aplikacje klienckie są zachęcane do zgłaszania błędów poprzez konsolę deweloperską.

Host writing#

Host musi być domeną lub "[", po którym następuje adres IPV6, po którym następuje "]".

valid domain

Domena domain jest poprawną domeną # (valid domain) jeśli poniższe kroki zwracają sukces:

  1. Niech result będzie wynikiem uruchomienia Unicode ToASCII z domain_name ustawionym na domain, UseSTD3ASCIIRules ustawionym na boolowska wartość true, processing_option ustawionym na Nontransitional_Processing oraz VerifyDnsLength ustawionym na boolowska wartość true.
  2. Jeśli result jest błędną wartością, to zwróć błąd.
  3. Niech result będzie wynikiem uruchomienia Unicode ToUnicode z domain_name ustawionym na result oraz UseSTD3ASCIIRules ustawionym na boolowska wartość true.
  4. Jeśli result zawiera jakikolwiek błąd, to zwróć błąd.
  5. Zwróć sukces.

Domena musi być łańcuchem znakowym, który jest poprawną domeną.

Adres IPv6 został zdefiniowany w dokumencie RFC 4291 (sekcja 2.2.).

Host parsing#

host parser

Parser hosta # (host parser) pobiera łańcuch znakowy input oraz opcjonalną flagę Unicode flag, a następnie wykonuje następujące kroki:

  1. Jeśli input jest pustym łańcuchem znakowym, to zwróć błąd.
  2. Jeśli input zaczyna się od "[", to wykonaj poniższe podkroki:

    1. Jeśli input nie kończy się na "]", to wykonaj błąd parsera i zwróć błąd.
    2. Zwróć wynik parsowania IPv6 z przekazaniem input, w którym usunięto początkowy "[" i końcowy "]".
  3. Niech domain będzie wynikiem dekodowania w utf-8 bez BOM na dekodowaniu procentowym z kodowania w utf-8 na input.
  4. Niech asciiDomain będzie wynikiem uruchomienia konwersji domeny na ASCII z przekazaniem domain.
  5. Jeśli asciiDomain jest błędem, to zwróć błąd.
  6. Jeśli asciiDomain zawiera jeden z U+0000, U+0009, U+000A, U+000D, U+0020, "#", "%", "/", ":", "?", "@", "[", "\" i "]", to zwróć błąd.
  7. Zwróć asciiDomain jeśli Unicode flag nie jest ustawiona, w przeciwnym razie wynik uruchomienia konwersji domeny na Unicode z przekazaniem asciiDomain.
IPv6 parser

Parser IPv6 # (host parser) pobiera łańcuch znakowy input i wykonuje następujące kroki:

  1. Niech address będzie nowym adresem IPv6 z 16-bitowymi częściami ustawionymi na 0.
  2. Niech piece pointer będzie wskaźnikiem na 16-bitowe części w address, początkowo zerowym (wskazującym na pierwszą 16-bitową część), i niech piece będzie 16-bitową część, która jest wskazywana.
  3. Niech compress pointer będzie kolejnym wskaźnikiem na 16-bitowe części w address, początkowo wartością null (nie wskazującym niczego).
  4. Niech pointer będzie wskaźnikiem na input, początkowo zerowym (wskazującym na pierwszy punkt kodowy).
  5. Jeśli c jest ":", to wykonaj poniższe podkroki:

    1. Jeśli pozostałość nie zaczyna się od ":", to wykonaj błąd parsera i zwróć błąd.
    2. Zwiększ pointer o dwa.
    3. Zwiększ piece pointer o jeden i ustaw compress pointer na piece pointer.
  6. Główna #: Dopóki (while) c nie jest punktem kodowym EOF, to wykonaj poniższe podkroki:

    1. Jeśli piece pointer ma wartość osiem, to wykonaj błąd parsera i zwróć błąd.
    2. Jeśli c jest ":", to wykonaj poniższe wewnętrzne podkroki:

      1. Jeśli compress pointer nie jest wartością null, to wykonaj błąd parsera i zwróć błąd.
      2. Zwiększ pointer oraz piece pointer o jeden, ustaw compress pointer na piece pointer, a następnie przejdź do Główna.
    3. Niech value i length będą 0.
    4. Dopóki (while) length jest mniejsze od 4 i c jest szesnastkową cyfrą ASCII, to ustaw value na value * 0x10 + c interpretowane jako liczba szesnastkowa, a następnie zwiększ pointer i length o jeden.
    5. W oparciu o c:

      "."
      1. Jeśli length ma wartość 0, to wykonaj błąd parsera i zwróć błąd.
      2. Zmniejsz pointer o length.
      3. Przejdź do IPv4.
      ":"
      1. Zwiększ pointer o jeden.
      2. Jeśli c jest punktem kodowym EOF, to wykonaj błąd parsera i zwróć błąd.
      Wszystko prócz punktu kodowego EOF
      1. Wykonaj błąd parsera i zwróć błąd.
    6. Ustaw piece na value.
    7. Zwiększ piece pointer o jeden.
  7. Jeśli c jest punktem kodowym EOF, to przejdź do Finał.
  8. IPv4 #: Jeśli piece pointer jest większy od sześciu, to wykonaj błąd parsera i zwróć błąd.
  9. Niech dots seen będzie 0.
  10. Dopóki (while) c nie jest punktem kodowym EOF, to wykonaj poniższe podkroki:

    1. Niech value będzie wartością null.
    2. Jeśli c nie jest cyfrą ASCII, to wykonaj błąd parsera i zwróć błąd.
    3. Dopóki (while) c jest cyfrą ASCII, to wykonaj poniższe wewnętrzne podkroki:

      1. Niech number będzie c interpretowanym jak liczba dziesiętna.
      2. Jeśli value ma wartość null, to ustaw ją na number.

        W przeciwnym razie, jeśli value jest 0, to wykonaj błąd parsera i zwróć błąd.

        W przeciwnym razie ustaw value na value * 10 + number.

      3. Zwiększ pointer o jeden.
      4. Jeśli value jest większe od 255, to wykonaj błąd parsera i zwróć błąd.
    4. Jeśli dots seen jest mniejsze od 3 i c nie jest ".", to wykonaj błąd parsera i zwróć błąd.
    5. Ustaw piece na piece * 0x100 + value.
    6. Jeśli dots seen jest 1 lub 3, to zwiększ piece pointer o jeden.
    7. Zwiększ pointer o jeden.
    8. Jeśli dots seen jest 3 i c nie jest punktem kodowym EOF, to wykonaj błąd parsera i zwróć błąd.
    9. Zwiększ dots seen o jeden.
  11. Finał #: Jeśli compress pointer nie ma wartości null, to wykonaj poniższe podkroki:

    1. Niech swaps będzie piece pointer - compress pointer.
    2. Ustaw piece pointer na siedem.
    3. Dopóki (while) piece pointer nie jest zerem i swaps jest większe od zera, to zamień piece przez część na wskaźniku compress pointer + swaps - 1, a następnie zmniejszy piece pointer i swaps o jeden.
  12. W przeciwnym razie, jeśli compress pointer jest wartością null i piece pointer nie jest wartością osiem, to wykonaj błąd parsera i zwróć błąd.
  13. Zwróć address.

Host serializing#

host serializer

Serializer hosta # (host serializer) pobiera wartość null lub host host, a następnie wykonuje następujące kroki:

  1. Jeśli host jest wartością null, to zwróć pusty łańcuch znakowy.
  2. Jeśli host jest adresem IPv6, to zwróć "[", po którym następuje wynik uruchomienia serializera IPv6 z przekazaniem host, po którym następuje "]".
  3. W przeciwnym razie host jest domeną i zwróć host.
IPv6 serializer

Serializer IPv6 # (IPv6 serializer) pobiera adres IPv6 address i wykonuje następujące kroki:

  1. Niech output będzie pustym łańcuchem znakowym.
  2. Niech compress pointer będzie wskaźnikiem na 16-bitową część w pierwszej najdłuższej sekwencji 16-bitowch części w address, które są zerowe.

    Dla przykładu, w adresie "0:f:0:0:f:f:0:0" zmienna compress pointer będzie wskazywała na drugie 0.

  3. Jeśli nie ma sekwencji zerowych 16-bitowch części w address dłuższej niż jeden, to ustaw compress pointer na wartość null.
  4. Dla każdej (for each) części piece ze wszystkich części w address wykonaj poniższe podkroki:

    1. Jeśli compress pointer wskazuje na piece, to dodaj "::" do output jeśli piece jest pierwszą częścią w address, w przeciwnym razie dodaj ":". Uruchom te podkroki ponownie dla podsekwencji wszystkich zerowych części z części w address lub przejdź do kolejnego kroku w ogólnym zestawie kroków jeśli to nie opuści części.
    2. Dodaj piece, która jest reprezentowana przez najkrótszą zapisaną małymi literami liczbę szesnastkową, do output.
    3. Jeśli piece nie jest ostatnią częścią w address, to dodaj ":" do output.
  5. Zwróć output.

Powyższy algorytm spełnia wymagania dokumentu RFC 5952 ("A Recommendation for IPv6 Address Text Representation").

URL concept#

URL

Adres URL # (URL) jest uniwersalnym identyfikatorem. Adres URL składa się z następujących komponentów: schematu, danych schematu, nazwy użytkownika, hasła, hosta, portu, ścieżki, zapytania oraz fragmentu.

scheme

Schemat # (scheme) w adresie URL jest łańcuchem znakowym, który identyfikuje typ adresu URL i może być używany do wysyłania adresu URL dla przyszłej obróbki po parsowaniu. Początkowo jest to pusty łańcuch znakowy.

scheme data

Dane schematu # (scheme data) w adresie URL są łańcuchem znakowym, który przechowuje zawartość adresu URL. Początkowo jest to pusty łańcuch znakowy.

Dane schematu w adresie URL będą wartością początkową jeśli jego schemat jest schematem relatywnym, w przeciwnym razie będą tylko komponentem bez wartości początkowej.

username

Nazwa użytkownika # (username) w adresie URL jest łańcuchem znakowym, który identyfikuje użytkownika. Początkowo jest to pusty łańcuch znakowy.

password

Hasło # (password) w adresie URL jest wartością null lub łańcuchem znakowym, które identyfikuje uwierzytelnienie użytkownika. Początkowo jest to wartość null.

host

Host # (host) w adresie URL jest wartością null lub hostem. Początkowo jest to wartość null.

port

Port # (port) w adresie URL jest łańcuchem znakowym, który identyfikuje port sieci. Początkowo jest to pusty łańcuch znakowy.

path

Ścieżka # (path) w adresie URL jest listą zera lub większej liczby łańcuchów znakowych trzymających dane, która zwykle identyfikuje położenie w hierarchicznej postaci. Początkowo jest to pusta lista.

query

Zapytanie # (query) w adresie URL jest wartością null lub łańcuchem znakowym trzymającym dane. Początkowo jest to wartość null.

fragment

Fragment # (fragment) w adresie URL jest wartością null lub łańcuchem znakowym trzymającym dane, który może być używany do dalszego przetwarzania na zasobie. Początkowo jest to wartość null

relative flag

Adres URL jest skojarzony z flagą relatywności # (relative flag). Początkowo jest ona nieaktywna.

object

Adres URL jest skojarzony z obiektem # (object), który jest wartością null lub obiektem Blob. Początkowo jest to wartość null

W tym momencie jest to wykorzystywane przede wszystkim do wspierania adresów URL "blob", ale inne mogą być dodane w przyszłości, stąd "obiekt".

relative scheme

Schemat relatywny # (relative scheme) jest schematem wymienionym w pierwszej kolumnie poniższej tabeli.

default port

Port domyślny # (default port) jest opcjonalnym portem odpowiadającym schematowi relatywnemu. Jest on wymieniony w drugiej kolumnie tego samego wiersza w poniższej tabeli.

SchematPort
"ftp""21"
"file" 
"gopher""70"
"http""80"
"https""443"
"ws""80"
"wss""443"

includes credentials

Adres URL uwzględnia uwierzytelnianie # (includes credentials) jeśli jego nazwa użytkownika nie jest pustym łańcuchem znakowym lub jego hasło nie ma wartości null.

base URL

Adres URL może być oznaczany jako bazowy adres URL # (base URL).

Bazowy adres URL jest użyteczny dla parsera adresu URL, kiedy wejściem jest potencjalnie relatywny adres URL.

URL writing#

Adres URL musi byś zapisany jako relatywny adres URL lub absolutny adres URL, po którym opcjonalnie następuje "#" i fragment.

absolute URL

Absolutny adres URL # (absolute URL) musi być schematem, po którym następuje ":", po którym następuje relatywny schemat adresu URL jeśli schemat jest schematem relatywnym lub dane schematu w przeciwnym wypadku, po którym opcjonalnie następuje "?" i zapytanie.

Schemat musi być jedną literą ASCII, po której następuje zero lub więcej znaków alfanumerycznych ASCII, "+", "-" i ".".

Składnia danych schematu zależy od schematu i zazwyczaj jest definiowana obok niego. Standardy muszą definiować dane schematu w ramach ograniczenia zera lub większej liczby jednostek adresu URL.

relative URL

Relatywny adres URL # (relative URL) musi być relatywnym schematem adresu URL, absolutną relatywną ścieżką adresu URL lub relatywną ścieżką adresu URL, która nie zaczyna się od schematu i ":", po którym następuje "?" i zapytanie.

W miejscu, gdzie relatywny adres URL jest parsowany, bazowy adres URL musi być w zasięgu.

scheme-relative URL

Relatywny schemat adresu URL # (scheme-relative URL) musi być "//", po którym opcjonalnie następuje informacja o użytkowniku i "@", po którym następuje host, po którym opcjonalnie następuje ":" i port, po którym opcjonalnie następuje absolutna relatywna ścieżka adresu URL.

userinfo

Informacja o użytkowniku # (userinfo) musi być nazwą użytkownika, po której opcjonalnie następuje ":" i hasło.

Nazwa użytkownika musi być zerem lub większą liczbą jednostek adresu URL, z wykluczeniem "/", ":", "?" i @.

Hasło musi być zerem lub większą liczbą jednostek adresu URL, z wykluczeniem "/", "?" i @.

Port musi być zerem lub większą liczbą cyfr ASCII.

absolute-path-relative URL

Absolutna relatywna ścieżka adresu URL # (absolute-path-relative URL) musi być "/", po którym następuje relatywna ścieżka adresu URL, która nie rozpoczyna się od "/".

path-relative URL

Relatywna ścieżka adresu URL # (path-relative URL) musi być zerem lub większą liczbą segmentów ścieżki oddzielonych od siebie przez "/".

path segment

Segment ścieżki # (path segment) musi być zerem lub większą liczbą jednostek adresu URL, z wykluczeniem "/" i "?".

Zapytanie musi być zerem lub większą liczbą jednostek adresu URL.

Fragment musi być zerem lub większą liczbą jednostek adresu URL.

URL code points

Punkty kodowe adresu URL # (URL code points ) to alfanumeryczne znaki ASCII, "!", "$", "&", "'", "(", ")", "*", "+", ",", "-", ".", "/", ":", ";", "=", "?", "@", "_", "~" oraz punkty kodowe w zakresach U+00A0 do U+D7FF, U+E000 do U+FDCF, U+FDF0 do U+FFFD, U+10000 do U+1FFFD, U+20000 do U+2FFFD, U+30000 do U+3FFFD, U+40000 do U+4FFFD, U+50000 do U+5FFFD, U+60000 do U+6FFFD, U+70000 do U+7FFFD, U+80000 do U+8FFFD, U+90000 do U+9FFFD, U+A0000 do U+AFFFD, U+B0000 do U+BFFFD, U+C0000 do U+CFFFD, U+D0000 do U+DFFFD, U+E0000 do U+EFFFD, U+F0000 do U+FFFFD i U+100000 do U+10FFFD.

Punkty kodowe większe od U+009F będą konwertowane do zakodowanych procentowo bajtów przez parser adresu URL.

URL units

Jednostki adresu URL # (URL units) to punkty kodowe adresu URL oraz zakodowane procentowo bajty.

URL parsing#

URL parser

Parser adresu URL # (URL parser) pobiera łańcuch znakowy input, opcjonalnie z bazowym adresem URL base, opcjonalnie z kodowaniem encoding override, a następnie wykonuje następujące kroki:

  1. Niech url będzie wynikiem działania bazowego parsera adresu URL na input z przekazaniem base i encoding override.
  2. Jeśli url jest błędem, to zwróć błąd.
  3. Jeśli schematem w url nie jest "blob", to zwróć url.
  4. Jeśli dane schematu nie są w magazynie blob URL, to zwróć url.
  5. Ustaw obiekt w url na ustrukturyzowaną kopię wejścia w magazynie blob URL odpowiadającego danym schematu w url.
  6. Zwróć url.
basic URL parser

Bazowy parser adresu URL # (basic URL parser) pobiera łańcuch znakowy input, opcjonalnie z bazowym adresem URL base, opcjonalnie z kodowaniem encoding override, opcjonalnie z adresem URL url oraz nadpisaniem stanu state override, a następnie wykonuje następujące kroki:

Argument encoding override jest zaszłościową koncepcją i dotyczy tylko HTML-a. Argumenty ulr oraz state override są używane jedynie przez obiekty implementujące interfejs URLUtils.

Kiedy argumenty ulr oraz state override nie zostaną przekazane to bazowy parser adresu URL zwraca adres URL lub błąd. Jeśli zostaną przekazane to algorytm po prostu modyfikuje przekazany url i może przerwać działanie bez zwracania czegokolwiek.

  1. Jeśli url nie został przekazany:

    1. Ustaw url na nowy adres URL.
    2. Usuń wszystkie początkowe i końcowe białe znaki ASCII z input.
  2. Niech state będzie state override jeśli został przekazany, w przeciwnym razie stanem początku schematu.
  3. Jeśli base nie został przekazany, to ustaw go na wartość null.
  4. Jeśli encoding override nie został przekazany, to ustaw go na utf-8.
  5. Niech buffer będzie pustym łańcuchem znakowym.
  6. Niech @flag i []flag będą nieaktywne.
  7. Niech pointer będzie wskaźnikiem na pierwszy punkt kodowy w input.
  8. Wykonuj poniższą maszynę stanów poprzez przełączanie na state. Jeśli po uruchomieniu pointer wskazuje na punkt kodowy EOF, to przejdź do kolejnego kroku. W przeciwnym razie zwiększ pointer o jeden i kontynuuj maszynę stanów.

    stan początku schematu # (scheme start state)
    1. Jeśli c jest literą ACII, to dodaj zamienione na małe litery c do buffer i ustaw state na stan schematu.
    2. W przeciwnym razie, jeśli state override nie został przekazany, to ustaw state na stan bez schematu i zmniejsz pointer o jeden.
    3. W przeciwnym razie wykonaj błąd parsera i przerwij ten algorytm.
    stan schematu # (scheme state)
    1. Jeśli c jest alfanumerycznym znakiem ACII, "+", "-" lub ".", to dodaj zamienione na małe litery c do buffer.
    2. W przeciwnym razie, jeśli c jest ":", to ustaw schemat z url na buffer, buffer na pusty łańcuch znakowy, a następnie wykonaj poniższe podkroki:

      1. Jeśli state override został przekazany, to przerwij ten algorytm.
      2. Jeśli schemat z url jest schematem relatywnym, to ustaw flagę relatywności z url.
      3. Jeśli schematem z url jest "file", to ustaw state na stan relatywności.
      4. W przeciwnym razie, jeśli flaga relatywności z url jest ustawiona, base nie ma wartości null i schemat z base jest równy schematowi z url, to ustaw state na stan relatywności lub uwierzytelniania.
      5. W przeciwnym razie, jeśli flaga relatywności z url jest ustawiona, to ustaw state na stan uwierzytelniania z pierwszym slashem.
      6. W przeciwnym razie ustaw state na stan danych schematu.
    3. W przeciwnym razie, jeśli state override nie został przekazany, to ustaw buffer na pusty łańcuch znakowy, state na stan bez schematu, a następnie zacznij od początku (od pierwszego punktu kodowego w input).
    4. W przeciwnym razie, jeśli c jest punktem kodowym EOF, to przerwij ten algorytm.
    5. W przeciwnym razie wykonaj błąd parsera i przerwij ten algorytm.
    stan danych schematu # (scheme data state)
    1. Jeśli c jest "?", to ustaw zapytanie z url na pusty łańcuch znakowy i state na stan zapytania.
    2. W przeciwnym razie, jeśli c jest "#", to ustaw framgent z url na pusty na pusty łańcuch znakowy i state na stan fragmentu.
    3. W przeciwnym razie wykonaj poniższe podkroki:

      1. Jeśli c nie jest punktem kodowym EOF, punktem kodowym adresu URL lub "%", to wykonaj błąd parsera.
      2. Jeśli c jest "%" i pozostałość nie zaczyna się od dwóch szesnastkowych cyfr ASCII, to wykonaj błąd parsera.
      3. Jeśli c nie jest punktem kodowym EOF, U+0009, U+000A lub U+000D, to koduj procentowo w utf-8 nasze c z użyciem prostego zestawu kodowania i dołącz wynik do danych schematu z url.
    stan bez schematu # (no scheme state)
    1. Jeśli base ma wartości null lub schemat z base nie jest schematem relatywnym, to wykonaj błąd parsera i zwróć błąd.

      Flaga relatywności nie została tutaj użyta ze względu na możliwość zmiany schematu z base przez atrybut URLUtils.protocol.

    2. W przeciwnym razie ustaw state na stan relatywności i zmniejsz pointer o jeden.
    stan relatywności lub uwierzytelniania # (relative or authority state)
    1. Jeśli c jest "/" i pozostałość zaczyna się od "/", to ustaw state na stan uwierzytelniania z ignorowaniem slashy i zwiększ pointer o jeden.
    2. W przeciwnym razie wykonaj błąd parsera, ustaw state na stan relatywności i zmniejsz pointer o jeden.
    stan relatywności # (relative state)
    1. Ustaw flagę relatywności, ustaw schemat z url na schemat z base jeśli nie jest nim "file", a następnie w oparciu o c wykonaj poniższe czynności:

      punkt kodowy EOF
      1. Ustaw host z url na host z base, port z url na port z base, ścieżkę z url na ścieżkę z base oraz zapytanie z url na zapytanie z base.
      "/"
      "\"
      1. Jeśli c jest "\", to wykonaj błąd parsera.
      2. Ustaw state na stan relatywności ze slashem.
      "?"
      1. Ustaw host z url na host z base, port z url na port z base, ścieżkę z url na ścieżkę z base, zapytanie z url na pusty łańcuch znakowy oraz state na stan zapytania.
      "#"
      1. Ustaw host z url na host z base, port z url na port z base, ścieżkę z url na ścieżkę z base, zapytanie z url na zapytanie z base, fragment z url na pusty łańcuch znakowy oraz state na stan fragmentu.
      W przeciwnym razie
      1. Jeśli schemat z url nie jest "file", lub c nie jest literą ACII, lub pozostałość nie zaczyna się od ":" lub "|", lub pozostałość składa się z jednego punktu kodowego, lub drugim punktem kodowym w pozostałości nie jest jeden z "/", "", "?" lub "#", to ustaw host z url na host z base, port z url na port z base, ścieżkę z url na ścieżkę z base, a następnie usuń ostatni wpis z ścieżki w url.

        To jest (niezależne od platformy) obejście dla litery dysku Windowsa. Gdy zostanie znaleziona na początku adresu URL file to jest traktowane jak absolutna ścieżka, a nie relatywna względem ścieżki z base.

      2. Ustaw state na stan relatywności ścieżki i zmniejsz pointer o jeden.
    stan relatywności ze slashem # (relative slash state)
    1. Jeśli c jest "/" lub "\", to wykonaj poniższe podkroki:

      1. Jeśli c jest "\", to wykonaj błąd parsera.
      2. Jeśli schematem z url jest "file", to ustaw state na stan hosta pliku.
      3. W przeciwnym razie ustaw state na stan uwierzytelniania z ignorowaniem slashy.
    2. W przeciwnym razie wykonaj poniższe podkroki:

      1. Jeśli schematem z url jest "file", to ustaw host z url na host z base oraz port z url na port z base.

        Dla przykładu, file:/path/ nie odziedziczy hosta z base.

      2. Ustaw state na stan relatywności ścieżki i zmniejsz pointer o jeden.
    stan uwierzytelniania z pierwszym slashem # (authority first slash state)
    1. Jeśli c jest "/", to ustaw state na stan uwierzytelniania z drugim slashem.
    2. W przeciwnym razie wykonaj błąd parsera, ustaw state stan uwierzytelniania z ignorowaniem slashy i zmniejsz pointer o jeden.
    stan uwierzytelniania z drugim slashem # (authority second slash state)
    1. Jeśli c jest "/", to ustaw state na stan uwierzytelniania z ignorowaniem slashy.
    2. W przeciwnym razie wykonaj błąd parsera, ustaw state na stan uwierzytelniania z ignorowaniem slashy i zmniejsz pointer o jeden.
    stan uwierzytelniania z ignorowaniem slashy # (authority ignore slashes state)
    1. Jeśli c nie jest ani "/" ani "\", to ustaw state na stan uwierzytelniania i zmniejsz pointer o jeden.
    2. W przeciwnym razie wykonaj błąd parsera.
    stan uwierzytelniania # (authority state)
    1. Jeśli c jest "@", to wykonaj poniższe podkroki:

      1. Jeśli @flag jest ustawiona, to wykonaj błąd parsera i poprzedź buffer wartością "%40".
      2. Ustaw @flag.
      3. Dla każdego (for each) punktu kodowego code point z buffer wykonaj poniższe wewnętrzne podkroki:

        1. Jeśli code point jest U+0009, U+000A lub U+000D, to wykonaj błąd parsera i kontynuuj (continue).
        2. Jeśli code point nie jest punktem kodowym URL lub "%", to wykonaj błąd parsera.
        3. Jeśli code point jest "%" i pozostałość nie zaczyna się od dwóch szesnastkowych cyfr ASCII, to wykonaj błąd parsera.
        4. Jeśli code point jest ":" i hasło z url ma wartość null, to ustaw hasło z url na pusty łańcuch znakowy i kontynuuj (continue).
        5. Koduj procentowo w utf-8 nasz code point z użyciem domyślnego zestawu kodowania i dołącz wynik do hasła z url jeśli hasło z url nie ma wartość null, w przeciwnym razie do nazwy użytkownika z url.
      4. Ustaw buffer na pusty łańcuch znakowy.
    2. W przeciwnym razie, jeśli c jest punktem kodowym EOF, "/", "\", "?" lub "#", to zmniejsz pointer o liczbę punktów kodowych z buffer plus jeden, ustaw buffer na pusty łańcuch znakowy oraz state na stan hosta.
    3. W przeciwnym razie dodaj c do buffer.
    stan hosta pliku # (file host state)
    1. Jeśli c jest punktem kodowym EOF, "/", "\", "?" lub "#", to zmniejsz pointer o jeden i wykonaj poniższe podkroki:

      1. Jeśli buffer zawiera dwa punkty kodowe, z których pierwszy jest literą ACII a drugi jest ":" lub "|", to ustaw state na stan relatywności ścieżki.

        To jest (niezależne od platformy) obejście dla litery dysku Windowsa. W tym miejscu buffer nie jest zerowany, a w zamian użyty zostaje stan relatywności ścieżki.

      2. W przeciwnym razie, jeśli buffer jest pustym łańcuchem znakowym, to ustaw state na stan relatywności początku ścieżki.
      3. W przeciwnym razie wykonaj poniższe wewnętrzne podkroki:

        1. Niech host będzie wynikiem uruchomienia parsera hosta na buffer.
        2. Jeśli host jest błędem, to zwróć błąd.
        3. Ustaw host z url na host, buffer na pusty łańcuch znakowy i state na stan relatywności początku ścieżki.
    2. W przeciwnym razie, jeśli c jest U+0009, U+000A lub U+000D, to wykonaj błąd parsera.
    3. W przeciwnym razie dodaj c do buffer.
    stan hosta # (host state)
    stan nazwy hosta # (hostname state)
    1. Jeśli c jest ":" i []flag jest nieaktywna, to wykonaj poniższe podkroki:

      1. Niech host będzie wynikiem uruchomienia parsera hosta na buffer.
      2. Jeśli host jest błędem, to zwróć błąd.
      3. Ustaw host z url na host, buffer na pusty łańcuch znakowy i state na stan portu.
      4. Jeśli state override jest stanem nazwy hosta, to przerwij ten algorytm.
    2. W przeciwnym razie, jeśli c jest punktem kodowym EOF, "/", "\", "?" lub "#", to zmniejsz pointer o jeden i wykonaj poniższe podkroki:

      1. Niech host będzie wynikiem uruchomienia parsera hosta na buffer.
      2. Jeśli host jest błędem, to zwróć błąd.
      3. Ustaw host z url na host, buffer na pusty łańcuch znakowy i state na stan relatywności początku ścieżki.
      4. Jeśli state override został przekazany, to przerwij ten algorytm.
    3. W przeciwnym razie, jeśli c jest U+0009, U+000A lub U+000D, to wykonaj błąd parsera.
    4. W przeciwnym razie wykonaj poniższe podkroki:

      1. Jeśli c jest "[", to ustaw []flag.
      2. Jeśli c jest "]", to dezaktywuj []flag.
      3. Dodaj c do buffer.
    stan portu # (port state)
    1. Jeśli c jest cyfrą ASCII, to dodaj c do buffer.
    2. W przeciwnym razie, jeśli c jest punktem kodowym EOF, "/", "\", "?" i "#", lub state override został przekazany, to wykonaj poniższe podkroki:

      1. Usuń początkowe punkty kodowe U+0030 z buffer do chwili, kiedy początkowym punktem kodowym nie będzie U+0030 lub buffer jest pojedynczym punktem kodowym.

        Dla przykładu, "42" > "42", "031" > "31", "080" > "80" czy "0000" > "0".

      2. Jeśli buffer jest równy domyślnemu portowi w schemacie z url, to ustaw buffer na pusty łańcuch znakowy.
      3. Ustaw port z url na buffer.
      4. Jeśli state override został przekazany, to przerwij ten algorytm.
      5. Ustaw buffer na pusty łańcuch znakowy, state na stan relatywności początku ścieżki i zmniejsz pointer o jeden.
    3. W przeciwnym razie, jeśli c jest U+0009, U+000A lub U+000D, to wykonaj błąd parsera.
    4. W przeciwnym razie wykonaj błąd parsera i zwróć błąd.
    stan relatywności początku ścieżki # (relative path start state)
    1. Jeśli c jest "\", to wykonaj błąd parsera.
    2. Ustaw state na stan relatywności ścieżki i jeśli c nie jest ani "/" ani "\", to zmniejsz pointer o jeden.
    stan relatywności ścieżki # (relative path state)
    1. Jeśli c jest punktem kodowym EOF, "/" czy "\", lub state override nie został przekazany i c jest "?" lub "#", to wykonaj poniższe podkroki:

      1. Jeśli c jest "\", to wykonaj błąd parsera.
      2. Jeśli zamieniony na małe litery buffer dopasuje dowolny wiersza w pierwszej kolumnie poniższej tabeli, to ustaw buffer na zawartość komórki w drugiej kolumnie dopasowanego wiersza:

        "%2e""."
        ".%2e"".."
        "%2e."
        "%2e%2e"
      3. Jeśli buffer jest "..", to usuń ostatni wpis z ścieżki w url, jeśli jakiś istnieje, a następnie jeśli c nie jest ani "/" ani "\", to dodaj pusty łańcuch znakowy do ścieżki w url.
      4. W przeciwnym razie, jeśli buffer jest "." i c nie jest ani "/" ani "\", to dodaj pusty łańcuch znakowy do ścieżki w url.
      5. W przeciwnym razie, jeśli buffer nie jest ".", to wykonaj poniższe wewnętrzne podkroki

        1. Jeśli schematem z url jest "file", ścieżką z url jest pusta lista, buffer zawiera dwa punkty kodowe, z których pierwszy jest literą ACII a drugi jest "|", to zastąp drugi punkt kodowy w buffer przez ":".

          To jest (niezależne od platformy) obejście dla litery dysku Windowsa.

        2. Dodaj buffer do ścieżki z url.
      6. Ustaw buffer na pusty łańcuch znakowy.
      7. Jeśli c jest "?", to ustaw zapytanie z url na pusty łańcuch znakowy i state na stan zapytania.
      8. Jeśli c jest "#", to ustaw fragment z url na pusty łańcuch znakowy i state na stan fragmentu.
    2. W przeciwnym razie, jeśli c jest U+0009, U+000A lub U+000D, to wykonaj błąd parsera.
    3. W przeciwnym razie wykonaj poniższe podkroki:

      1. Jeśli c nie jest punktem kodowym URL lub "%", to wykonaj błąd parsera.
      2. Jeśli c jest "%" i pozostałość nie zaczyna się od dwóch szesnastkowych cyfr ASCII, to wykonaj błąd parsera.
      3. Koduj procentowo w utf-8 nasze c z użyciem domyślnego zestawu kodowania i dołącz wynik do buffer.
    stan zapytania # (query state)
    1. Jeśli c jest punktem kodowym EOF, lub state override nie został przekazany i c jest "#", to wykonaj poniższe podkroki:

      1. Jeśli flaga relatywności jest nieaktywna lub schemat z url jest "ws" lub "wss", to ustaw encoding override na utf-8.
      2. Ustaw buffer na wynik kodowania buffer z użyciem encoding override.
      3. Dla każdego (for each) bajtu byte w buffer wykonaj poniższe wewnętrzne podkroki:

        1. Jeśli byte jest mniejszy od 0x21, większy od 0x7E, lub jest jednym z 0x22, 0x23, 0x3C, 0x3E i 0x60, to dodaj zakodowany procentowo byte do zapytania z url.
        2. W przeciwnym razie dodaj punkt kodowy, którego wartością jest byte, do zapytania z url.
      4. Ustaw buffer na pusty łańcuch znakowy.
      5. Jeśli c jest "#", to ustaw fragment z url na pusty łańcuch znakowy i state na stan fragmentu.
    2. W przeciwnym razie, jeśli c jest U+0009, U+000A lub U+000D, to wykonaj błąd parsera.
    3. W przeciwnym razie wykonaj poniższe podkroki:

      1. Jeśli c nie jest punktem kodowym URL lub "%", to wykonaj błąd parsera.
      2. Jeśli c jest "%" i pozostałość nie zaczyna się od dwóch szesnastkowych cyfr ASCII, to wykonaj błąd parsera.
      3. Dodaj c do buffer.
    stan fragmentu # (fragment state)
    1. W oparciu o c wykonaj poniższe czynności:

      punkt kodowy EOF
      1. Nie rób niczego.
      U+0009
      U+000A
      U+000D
      1. Wykonaj błąd parsera.
      W przeciwnym razie
      1. Jeśli c nie jest punktem kodowym URL lub "%", to wykonaj błąd parsera.
      2. Jeśli c jest "%" i pozostałość nie zaczyna się od dwóch szesnastkowych cyfr ASCII, to wykonaj błąd parsera.
      3. Koduj procentowo w utf-8 nasze c z użyciem prostego zestawu kodowania i dołącz wynik do fragmentu z url.
  9. Zwróć url.
set the username

Aby ustawić nazwę użytkownika # (set the username) z przekazaniem adresu URL url i nazwy użytkownika username należy wykonać następujące kroki:

  1. Ustaw nazwę użytkownika z url na pusty łańcuch znakowy.
  2. Dla każdego (for each) punktu kodowego w username wykonaj kodowanie procentowe utf-8 z użyciem zestawu kodowania nazwy użytkownika i dołącz rezultat do nazwy użytkownika z url.
set the password

Aby ustawić hasło # (set the password) z przekazaniem adresu URL url i hasła password należy wykonać następujące kroki:

  1. Jeśli password jest pustym łańcuchem znakowym, to ustaw hasło z url na wartość null.
  2. W przeciwnym razie wykonaj poniższe podkroki:

    1. Ustaw hasło z url na pusty łańcuch znakowy.
    2. Dla każdego (for each) punktu kodowego w password wykonaj kodowanie procentowe utf-8 z użyciem zestawu kodowania hasła i dołącz rezultat do hasła z url.

URL serializing#

URL serializer

Serializer adresu URL # (URL serializer) pobiera adres URL url oraz opcjonalną flagę exclude fragment flag, a następnie wykonuje następujące kroki:

  1. Niech output będzie połączeniem schematu z url i ":".
  2. Jeśli flaga relatywności z url jest ustawiona, to wykonaj poniższe podkroki:

    1. Dodaj "//" do output.
    2. Jeśli nazwa użytkownika z url nie jest pustym łańcuchem znakowym lub hasło z url nie jest wartością null, to wykonaj poniższe wewnętrzne podkroki:

      1. Dodaj nazwę użytkownika do output.
      2. Jeśli hasło z url nie jest wartością null, to dodaj połączenie ":" i hasła z url do output.
      3. Dodaj "@" do output.
    3. Dodaj host z url, zserializowany, do output.
    4. Jeśli port z url nie jest pustym łańcuchem znakowym, to dodaj połączenie ":" i portu z url do output.
    5. Dodaj do output połączenie "/" i łańcuchów znakowych ze ścieżki w url (uwzględniając puste łańcuchy znakowe), oddzielając je od siebie za pomocą "/".
  3. W przeciwnym razie, jeśli flaga relatywności z url jest nieaktywna, to dodaj dane schematu do output.
  4. Jeśli zapytanie z url nie jest wartością null, to dodaj połączenie "?" i zapytania z url do output.
  5. Jeśli exclude fragment flag jest nieaktywna i fragment z url nie jest wartością null, to dodaj połączenie "#" i fragmentu z url do output.
  6. Zwróć output.

Origin concept#

origin

Pochodzenie # (origin) adresu URL jest pochodzeniem zwracanym przez wykonanie poniższych kroków, z przełączaniem na schemacie z adresu URL:

"blob"
  1. Niech url będzie wynikiem bazowego parsowania URL na danych schematu z adresu URL.
  2. Jeśli url jest błędem, to zwróć nowy unikatowy identyfikator globalny. W przeciwnym razie zwróć pochodzenie z url.

Dla przykładu, pochodzeniem dla blob:https://www.whatwg.org/d0360e2f-caee-469f-9a2f-87d5b0456f6f będzie krotka (https, www.whatwg.org, 443).

"ftp"
"gopher"
"http"
"https"
"ws"
"wss"
  1. Zwróć krotkę zawierającą schemat z adresu URL, jego host, oraz jego port domyślny jeśli jego port jest pustym łańcuchem znakowym, w przeciwnym razie jego port.
"file"
  1. W obecnej postaci jest to pozostawione w gestii czytelnika. W razie wątpliwości należy zwrócić nowy unikatowy identyfikator globalny.
W przeciwnym razie
  1. Zwróć nowy unikatowy identyfikator globalny.

W ramach uzupełnienia proponuję zapoznać się z ogólnymi informacjami o pochodzeniu zasobów.

application/x-www-form-urlencoded concept#

application/x-www-form-urlencoded

Format application/x-www-form-urlencoded # (application/x-www-form-urlencoded) jest prostym sposobem dla zakodowania par nazwa-wartość do sekwencji bajtów, gdzie wszystkie bajty są w zakresie 0x00 do 0x7F.

Chociaż opis ten sprawia, że format aplication/x-www-form-urlencoded brzmi przestarzale - i w rzeczywistości tak jest - to jest on w powszechnym użyciu ze względu na częstość występowania formularzy HTML.

application/x-www-form-urlencoded parsing#

application/x-www-form-urlencoded parser

Parser application/x-www-form-urlencoded # (application/x-www-form-urlencoded parser) pobiera sekwencję bajtów input, opcjonalnie z kodowaniem encoding override, opcjonalnie z flagami use _charset_ flag oraz isindex flag, a następnie wykonuje następujące kroki:

  1. Jeśli encoding override nie został przekazany, to ustaw go na utf-8.
  2. Jeśli encoding override nie jest utf-8 i input zawiera bajty, których wartość jest większa od 0xF7, to zwróć błąd.

    Tak może się zdarzyć jedynie w sytuacji, kiedy input nie został wygenerowany przez serializer application/x-www-form-urlencoded lub URLSearchParams.

  3. Niech sequences będzie wynikiem podziału input na "&".
  4. Jeśli isindex flag jest ustawiona i pierwsza sekwencja bajtów w sequences nie zawiera "=", to dodaj "=" na początek pierwszej sekwencji bajtów w sequences.
  5. Niech pairs będzie pustą listą par nazwa-wartość, gdzie zarówno nazwa jak i wartość przechowują sekwencję bajtów.
  6. Dla każdej (for each) sekwencji bajtów bytes w sequences wykonaj poniższe podkroki:

    1. Jeśli bytes jest pustą sekwencją bajtów, to wykonaj te podkroki dla kolejnej sekwencji bajtów.
    2. Jeśli bytes zawiera "=", to niech name będzie bajtami z początku bytes aż do pierwszego "=", i niech value będzie bajtami, jeśli występują, za pierwszym "=" aż do końca bytes. Jeśli "=" jest pierwszym bajtem, to name będzie pustą sekwencją bajtów. Jeśli "=" jest ostatnim bajtem, to value będzie pustą sekwencją bajtów.
    3. W przeciwnym razie, niem name zawiera wartość bytes i niech value będzie pustą sekwencją bajtów.
    4. Zastąp każdy "+" w name i value przez 0x20.
    5. Jeśli use _charset_ flag jest ustawiona i name jest "_charset_", to wykonaj poniższe wewnętrzne podkroki:

      1. Niech result będzie wynikiem pobrania kodowania dla value, zdekodowanym w utf-8 bez BOM.
      2. Jeśli result nie jest błędem, to dezaktywuj use _charset_ flag i ustaw encoding override na result.
    6. Dodaj parę składającą się z name i value do pairs.
  7. Niech output będzie pustą listą par nazwa-wartość, gdzie zarówno nazwa jak i wartość przechowują łańcuch znakowy.
  8. Dla każdej (for each) pary nazwa-wartość w pairs dodaj parę nazwa-wartość do output, gdzie nową nazwą i wartością dodawaną do output jest rezultat uruchomienia dekodera z encoding override kolejno na zdekodowanej procentowo nazwie i wartości z pairs.
  9. Zwróć output.

Funkcje udostępniane przez parser application/x-www-form-urlencoded dotyczą przede wszystkim implementacji zorientowanych serwerowo. Implementacja bazująca na przeglądarce potrzebuje tylko tego, czego wymaga parser application/x-www-form-urlencoded łańcucha znakowego.

application/x-www-form-urlencoded serializing#

application/x-www-form-urlencoded byte serializer

Serializer application/x-www-form-urlencoded bajtów # (application/x-www-form-urlencoded byte serializer) pobiera sekwencję bajtów input i wykonuje następujące kroki:

  1. Niech output będzie pustym łańcuchem znakowym.
  2. Dla każdego bajtu byte w input, w zależności od byte:

    0x20
    1. Dodaj U+002B do output.
    0x2A
    0x2D
    0x2E
    0x30 do 0x39
    0x41 do 0x5A
    0x5F
    0x61 do 0x7A
    1. Dodaj do output punkt kodowy, którego wartością jest byte.
    W przeciwnym razie
    1. Dodaj do output zakodowany procentowo byte.
  3. Zwróć output.
application/x-www-form-urlencoded serializer

Serializer application/x-www-form-urlencoded # (application/x-www-form-urlencoded serializer) pobiera listę par nazwa-wartość pairs, opcjonalnie z kodowaniem encoding override, a następnie wykonuje następujące kroki:

  1. Jeśli encoding override nie został przekazany, to ustaw go na utf-8.
  2. Niech output będzie pustym łańcuchem znakowym.
  3. Dla każdej (for each) pary pair w pairs wykonaj poniższe podkroki:

    1. Niech outputPair będzie kopią pair.
    2. Zastąp nazwę i wartość z outputPair rezultatem uruchomienia na nich kodowania z przekazaniem encoding override.
    3. Zastąp nazwę i wartość z outputPair rezultatem uruchomienia na nich serializera application/x-www-form-urlencoded bajtów.
    4. Jeśli pair nie jest pierwszą parą w pairs, to dodaj "&" do output.
    5. Dodaj do output nazwę z outputPair, po której następuje "=", po której następuje wartość z outputPair.
  4. Zwróć output.

Hooks#

application/x-www-form-urlencoded string parser

Parser application/x-www-form-urlencoded łańcucha znakowego # (application/x-www-form-urlencoded string parser) pobiera łańcuch znakowy input, przeprowadza na nim kodowanie w utf-8, a następnie zwraca wynik uruchomienia na nim parsera application/x-www-form-urlencoded.

URL APIs elsewhere#

Standard, który eksponuje adresy URL, powinien to robić poprzez ekspozycję adresu URL jako łańcucha znakowego (serializując wewnętrzny adres URL). Standard nie powinien eksponować adresu URL przy użyciu obiektu typu URL. Obiekty typu URL służą do manipulacji adresem URL. W definicji IDL należy używać typu USVString.

Powyższa najwyższego rzędu adnotacja oznacza, że wartości będą eksponowane jako niezmienne struktury danych (immutable data structures).

Jeśli standard zdecyduje się używać podstawowego wariantu nazwy "URL" dla definiowanych przez siebie funkcji, to powinien je nazywać poprzez "url" (czyli zapisywać małymi literami i z "l" na końcu). Nazwy typu "URL", "URI" oraz "IRI" nie powinny być stosowane. Jednakże, jeśli nazwą jest połączenie, to preferowany jest zapis "URL" (wielkimi literami), dla przykładu "newURL" i "oldURL".

Interfejsy EventSource i HashChangeEvent ze specyfikacji HTML są przykładami prawidłowego nazewnictwa.

Pasek społecznościowy

SPIS TREŚCI AKTUALNEJ STRONY

Ogólne (H1) URLs (H2) Terminology (H3) ASCII digits (H4) ASCII hex digits (H4) ASCII alpha (H4) ASCII alphanumeric (H4) Parsers (H4) EOF code point (H5) parse error (H5) c (H5) remaining (H5) Percent-encoded bytes (H3) percent-encoded byte (H4) percent encode (H4) percent decode (H4) simple encode set (H4) default encode set (H4) password encode set (H4) username encode set (H4) utf-8 percent encode (H4) Hosts (domains and IP addresses) (H3) host (H4) domain (H4) IPv6 address (H4) IDNA (H4) domain to ASCII (H5) domain to Unicode (H5) Host writing (H4) valid domain (H5) Host parsing (H4) host parser (H5) IPv6 parser (H5) Host serializing (H4) host serializer (H5) IPv6 serializer (H5) URL concept (H3) URL (H4) scheme (H4) scheme data (H4) username (H4) password (H4) host (H4) port (H4) path (H4) query (H4) fragment (H4) relative flag (H4) object (H4) relative scheme (H4) default port (H4) includes credentials (H4) base URL (H4) URL writing (H4) absolute URL (H5) relative URL (H5) scheme-relative URL (H5) userinfo (H5) absolute-path-relative URL (H5) path-relative URL (H5) path segment (H5) URL code points (H5) URL units (H5) URL parsing (H4) URL parser (H5) basic URL parser (H5) set the username (H5) set the password (H5) URL serializing (H4) URL serializer (H5) Origin concept (H4) origin (H5) application/x-www-form-urlencoded concept (H3) application/x-www-form-urlencoded (H4) application/x-www-form-urlencoded parsing (H4) application/x-www-form-urlencoded parser (H5) application/x-www-form-urlencoded serializing (H4) application/x-www-form-urlencoded byte serializer (H5) application/x-www-form-urlencoded serializer (H5) Hooks (H4) application/x-www-form-urlencoded string parser (H5) URL APIs elsewhere (H3)