Codificação percent, manipulação de query strings e parsing/construção completa de URLs.
import url
Codifica (percent-encode) um único componente, escapando caracteres reservados.
url_encode_component("a b&c")
-- Saída: "a%20b%26c"
Decodifica um componente codificado (e transforma + em espaço).
url_decode_component("a%20b%26c")
-- Saída: "a b&c"
Constrói uma query string a partir de uma lista de pares [chave, valor], codificando cada parte.
build_query([["a", "1"], ["name", "bern lang"]]) -- Saída: "a=1&name=bern%20lang"
Faz parse de uma query string em um objeto de chaves e valores decodificados.
params = parse_query("a=1&name=bern%20lang")
params["name"]
-- Saída: "bern lang"
Faz parse de uma URL em scheme, host, port, path, query e fragment. Portas padrão são preenchidas para http (80) e https (443).
parsed = parse_url("http://example.com:8080/docs/api?x=1#top")
parsed["host"]
-- Saída: "example.com"
parsed["port"]
-- Saída: 8080
parsed["path"]
-- Saída: "/docs/api"
Monta uma URL a partir de seus componentes. Uma porta igual à padrão do scheme é omitida.
build_url("https", "example.com", 443, "/hello", "a=1", "frag")
-- Saída: "https://example.com/hello?a=1#frag"
As peças combinam para uma ida e volta completa: fazer parse de uma URL, editar a query e reconstruí-la. Aqui adicionamos um parâmetro a um link existente:
import url original = "https://search.example.com/?q=bern" u = parse_url(original) params = parse_query(u["query"]) params["page"] = "2" -- reconstrói a query a partir do objeto (agora maior) new_query = build_query([["q", params["q"]], ["page", params["page"]]]) build_url(u["scheme"], u["host"], u["port"], u["path"], new_query, "") -- Saída: "https://search.example.com/?q=bern&page=2"
E codificar entrada do usuário com segurança antes de colocá-la em um link:
import url term = "bern lang & friends" "https://example.com/?q=" + url_encode_component(term) -- Saída: "https://example.com/?q=bern%20lang%20%26%20friends"