>백엔드 개발 >Golang >후속 처리기에 대한 데이터 손실 없이 HTTP 요청 본문을 검사하려면 어떻게 해야 합니까?

후속 처리기에 대한 데이터 손실 없이 HTTP 요청 본문을 검사하려면 어떻게 해야 합니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-25 01:27:14496검색

How Can I Inspect an HTTP Request Body Without Losing Data for Subsequent Handlers?

HTTP.Handler로 본문을 검사하는 동안 요청 상태 보존

HTTP 핸들러 구현 컨텍스트에서 다음과 같은 메서드를 사용하여 요청 본문에 액세스 req.ParseForm()은 딜레마를 일으킬 수 있습니다. 이러한 검사는 종종 필요하지만 요청의 본문 스트림을 고갈시켜 후속 핸들러(예: 역방향 프록시)가 사용할 수 없게 만들 수 있습니다.

문제: 본문 스트림 배수

req.ParseForm()과 같은 메서드를 호출하여 요청 본문이 소비되면 req.Body.Reader 스트림은 다음과 같습니다. 배수되어 다운스트림 핸들러에 남은 데이터가 남지 않습니다. 예상되는 요청 본문 길이가 더 이상 고갈 상태와 일치하지 않으므로 프록시 전달 시 오류가 발생합니다.

해결책: 본문 스트림 분할

이 문제를 극복하려면 , 완충층을 포함하는 기술이 채용될 수 있다. 요청 본문을 버퍼로 읽고 해당 버퍼를 사용하여 여러 개의 새로운 판독기를 생성함으로써 원래 본문 스트림에서 검사를 분리할 수 있습니다.

단계:

  1. io.ReadAll(r.Body)를 사용하여 원래 요청 본문을 버퍼로 읽어옵니다.
  2. 다음에서 두 개의 새로운 판독기를 만듭니다. buffer.
  3. 본문 검사를 수행하려면 하나의 새 리더를 사용합니다(예: doStuff(rdr1)).
  4. 두 번째 새 리더를 r.Body에 할당하고 이후의 경우 원래 상태를 유지합니다.

예:

buf, _ := io.ReadAll(r.Body)
rdr1 := io.NopCloser(bytes.NewBuffer(buf))
rdr2 := io.NopCloser(bytes.NewBuffer(buf))

doStuff(rdr1)
r.Body = rdr2

혜택:

  1. 보존 요청 상태: 원래 req.Body는 다음 기간 동안 그대로 유지됩니다.
  2. 본문 구문 분석 지원: req.ParseForm()과 같은 검사 메서드는 요청 상태에 영향을 주지 않고 별도의 리더에서 사용할 수 있습니다.
  3. 지원 맞춤형 본체 처리: 별도의 리더기를 사용하면 다운스트림 작업을 방해하지 않고 맞춤형 본체를 처리할 수 있습니다.

위 내용은 후속 처리기에 대한 데이터 손실 없이 HTTP 요청 본문을 검사하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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