Modelo de execução
Cada requisição pode carregar dois snippets opcionais de JavaScript:
- Um pre-request script roda antes de a requisição ser enviada. Ele pode ler e modificar o método, a URL, o body e os cabeçalhos da requisição; ler e escrever variáveis de ambiente; emitir logs; e definir tests.
- Um post-response script roda depois que a resposta chega. Ele pode ler a resposta (status, cabeçalhos, body, timing, tamanho, JSON/XML parseado), ler e escrever variáveis de ambiente, logar e rodar tests. Ele não pode modificar a requisição — esse trem já passou.
Os scripts são escritos em JavaScript e rodam dentro de um sandbox isolado e síncrono. Eles têm
acesso a um único global, fp.
O sandbox protege contra footguns acidentais — APIs assíncronas, loops descontrolados, imports de Node por
engano — mas não foi projetado para conter um script malicioso. Trate um arquivo .http de uma fonte
não confiável como você trataria um script de shell da mesma fonte: leia antes de rodar.
A API fp
Section titled “A API fp”| Membro | Fases | Propósito |
|---|---|---|
fp.request.method / url / body | pre: leitura/escrita · post: somente leitura | Mutar a requisição em andamento antes do envio. |
fp.request.headers.get/getAll/set/add/remove/count/toObject | pre: completo · post: somente leitura | Acesso a cabeçalhos case-insensitive. getAll / add / count reconhecem duplicados (leem ou escrevem nomes repetidos); toObject perde informação. |
fp.response.status / statusText / body / timingMs / sizeBytes | somente post | Campos de resposta somente leitura. sizeBytes é medido depois de decodificar uma resposta comprimida. |
fp.response.decodingStatus | somente post | Resultado da decodificação do body conforme Content-Encoding: 'decoded', 'not-required', 'unsupported' ou 'failed' (nos dois últimos, o body fica como recebido). |
fp.response.headers.get/getAll/count/toObject | somente post | Cabeçalhos de resposta somente leitura. getAll / count expõem duplicados (p. ex. Set-Cookie). |
fp.response.json() | somente post | Parseia o body como JSON (limite de 10 MB). Lança erro quando o body não pôde ser decodificado. |
fp.response.xml2Json(options?) | somente post | Parseia o body como XML em uma árvore de objetos (limite de 10 MB). Lança erro quando o body não pôde ser decodificado. |
fp.environment.get/set/remove/toObject | ambas | Lê/escreve o ambiente persistido. |
fp.variables.get/set | ambas | Lê/escreve variáveis efêmeras por envio. |
fp.test(name, fn) | ambas | Define uma asserção de test. |
fp.expect(value) | ambas | Asserções fluentes no estilo Chai. |
fp.log/warn/error(...) | ambas | Captura linhas de log (também expostas via console.log/warn/error). |
O sandbox é deliberadamente restrito. O seguinte não está disponível de propósito:
- Promises,
async/await,setTimeout,setInterval,queueMicrotaskou qualquer outra primitiva assíncrona — os scripts devem terminar de forma síncrona. eval(),new Function(), compilação de WebAssembly.- Acesso a filesystem, rede, SO ou ambiente.
- Globais do DOM, internals do runtime ou qualquer API de extensão.
Scripts CPU-bound são interrompidos abruptamente em 5 segundos. Os parsers de JSON e XML limitam sua entrada em 10 MB cada um, para que uma resposta gigante não trave o app.