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.
- Niech output będzie pustą sekwencją bajtów.
Dla każdego (for each) bajtu byte z input wykonaj poniższe podkroki:
- Jeśli byte nie jest
"%"
, to dodaj byte do output. - W przeciwnym razie, jeśli byte jest "%" i następne dwa bajty za byte w input nie są w zakresach
0x30
do0x39
,0x41
do0x46
i0x61
do0x66
, to dodaj byte do output. W przeciwnym razie wykonaj poniższe wewnętrzne podkroki:
- 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.
- Dodaj do output bajt, którego wartością jest bytePoint.
- Pomiń kolejne dwa bajty w input.
- Jeśli byte nie jest
- 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:
- Jeśli code point nie znajduje się w encode set, to zwróć code point.
- Niech bytes będzie wynikiem kodowania w uft-8 na code point.
- 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:
- 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
. - Jeśli result jest błędną wartością, to zwróć błąd.
- Zwróć result.
domain to Unicode
Aby przekonwertować domenę na Unicode # (domain to Unicode) z przekazaniem domeny domain należy wykonać następujące kroki:
- Niech result będzie wynikiem uruchomienia Unicode ToUnicode z domain_name ustawionym na domain oraz UseSTD3ASCIIRules ustawionym na boolowska wartość
false
. 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:
- 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
. - Jeśli result jest błędną wartością, to zwróć błąd.
- Niech result będzie wynikiem uruchomienia Unicode ToUnicode z domain_name ustawionym na result oraz UseSTD3ASCIIRules ustawionym na boolowska wartość
true
. - Jeśli result zawiera jakikolwiek błąd, to zwróć błąd.
- 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:
- Jeśli input jest pustym łańcuchem znakowym, to zwróć błąd.
Jeśli input zaczyna się od
"["
, to wykonaj poniższe podkroki:- Jeśli input nie kończy się na
"]"
, to wykonaj błąd parsera i zwróć błąd. - Zwróć wynik parsowania IPv6 z przekazaniem input, w którym usunięto początkowy
"["
i końcowy"]"
.
- Jeśli input nie kończy się na
- Niech domain będzie wynikiem dekodowania w utf-8 bez BOM na dekodowaniu procentowym z kodowania w utf-8 na input.
- Niech asciiDomain będzie wynikiem uruchomienia konwersji domeny na ASCII z przekazaniem domain.
- Jeśli asciiDomain jest błędem, to zwróć błąd.
- Jeśli asciiDomain zawiera jeden z
U+0000
,U+0009
,U+000A
,U+000D
,U+0020
,"#"
,"%"
,"/"
,":"
,"?"
,"@"
,"["
,"\"
i"]"
, to zwróć błąd. - 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:
- Niech address będzie nowym adresem IPv6 z 16-bitowymi częściami ustawionymi na 0.
- 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.
- Niech compress pointer będzie kolejnym wskaźnikiem na 16-bitowe części w address, początkowo wartością
null
(nie wskazującym niczego). - Niech pointer będzie wskaźnikiem na input, początkowo zerowym (wskazującym na pierwszy punkt kodowy).
Jeśli c jest
":"
, to wykonaj poniższe podkroki:- Jeśli pozostałość nie zaczyna się od
":"
, to wykonaj błąd parsera i zwróć błąd. - Zwiększ pointer o dwa.
- Zwiększ piece pointer o jeden i ustaw compress pointer na piece pointer.
- Jeśli pozostałość nie zaczyna się od
Główna #: Dopóki (while) c nie jest punktem kodowym EOF, to wykonaj poniższe podkroki:
- Jeśli piece pointer ma wartość osiem, to wykonaj błąd parsera i zwróć błąd.
Jeśli c jest
":"
, to wykonaj poniższe wewnętrzne podkroki:- Jeśli compress pointer nie jest wartością
null
, to wykonaj błąd parsera i zwróć błąd. - Zwiększ pointer oraz piece pointer o jeden, ustaw compress pointer na piece pointer, a następnie przejdź do Główna.
- Jeśli compress pointer nie jest wartością
- Niech value i length będą 0.
- 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.
W oparciu o c:
"."
- Jeśli length ma wartość 0, to wykonaj błąd parsera i zwróć błąd.
- Zmniejsz pointer o length.
- Przejdź do IPv4.
":"
- Zwiększ pointer o jeden.
- Jeśli c jest punktem kodowym EOF, to wykonaj błąd parsera i zwróć błąd.
- Wszystko prócz punktu kodowego EOF
- Wykonaj błąd parsera i zwróć błąd.
- Ustaw piece na value.
- Zwiększ piece pointer o jeden.
- Jeśli c jest punktem kodowym EOF, to przejdź do Finał.
- IPv4 #: Jeśli piece pointer jest większy od sześciu, to wykonaj błąd parsera i zwróć błąd.
- Niech dots seen będzie 0.
Dopóki (while) c nie jest punktem kodowym EOF, to wykonaj poniższe podkroki:
- Niech value będzie wartością
null
. - Jeśli c nie jest cyfrą ASCII, to wykonaj błąd parsera i zwróć błąd.
Dopóki (while) c jest cyfrą ASCII, to wykonaj poniższe wewnętrzne podkroki:
- Niech number będzie c interpretowanym jak liczba dziesiętna.
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.
- Zwiększ pointer o jeden.
- Jeśli value jest większe od 255, to wykonaj błąd parsera i zwróć błąd.
- Jeśli dots seen jest mniejsze od 3 i c nie jest
"."
, to wykonaj błąd parsera i zwróć błąd. - Ustaw piece na piece * 0x100 + value.
- Jeśli dots seen jest 1 lub 3, to zwiększ piece pointer o jeden.
- Zwiększ pointer o jeden.
- Jeśli dots seen jest 3 i c nie jest punktem kodowym EOF, to wykonaj błąd parsera i zwróć błąd.
- Zwiększ dots seen o jeden.
- Niech value będzie wartością
Finał #: Jeśli compress pointer nie ma wartości
null
, to wykonaj poniższe podkroki:- Niech swaps będzie piece pointer - compress pointer.
- Ustaw piece pointer na siedem.
- 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.
- 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. - Zwróć address.
Host serializing#
host serializer
Serializer hosta # (host serializer) pobiera wartość null
lub host host, a następnie wykonuje następujące kroki:
- Jeśli host jest wartością
null
, to zwróć pusty łańcuch znakowy. - 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"]"
. - 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:
- Niech output będzie pustym łańcuchem znakowym.
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 drugie0
.- Jeśli nie ma sekwencji zerowych 16-bitowch części w address dłuższej niż jeden, to ustaw compress pointer na wartość
null
. Dla każdej (for each) części piece ze wszystkich części w address wykonaj poniższe podkroki:
- 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. - Dodaj piece, która jest reprezentowana przez najkrótszą zapisaną małymi literami liczbę szesnastkową, do output.
- Jeśli piece nie jest ostatnią częścią w address, to dodaj
":"
do output.
- Jeśli compress pointer wskazuje na piece, to dodaj
- 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.
Schemat | Port |
---|---|
"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:
- Niech url będzie wynikiem działania bazowego parsera adresu URL na input z przekazaniem base i encoding override.
- Jeśli url jest błędem, to zwróć błąd.
- Jeśli schematem w url nie jest
"blob"
, to zwróć url. - Jeśli dane schematu nie są w magazynie blob URL, to zwróć url.
- Ustaw obiekt w url na ustrukturyzowaną kopię wejścia w magazynie blob URL odpowiadającego danym schematu w url.
- 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.
Jeśli url nie został przekazany:
- Ustaw url na nowy adres URL.
- Usuń wszystkie początkowe i końcowe białe znaki ASCII z input.
- Niech state będzie state override jeśli został przekazany, w przeciwnym razie stanem początku schematu.
- Jeśli base nie został przekazany, to ustaw go na wartość
null
. - Jeśli encoding override nie został przekazany, to ustaw go na utf-8.
- Niech buffer będzie pustym łańcuchem znakowym.
- Niech @flag i []flag będą nieaktywne.
- Niech pointer będzie wskaźnikiem na pierwszy punkt kodowy w input.
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)
- Jeśli c jest literą ACII, to dodaj zamienione na małe litery c do buffer i ustaw state na stan schematu.
- W przeciwnym razie, jeśli state override nie został przekazany, to ustaw state na stan bez schematu i zmniejsz pointer o jeden.
- W przeciwnym razie wykonaj błąd parsera i przerwij ten algorytm.
- stan schematu # (scheme state)
- Jeśli c jest alfanumerycznym znakiem ACII,
"+"
,"-"
lub"."
, to dodaj zamienione na małe litery c do buffer. 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:- Jeśli state override został przekazany, to przerwij ten algorytm.
- Jeśli schemat z url jest schematem relatywnym, to ustaw flagę relatywności z url.
- Jeśli schematem z url jest
"file"
, to ustaw state na stan relatywności. - 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. - W przeciwnym razie, jeśli flaga relatywności z url jest ustawiona, to ustaw state na stan uwierzytelniania z pierwszym slashem.
- W przeciwnym razie ustaw state na stan danych schematu.
- 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).
- W przeciwnym razie, jeśli c jest punktem kodowym EOF, to przerwij ten algorytm.
- W przeciwnym razie wykonaj błąd parsera i przerwij ten algorytm.
- Jeśli c jest alfanumerycznym znakiem ACII,
- stan danych schematu # (scheme data state)
- Jeśli c jest
"?"
, to ustaw zapytanie z url na pusty łańcuch znakowy i state na stan zapytania. - W przeciwnym razie, jeśli c jest
"#"
, to ustaw framgent z url na pusty na pusty łańcuch znakowy i state na stan fragmentu. W przeciwnym razie wykonaj poniższe podkroki:
- Jeśli c nie jest punktem kodowym EOF, punktem kodowym adresu URL lub
"%"
, to wykonaj błąd parsera. - Jeśli c jest
"%"
i pozostałość nie zaczyna się od dwóch szesnastkowych cyfr ASCII, to wykonaj błąd parsera. - Jeśli c nie jest punktem kodowym EOF,
U+0009
,U+000A
lubU+000D
, to koduj procentowo w utf-8 nasze c z użyciem prostego zestawu kodowania i dołącz wynik do danych schematu z url.
- Jeśli c nie jest punktem kodowym EOF, punktem kodowym adresu URL lub
- Jeśli c jest
- stan bez schematu # (no scheme state)
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
.- W przeciwnym razie ustaw state na stan relatywności i zmniejsz pointer o jeden.
- stan relatywności lub uwierzytelniania # (relative or authority state)
- 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. - W przeciwnym razie wykonaj błąd parsera, ustaw state na stan relatywności i zmniejsz pointer o jeden.
- Jeśli c jest
- stan relatywności # (relative state)
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
"/"
"\"
- Jeśli c jest
"\"
, to wykonaj błąd parsera. - Ustaw state na stan relatywności ze slashem.
- Jeśli c jest
"?"
"#"
- W przeciwnym razie
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.
- Ustaw state na stan relatywności ścieżki i zmniejsz pointer o jeden.
- stan relatywności ze slashem # (relative slash state)
Jeśli c jest
"/"
lub"\"
, to wykonaj poniższe podkroki:- Jeśli c jest
"\"
, to wykonaj błąd parsera. - Jeśli schematem z url jest
"file"
, to ustaw state na stan hosta pliku. - W przeciwnym razie ustaw state na stan uwierzytelniania z ignorowaniem slashy.
- Jeśli c jest
W przeciwnym razie wykonaj poniższe podkroki:
- stan uwierzytelniania z pierwszym slashem # (authority first slash state)
- Jeśli c jest
"/"
, to ustaw state na stan uwierzytelniania z drugim slashem. - W przeciwnym razie wykonaj błąd parsera, ustaw state stan uwierzytelniania z ignorowaniem slashy i zmniejsz pointer o jeden.
- Jeśli c jest
- stan uwierzytelniania z drugim slashem # (authority second slash state)
- Jeśli c jest
"/"
, to ustaw state na stan uwierzytelniania z ignorowaniem slashy. - W przeciwnym razie wykonaj błąd parsera, ustaw state na stan uwierzytelniania z ignorowaniem slashy i zmniejsz pointer o jeden.
- Jeśli c jest
- stan uwierzytelniania z ignorowaniem slashy # (authority ignore slashes state)
- Jeśli c nie jest ani
"/"
ani"\"
, to ustaw state na stan uwierzytelniania i zmniejsz pointer o jeden. - W przeciwnym razie wykonaj błąd parsera.
- Jeśli c nie jest ani
- stan uwierzytelniania # (authority state)
Jeśli c jest
"@"
, to wykonaj poniższe podkroki:- Jeśli @flag jest ustawiona, to wykonaj błąd parsera i poprzedź buffer wartością
"%40"
. - Ustaw @flag.
Dla każdego (for each) punktu kodowego code point z buffer wykonaj poniższe wewnętrzne podkroki:
- Jeśli code point jest
U+0009
,U+000A
lubU+000D
, to wykonaj błąd parsera i kontynuuj (continue). - Jeśli code point nie jest punktem kodowym URL lub
"%"
, to wykonaj błąd parsera. - Jeśli code point jest
"%"
i pozostałość nie zaczyna się od dwóch szesnastkowych cyfr ASCII, to wykonaj błąd parsera. - 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). - 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.
- Jeśli code point jest
- Ustaw buffer na pusty łańcuch znakowy.
- Jeśli @flag jest ustawiona, to wykonaj błąd parsera i poprzedź buffer wartością
- 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. - W przeciwnym razie dodaj c do buffer.
- stan hosta pliku # (file host state)
Jeśli c jest punktem kodowym EOF,
"/"
,"\"
,"?"
lub"#"
, to zmniejsz pointer o jeden i wykonaj poniższe podkroki: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.
- W przeciwnym razie, jeśli buffer jest pustym łańcuchem znakowym, to ustaw state na stan relatywności początku ścieżki.
W przeciwnym razie wykonaj poniższe wewnętrzne podkroki:
- Niech host będzie wynikiem uruchomienia parsera hosta na buffer.
- Jeśli host jest błędem, to zwróć błąd.
- Ustaw host z url na host, buffer na pusty łańcuch znakowy i state na stan relatywności początku ścieżki.
- W przeciwnym razie, jeśli c jest
U+0009
,U+000A
lubU+000D
, to wykonaj błąd parsera. - W przeciwnym razie dodaj c do buffer.
- stan hosta # (host state)
- stan nazwy hosta # (hostname state)
Jeśli c jest
":"
i []flag jest nieaktywna, to wykonaj poniższe podkroki:- Niech host będzie wynikiem uruchomienia parsera hosta na buffer.
- Jeśli host jest błędem, to zwróć błąd.
- Ustaw host z url na host, buffer na pusty łańcuch znakowy i state na stan portu.
- Jeśli state override jest stanem nazwy hosta, to przerwij ten algorytm.
W przeciwnym razie, jeśli c jest punktem kodowym EOF,
"/"
,"\"
,"?"
lub"#"
, to zmniejsz pointer o jeden i wykonaj poniższe podkroki:- Niech host będzie wynikiem uruchomienia parsera hosta na buffer.
- Jeśli host jest błędem, to zwróć błąd.
- Ustaw host z url na host, buffer na pusty łańcuch znakowy i state na stan relatywności początku ścieżki.
- Jeśli state override został przekazany, to przerwij ten algorytm.
- W przeciwnym razie, jeśli c jest
U+0009
,U+000A
lubU+000D
, to wykonaj błąd parsera. W przeciwnym razie wykonaj poniższe podkroki:
- stan portu # (port state)
- Jeśli c jest cyfrą ASCII, to dodaj c do buffer.
W przeciwnym razie, jeśli c jest punktem kodowym EOF,
"/"
,"\"
,"?"
i"#"
, lub state override został przekazany, to wykonaj poniższe podkroki:Usuń początkowe punkty kodowe
U+0030
z buffer do chwili, kiedy początkowym punktem kodowym nie będzieU+0030
lub buffer jest pojedynczym punktem kodowym.Dla przykładu,
"42"
>"42"
,"031"
>"31"
,"080"
>"80"
czy"0000"
>"0"
.- Jeśli buffer jest równy domyślnemu portowi w schemacie z url, to ustaw buffer na pusty łańcuch znakowy.
- Ustaw port z url na buffer.
- Jeśli state override został przekazany, to przerwij ten algorytm.
- Ustaw buffer na pusty łańcuch znakowy, state na stan relatywności początku ścieżki i zmniejsz pointer o jeden.
- W przeciwnym razie, jeśli c jest
U+0009
,U+000A
lubU+000D
, to wykonaj błąd parsera. - W przeciwnym razie wykonaj błąd parsera i zwróć błąd.
- stan relatywności początku ścieżki # (relative path start state)
- Jeśli c jest
"\"
, to wykonaj błąd parsera. - Ustaw state na stan relatywności ścieżki i jeśli c nie jest ani
"/"
ani"\"
, to zmniejsz pointer o jeden.
- Jeśli c jest
- stan relatywności ścieżki # (relative path state)
Jeśli c jest punktem kodowym EOF,
"/"
czy"\"
, lub state override nie został przekazany i c jest"?"
lub"#"
, to wykonaj poniższe podkroki:- Jeśli c jest
"\"
, to wykonaj błąd parsera. 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"
- 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. - W przeciwnym razie, jeśli buffer jest
"."
i c nie jest ani"/"
ani"\"
, to dodaj pusty łańcuch znakowy do ścieżki w url. W przeciwnym razie, jeśli buffer nie jest
"."
, to wykonaj poniższe wewnętrzne podkrokiJeś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.
- Dodaj buffer do ścieżki z url.
- Ustaw buffer na pusty łańcuch znakowy.
- Jeśli c jest
"?"
, to ustaw zapytanie z url na pusty łańcuch znakowy i state na stan zapytania. - Jeśli c jest
"#"
, to ustaw fragment z url na pusty łańcuch znakowy i state na stan fragmentu.
- Jeśli c jest
- W przeciwnym razie, jeśli c jest
U+0009
,U+000A
lubU+000D
, to wykonaj błąd parsera. W przeciwnym razie wykonaj poniższe podkroki:
- Jeśli c nie jest punktem kodowym URL lub
"%"
, to wykonaj błąd parsera. - Jeśli c jest
"%"
i pozostałość nie zaczyna się od dwóch szesnastkowych cyfr ASCII, to wykonaj błąd parsera. - Koduj procentowo w utf-8 nasze c z użyciem domyślnego zestawu kodowania i dołącz wynik do buffer.
- Jeśli c nie jest punktem kodowym URL lub
- stan zapytania # (query state)
Jeśli c jest punktem kodowym EOF, lub state override nie został przekazany i c jest
"#"
, to wykonaj poniższe podkroki:- Jeśli flaga relatywności jest nieaktywna lub schemat z url jest
"ws"
lub"wss"
, to ustaw encoding override na utf-8. - Ustaw buffer na wynik kodowania buffer z użyciem encoding override.
Dla każdego (for each) bajtu byte w buffer wykonaj poniższe wewnętrzne podkroki:
- Jeśli byte jest mniejszy od
0x21
, większy od0x7E
, lub jest jednym z0x22
,0x23
,0x3C
,0x3E
i0x60
, to dodaj zakodowany procentowo byte do zapytania z url. - W przeciwnym razie dodaj punkt kodowy, którego wartością jest byte, do zapytania z url.
- Jeśli byte jest mniejszy od
- Ustaw buffer na pusty łańcuch znakowy.
- Jeśli c jest
"#"
, to ustaw fragment z url na pusty łańcuch znakowy i state na stan fragmentu.
- Jeśli flaga relatywności jest nieaktywna lub schemat z url jest
- W przeciwnym razie, jeśli c jest
U+0009
,U+000A
lubU+000D
, to wykonaj błąd parsera. W przeciwnym razie wykonaj poniższe podkroki:
- Jeśli c nie jest punktem kodowym URL lub
"%"
, to wykonaj błąd parsera. - Jeśli c jest
"%"
i pozostałość nie zaczyna się od dwóch szesnastkowych cyfr ASCII, to wykonaj błąd parsera. - Dodaj c do buffer.
- Jeśli c nie jest punktem kodowym URL lub
- stan fragmentu # (fragment state)
W oparciu o c wykonaj poniższe czynności:
- punkt kodowy EOF
- Nie rób niczego.
U+0009
U+000A
U+000D
- Wykonaj błąd parsera.
- W przeciwnym razie
- Jeśli c nie jest punktem kodowym URL lub
"%"
, to wykonaj błąd parsera. - Jeśli c jest
"%"
i pozostałość nie zaczyna się od dwóch szesnastkowych cyfr ASCII, to wykonaj błąd parsera. - Koduj procentowo w utf-8 nasze c z użyciem prostego zestawu kodowania i dołącz wynik do fragmentu z url.
- Jeśli c nie jest punktem kodowym URL lub
- 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:
- Ustaw nazwę użytkownika z url na pusty łańcuch znakowy.
- 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:
- Jeśli password jest pustym łańcuchem znakowym, to ustaw hasło z url na wartość
null
. W przeciwnym razie wykonaj poniższe podkroki:
- Ustaw hasło z url na pusty łańcuch znakowy.
- 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:
- Niech output będzie połączeniem schematu z url i
":"
. Jeśli flaga relatywności z url jest ustawiona, to wykonaj poniższe podkroki:
- Dodaj
"//"
do output. 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:- Dodaj nazwę użytkownika do output.
- Jeśli hasło z url nie jest wartością
null
, to dodaj połączenie":"
i hasła z url do output. - Dodaj
"@"
do output.
- Dodaj host z url, zserializowany, do output.
- Jeśli port z url nie jest pustym łańcuchem znakowym, to dodaj połączenie
":"
i portu z url do output. - 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ą"/"
.
- Dodaj
- W przeciwnym razie, jeśli flaga relatywności z url jest nieaktywna, to dodaj dane schematu do output.
- Jeśli zapytanie z url nie jest wartością
null
, to dodaj połączenie"?"
i zapytania z url do output. - 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. - 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"
- Niech url będzie wynikiem bazowego parsowania URL na danych schematu z adresu URL.
- 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"
- 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"
- 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
- 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:
- Jeśli encoding override nie został przekazany, to ustaw go na utf-8.
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.- Niech sequences będzie wynikiem podziału input na
"&"
. - 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. - Niech pairs będzie pustą listą par nazwa-wartość, gdzie zarówno nazwa jak i wartość przechowują sekwencję bajtów.
Dla każdej (for each) sekwencji bajtów bytes w sequences wykonaj poniższe podkroki:
- Jeśli bytes jest pustą sekwencją bajtów, to wykonaj te podkroki dla kolejnej sekwencji bajtów.
- 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. - W przeciwnym razie, niem name zawiera wartość bytes i niech value będzie pustą sekwencją bajtów.
- Zastąp każdy
"+"
w name i value przez0x20
. Jeśli use _charset_ flag jest ustawiona i name jest
"_charset_"
, to wykonaj poniższe wewnętrzne podkroki:- Niech result będzie wynikiem pobrania kodowania dla value, zdekodowanym w utf-8 bez BOM.
- Jeśli result nie jest błędem, to dezaktywuj use _charset_ flag i ustaw encoding override na result.
- Dodaj parę składającą się z name i value do pairs.
- Niech output będzie pustą listą par nazwa-wartość, gdzie zarówno nazwa jak i wartość przechowują łańcuch znakowy.
- 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.
- 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:
- Niech output będzie pustym łańcuchem znakowym.
Dla każdego bajtu byte w input, w zależności od byte:
0x20
- Dodaj
U+002B
do output.
- Dodaj
0x2A
0x2D
0x2E
0x30
do0x39
0x41
do0x5A
0x5F
0x61
do0x7A
- Dodaj do output punkt kodowy, którego wartością jest byte.
- W przeciwnym razie
- Dodaj do output zakodowany procentowo byte.
- 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:
- Jeśli encoding override nie został przekazany, to ustaw go na utf-8.
- Niech output będzie pustym łańcuchem znakowym.
Dla każdej (for each) pary pair w pairs wykonaj poniższe podkroki:
- Niech outputPair będzie kopią pair.
- Zastąp nazwę i wartość z outputPair rezultatem uruchomienia na nich kodowania z przekazaniem encoding override.
- Zastąp nazwę i wartość z outputPair rezultatem uruchomienia na nich serializera
application/x-www-form-urlencoded
bajtów. - Jeśli pair nie jest pierwszą parą w pairs, to dodaj
"&"
do output. - Dodaj do output nazwę z outputPair, po której następuje
"="
, po której następuje wartość z outputPair.
- 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.