Go Academy · Aula

Middleware de CORS e recuperação de panic

Políticas entre origens e recuperação após panics

Aula 4 de 413 etapas

Middleware de CORS e recuperação de panic é uma aula grátis de Go Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Go Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Go Academy inclui 4 aulas no total.

O que é CORS?

O Compartilhamento de recursos entre origens (CORS) é um mecanismo de segurança do navegador que restringe quais origens podem fazer solicitações HTTP à sua API. O servidor permite isso definindo cabeçalhos de resposta.

Solicitação preliminar do CORS

Antes de uma solicitação entre origens com um cabeçalho personalizado ou um método não simples, o navegador envia uma solicitação OPTIONS preliminar. Seu middleware deve tratar OPTIONS e retornar 200 com cabeçalhos CORS.

Middleware CORS

Um middleware CORS simples para desenvolvimento:

func CORS(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        w.Header().Set("Access-Control-Allow-Origin", "https://myapp.com")
        w.Header().Set("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS")
        w.Header().Set("Access-Control-Allow-Headers", "Authorization,Content-Type")
        if r.Method == http.MethodOptions {
            w.WriteHeader(http.StatusOK); return
        }
        next.ServeHTTP(w, r)
    })
}

Origens permitidas

Não use Access-Control-Allow-Origin: * quando houver credenciais (cookies, cabeçalhos Authorization) envolvidas — use uma origem explícita. Para várias origens, compare-as com uma lista de permissões.

allowedOrigins := map[string]bool{
    "https://app.example.com": true,
    "https://dev.example.com": true,
}

if allowedOrigins[r.Header.Get("Origin")] {
    w.Header().Set("Access-Control-Allow-Origin", r.Header.Get("Origin"))
}

Access-Control-Allow-Credentials

Permita que cookies e cabeçalhos de autorização sejam enviados entre origens:

w.Header().Set("Access-Control-Allow-Credentials", "true")

Biblioteca rs/cors

Use a biblioteca github.com/rs/cors para obter um CORS adequado à produção, com correspondência flexível de origens, suporte a credenciais e armazenamento em cache de solicitações preliminares.

c := cors.New(cors.Options{
    AllowedOrigins: []string{"https://example.com"},
    AllowedMethods: []string{"GET","POST","PUT","DELETE"},
    AllowedHeaders: []string{"Authorization","Content-Type"},
    AllowCredentials: true,
})
handler := c.Handler(mux)

Middleware de recuperação de pânico

Recupere-se de pânicos para impedir que o servidor trave e perca todas as conexões ativas:

func Recovery(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        defer func() {
            if rec := recover(); rec != nil {
                log.Printf("panic: %v\n%s", rec, debug.Stack())
                http.Error(w, "Internal Server Error", 500)
            }
        }()
        next.ServeHTTP(w, r)
    })
}

runtime/debug.Stack

Imprima o rastreamento completo da pilha da goroutine quando ocorrer um pânico para ajudar a diagnosticar a causa raiz:

import "runtime/debug"
log.Printf("panic: %v\n%s", rec, debug.Stack())

Integração com o Sentry

Envie os pânicos ao Sentry ou a serviços semelhantes de rastreamento de erros dentro do middleware de recuperação, antes de retornar 500 ao cliente.

Ordem: Recovery na camada mais externa

Sempre registre Recovery como o middleware mais externo (aplicado primeiro), para que ele capture os pânicos de todos os outros middlewares e manipuladores.

handler := Recovery(RequestID(Logger(Auth(mux))))

Testando a recuperação de pânico

Escreva um manipulador que provoque um pânico deliberadamente, chame-o por meio do middleware em um httptest e verifique se a resposta é 500.

panicHandler := http.HandlerFunc(func(_ http.ResponseWriter, _ *http.Request) { panic("test") })
w := httptest.NewRecorder()
Recovery(panicHandler).ServeHTTP(w, httptest.NewRequest("GET", "/", nil))
assert.Equal(t, 500, w.Code)

Verificação rápida

Por que o middleware de recuperação de pânico precisa ser a camada mais externa?

Recapitulação: CORS e recuperação de pânico

Pontos principais:

  • CORS: defina os cabeçalhos Access-Control-Allow-* e trate a solicitação preliminar OPTIONS
  • Allow-Origin: origem explícita (não *) quando houver credenciais
  • Recovery: defer recover() + registre o rastreamento da pilha + retorne 500
  • Recovery deve ser o middleware mais externo
Grátis para começar

Aprenda Go com um tutor de IA — grátis

Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.

Cursos
51
Aulas
203

Perguntas Frequentes

A aula “Middleware de CORS e recuperação de panic” é grátis?

Sim — o texto completo de “Middleware de CORS e recuperação de panic” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Go Academy, atualize para CoddyKit PRO. O curso de Go Academy inclui 4 aulas no total.

O que vou aprender em “Middleware de CORS e recuperação de panic”?

Políticas entre origens e recuperação após panics Você pratica Go Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Go Academy?

Nenhuma experiência prévia é necessária. Go Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.

Quanto tempo leva a aula “Middleware de CORS e recuperação de panic”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Go Academy?

Sim. Cada aula de Go Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Fundamentos da cadeia de middleware HTTP
  2. Middleware de logging e ID de requisição
  3. Middleware de autenticação e limitação de taxa
  4. Middleware de CORS e recuperação de panic
← Voltar para Go Academy