feat(browser): auto-commit con 60 cambios
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
---
|
||||
name: har_extract_calls
|
||||
kind: function
|
||||
lang: py
|
||||
domain: cybersecurity
|
||||
version: "1.0.0"
|
||||
purity: pure
|
||||
signature: "def har_extract_calls(entries: list[dict], *, drop_headers: list[str] | None = None) -> list[dict]"
|
||||
description: "Normaliza una lista de entries HAR (salida de har_filter_flows) en call specs reproducibles: extrae cookies del header Cookie, limpia headers hop-by-hop, infiere body_type y expone los datos de auth para parametrizar luego con {{param}}. Segundo paso del patron grabar->destilar->reproducir un flujo web. NO auto-parametriza."
|
||||
tags: [flow-replay, har, http, proxy, cybersecurity, python]
|
||||
uses_functions: []
|
||||
uses_types: []
|
||||
returns: []
|
||||
returns_optional: false
|
||||
error_type: ""
|
||||
imports: []
|
||||
params:
|
||||
- name: entries
|
||||
desc: "lista de entries HAR (cada uno con request y, opcional, response). Tipicamente la salida de har_filter_flows."
|
||||
- name: drop_headers
|
||||
desc: "nombres extra de headers a eliminar (case-insensitive), aparte de los hop-by-hop por defecto. None = no quitar extras."
|
||||
output: "lista de call specs (una por entry) con claves: method (upper), url, headers (sin hop-by-hop ni Cookie), cookies (parseadas del header Cookie), body, body_type (json|form|raw|None), status (int|None), sets_cookies (nombres de cookies que setea la respuesta)"
|
||||
tested: true
|
||||
tests:
|
||||
- "test_golden_post_con_cookie_y_body_json"
|
||||
- "test_edge_get_sin_body"
|
||||
- "test_drop_headers_extra_respetado"
|
||||
- "test_form_body_y_set_cookie_desde_headers"
|
||||
- "test_lista_vacia"
|
||||
test_file_path: "python/functions/cybersecurity/har_extract_calls_test.py"
|
||||
file_path: "python/functions/cybersecurity/har_extract_calls.py"
|
||||
---
|
||||
|
||||
## Ejemplo
|
||||
|
||||
```python
|
||||
from har_extract_calls import har_extract_calls
|
||||
|
||||
entries = [
|
||||
{
|
||||
"request": {
|
||||
"method": "post",
|
||||
"url": "https://api.example.com/login",
|
||||
"headers": [
|
||||
{"name": "Host", "value": "api.example.com"},
|
||||
{"name": "Content-Type", "value": "application/json"},
|
||||
{"name": "Cookie", "value": "session=abc; csrf=xyz"},
|
||||
],
|
||||
"postData": {
|
||||
"mimeType": "application/json",
|
||||
"text": '{"user":"neo","pass":"secret"}',
|
||||
},
|
||||
},
|
||||
"response": {"status": 200, "cookies": [{"name": "session", "value": "new"}]},
|
||||
}
|
||||
]
|
||||
|
||||
har_extract_calls(entries)
|
||||
# [{
|
||||
# "method": "POST",
|
||||
# "url": "https://api.example.com/login",
|
||||
# "headers": {"Content-Type": "application/json"}, # Host (hop-by-hop) y Cookie removidos
|
||||
# "cookies": {"session": "abc", "csrf": "xyz"}, # parseadas del header Cookie
|
||||
# "body": '{"user":"neo","pass":"secret"}',
|
||||
# "body_type": "json", # inferido del mimeType
|
||||
# "status": 200,
|
||||
# "sets_cookies": ["session"], # cookies que setea la respuesta
|
||||
# }]
|
||||
```
|
||||
|
||||
## Cuando usarla
|
||||
|
||||
Usala tras `har_filter_flows`, una vez tienes los entries HAR del flujo que te interesa, para obtener el boceto normalizado de los requests. Las call specs resultantes son el punto de partida para: (1) marcar a mano los valores dinamicos con `{{param}}` y guardar el flujo como funcion-accion del registry, o (2) reproducir la secuencia con `http_replay_sequence_py_infra`. Tambien para auditar rapido que cookies/headers de auth lleva cada peticion de un flujo capturado.
|
||||
|
||||
## Gotchas
|
||||
|
||||
- **NO auto-parametriza.** Deja todos los valores tal cual aparecen en el HAR. La deteccion de CSRF tokens, anti-forgery y otros valores dinamicos es responsabilidad del humano/Claude, que los marca despues con `{{param}}`. La auto-deteccion es v2, fuera de scope.
|
||||
- **El output contiene secretos.** Las cookies de sesion, tokens `Authorization` y demas auth del HAR viajan tal cual en las call specs. NO commitear el output crudo ni pegarlo en sitios publicos: redactar/parametrizar antes de persistir.
|
||||
- **Headers hop-by-hop se descartan siempre** (host, content-length, connection, keep-alive, proxy-connection, accept-encoding, te, trailer, transfer-encoding, upgrade). Si necesitas conservar alguno para reproducir un caso especial, tendras que reañadirlo manualmente en la call spec.
|
||||
- **El header `Cookie` se mueve a `cookies`** y desaparece de `headers`: al reproducir, el cliente HTTP debe re-serializar las cookies (no asumir que siguen en headers).
|
||||
Reference in New Issue
Block a user