Modificação Transparente de Requisições HTTP

GolangBeginner
Pratique Agora

Introdução

Neste projeto, você aprenderá como implementar uma modificação transparente de requisições HTTP usando a interface http.RoundTripper do Go. Você criará um transporte HTTP customizado que calcula o hash MD5 do corpo da requisição e o adiciona ao cabeçalho da requisição como o campo "X-Md5".

👀 Pré-visualização

$ /usr/local/go/bin/go test
PASS
ok      md5transport    0.004s

🎯 Tarefas

Neste projeto, você aprenderá:

  • Como encapsular a interface http.RoundTripper para realizar operações customizadas em requisições e respostas HTTP.
  • Como calcular o hash MD5 do corpo da requisição e adicioná-lo ao cabeçalho da requisição.
  • Como resetar o corpo da requisição após calcular o hash MD5 para manter o estado original da requisição.

🏆 Conquistas

Após completar este projeto, você será capaz de:

  • Entender o conceito de modificação transparente de requisições HTTP em Go.
  • Implementar camadas de transporte HTTP customizadas que podem realizar várias operações em requisições e respostas.
  • Aplicar o conhecimento para aprimorar suas próprias aplicações com funcionalidades adicionais, como autenticação, logging ou manipulação de requisições/respostas.

Implementar o Cálculo MD5 e a Modificação do Cabeçalho

Nesta etapa, você aprenderá como implementar uma função simples de verificação de dados que calcula o MD5 do corpo da requisição, o converte para hexadecimal e o adiciona ao cabeçalho da requisição com o nome X-Md5.

  1. Abra o arquivo md5_transport.go no editor.
  2. Adicione o conteúdo necessário ao import.
import (
 "bytes"
 "crypto/md5"
 "encoding/hex"
 "io"
 "net/http"
)
  1. Na função RoundTrip da struct Transport, adicione o seguinte código para calcular o MD5 do corpo da requisição e defini-lo no cabeçalho da requisição:
// Complete the code
// if reqeust body is not nil, calculate md5 and set to header
if req.Body != nil {
    body, err := io.ReadAll(req.Body)
    if err != nil {
        // If read body error, return the original request.
        // dont't interrupt the request
        return t.RoundTripper.RoundTrip(req)
    }

    // Calculate md5
    md5Hash := md5.Sum(body)
    md5HashStr := hex.EncodeToString(md5Hash[:])

    // Set md5 to header
    req.Header.Set("X-Md5", md5HashStr)

    // Reset request body
    req.Body = io.NopCloser(bytes.NewReader(body))
}

Este código primeiro verifica se o corpo da requisição não é nil. Se não for, ele lê todo o corpo usando io.ReadAll, calcula o hash MD5 usando o pacote md5 e converte o hash em uma string hexadecimal. Em seguida, ele define o cabeçalho "X-Md5" com o valor MD5 calculado. Finalmente, ele redefine o corpo da requisição para o estado original usando bytes.NewReader.

  1. Após adicionar o código, salve o arquivo md5_transport.go.

Testar a Implementação

Para testar a implementação, siga estes passos:

  1. Abra o terminal no editor.

  2. Navegue até o diretório do projeto:

    cd /home/labex/project
    
  3. Execute os testes:

    /usr/local/go/bin/go test
    

Se o código for implementado corretamente, você deverá ver a seguinte saída:

PASS
ok      md5transport    0.004s

Isso indica que os testes foram aprovados e sua implementação do cálculo MD5 e da modificação do cabeçalho está funcionando conforme o esperado.

Entender a Modificação Transparente de Requisições HTTP

Em Go, frequentemente fazemos requisições de rede usando http.Client, que internamente cria um http.Request e então usa http.RoundTripper.RoundTrip para fazer a requisição real. As operações reais de transferência de dados são realizadas dentro de RoundTrip.

Ao encapsular a interface http.RoundTripper, podemos realizar várias operações na requisição e na resposta, como autenticação, estatísticas, registro de auditoria e modificação de requisições, tudo de forma transparente para o usuário.

Neste desafio, implementamos uma função simples de verificação de dados que calcula o MD5 do corpo da requisição e o adiciona ao cabeçalho da requisição. Este é apenas um exemplo de como você pode usar a interface http.RoundTripper para modificar requisições HTTP de forma transparente.

Ao projetar sua biblioteca de módulos ou usar componentes de terceiros, você pode pensar em como pode usar essa técnica para adicionar funcionalidade adicional ou modificar o comportamento de sua aplicação de forma transparente.

Resumo

Parabéns! Você concluiu este projeto. Você pode praticar mais laboratórios no LabEx para aprimorar suas habilidades.

✨ Verificar Solução e Praticar✨ Verificar Solução e Praticar✨ Verificar Solução e Praticar