>  기사  >  백엔드 개발  >  Go Reverse Proxy에서 응답 본문을 어떻게 검사하고 수정합니까?

Go Reverse Proxy에서 응답 본문을 어떻게 검사하고 수정합니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-07 22:48:02269검색

How do I Inspect and Modify the Response Body in a Go Reverse Proxy?

ReverseProxy에서 응답 본문을 검사하고 수정하는 방법

제공된 Go 코드에는 요청을 Google로 리디렉션하도록 역방향 프록시가 설정되어 있습니다. 그러나 더 깊은 통찰력을 얻거나 응답을 사용자 정의하려면 응답 본문에 액세스하는 것이 필수적입니다.

해결책은 ReverseProxy 구조체 내의 ModifyResponse 필드를 활용하는 데 있습니다. 이 필드에서는 HTTP 응답이 클라이언트에 도달하기 전에 이를 수정하는 함수를 지정할 수 있습니다.

구현

다음 수정된 코드는 응답 본문을 읽고 수정하는 방법을 보여줍니다.

package main

import (
    "bytes"
    "fmt"
    "io"
    "io/ioutil"
    "net/http"
    "net/http/httputil"
    "net/url"
    "strconv"
)

func main() {
    target := &url.URL{Scheme: "http", Host: "www.google.com"}
    proxy := httputil.NewSingleHostReverseProxy(target)

    // Modify the response body before sending it to the client
    proxy.ModifyResponse = func(resp *http.Response) (err error) {
        b, err := ioutil.ReadAll(resp.Body) // Read the response body
        if err != nil {
            return err
        }
        err = resp.Body.Close() // Close the `Body` and `resp`
        if err != nil {
            return err
        }

        // Modify the response body
        b = bytes.Replace(b, []byte("server"), []byte("schmerver"), -1)

        // Create a new `body` to keep the `Content-Length` and `Body` up-to-date
        body := ioutil.NopCloser(bytes.NewReader(b))
        resp.Body = body
        resp.ContentLength = int64(len(b))
        resp.Header.Set("Content-Length", strconv.Itoa(len(b)))

        fmt.Println("Modified response: ", string(b)) // See the modified response

        return nil
    }

    http.Handle("/google", proxy)
    http.ListenAndServe(":8099", nil)
}

작동 방식

ModifyResponse 함수는 다음을 사용하여 원본 응답 본문을 버퍼로 읽어옵니다. ioutil.ReadAll. 그런 다음 원본 resp.Body를 닫고 본문 콘텐츠를 수정합니다.

응답이 유효한지 확인하기 위해 새 본문이 생성되어 resp.Body에 할당됩니다. Content-Length 헤더도 새로운 본문 길이를 반영하도록 업데이트되었습니다.

마지막으로 수정된 응답 본문이 쉽게 검사할 수 있도록 콘솔에 인쇄되고 수정된 응답이 클라이언트로 전송됩니다.

위 내용은 Go Reverse Proxy에서 응답 본문을 어떻게 검사하고 수정합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.