---
name: http_cors_middleware
kind: function
lang: go
domain: infra
version: "1.0.0"
purity: pure
signature: "func HTTPCORSMiddleware(origins []string, methods []string) Middleware"
description: "Retorna un Middleware que setea headers CORS en cada respuesta HTTP. Maneja automaticamente las peticiones preflight OPTIONS con status 204."
tags: [http, cors, middleware, headers, server, infra]
uses_functions: []
uses_types: [Middleware_go_infra]
returns: [Middleware_go_infra]
returns_optional: false
error_type: ""
imports: [net/http, strings]
params:
  - name: origins
    desc: "lista de origenes permitidos (ej: [\"https://example.com\"] o [\"*\"] para cualquiera)"
  - name: methods
    desc: "lista de metodos HTTP permitidos (ej: [\"GET\", \"POST\", \"PUT\", \"DELETE\"])"
output: "Middleware que inyecta Access-Control-Allow-Origin, Access-Control-Allow-Methods y Access-Control-Allow-Headers en cada respuesta"
tested: true
tests: ["setea headers CORS en respuesta normal", "responde 204 a peticion OPTIONS preflight", "headers incluyen los origenes configurados", "headers incluyen los metodos configurados"]
test_file_path: "functions/infra/http_cors_middleware_test.go"
file_path: "functions/infra/http_cors_middleware.go"
---

## Ejemplo

```go
cors := HTTPCORSMiddleware(
    []string{"https://app.example.com"},
    []string{"GET", "POST", "PUT", "DELETE"},
)
chain := HTTPMiddlewareChain(cors)
http.ListenAndServe(":8080", chain(mux))
```

## Notas

Funcion pura — construye el middleware a partir de los parametros sin I/O. El header Access-Control-Allow-Headers siempre incluye "Content-Type, Authorization". Las peticiones OPTIONS reciben 204 No Content sin llegar al handler de negocio.
