> 백엔드 개발 > C++ > URL로 인코딩된 HTTP GET 요청에서 리터럴 슬래시를 어떻게 보존할 수 있습니까?

URL로 인코딩된 HTTP GET 요청에서 리터럴 슬래시를 어떻게 보존할 수 있습니까?

Susan Sarandon
풀어 주다: 2024-12-31 11:19:14
원래의
836명이 탐색했습니다.

How Can I Preserve Literal Slashes in URL-Encoded HTTP GET Requests?

URL 인코딩: HTTP GET에서 리터럴 슬래시 유지

HTTP GET 요청에서 URL 인코딩은 다음과 같은 특수 문자를 전송하는 데 중요합니다. 표준 문자 집합의 일부가 아닙니다. 그러나 URL 경로에 슬래시(/)가 포함된 경우 특정 GET 구현은 이를 자동으로 이중 슬래시(//) 구문으로 변환합니다. URL 인코딩된 슬래시 문자는 HTTP/GET을 통한 OCSP와 같은 프로토콜을 준수하는 데 필수적이므로 전송할 때 문제가 될 수 있습니다.

다음 코드 조각에서는 문제를 보여줍니다.

using (WebClient webClient = new WebClient())
{
  webClient.DownloadData("http://example.com/%2F");
}
로그인 후 복사

그러나 서버로 전송되는 실제 요청은 다음과 같습니다.

GET // HTTP/1.1
Host: example.com
Connection: Keep-Alive
로그인 후 복사

HTTP에서 리터럴 슬래시를 유지하려면 GET에는 맞춤형 솔루션이 필요합니다. 다음은 경로와 쿼리를 유지하기 위해 Uri 개체를 수정하는 코드 조각입니다.

Uri uri = new Uri("http://example.com/%2F");
ForceCanonicalPathAndQuery(uri);
using (WebClient webClient = new WebClient())
{
  webClient.DownloadData(uri);
}

void ForceCanonicalPathAndQuery(Uri uri){
  string paq = uri.PathAndQuery; // need to access PathAndQuery
  FieldInfo flagsFieldInfo = typeof(Uri).GetField("m_Flags", BindingFlags.Instance | BindingFlags.NonPublic);
  ulong flags = (ulong) flagsFieldInfo.GetValue(uri);
  flags &= ~((ulong) 0x30); // Flags.PathNotCanonical|Flags.QueryNotCanonical
  flagsFieldInfo.SetValue(uri, flags);
}
로그인 후 복사

Uri 개체를 수정하면 경로가 강제로 원래 상태로 유지되므로 리터럴 슬래시가 보존됩니다. GET 요청. 이 솔루션을 사용하면 URL 인코딩 슬래시가 필요한 프로토콜을 규격에 맞게 구현할 수 있습니다.

위 내용은 URL로 인코딩된 HTTP GET 요청에서 리터럴 슬래시를 어떻게 보존할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿