제공된 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!