C\#http 메 시 지 를 어떻게 해석 합 니까?

6429 단어 http해석 하 다.
다음은 문자 설명 을 통 해 코드 분석 이 있 고 전시 도 를 첨부 하여 여러분 이 공부 할 수 있 도록 하 겠 습 니 다.
HTTP 메 시 지 를 분석 하려 면 다음 작업 이 필요 합 니 다.
HTTP 헤더 에서 제공 하 는 다양한 속성 읽 기
속성 값 을 분석 하여 내용 인 코딩 과 문자 집합 인 코딩 을 가 져 옵 니 다.
헤더 데이터 와 내용 을 분리 하 다.
내용 이 텍스트 인지 바 이 너 리 인지 판단 하고 바 이 너 리 라면 처리 하지 않 습 니 다.
내용 이 텍스트 라면 헤더 에 제 공 된 내용 인 코딩 과 문자 집합 인 코딩 에 따라 압축 을 풀 고 디 코딩 합 니 다.
현재.Net 프레임 워 크 에 내 장 된 해석 방법 을 찾 지 못 했 습 니 다.이론 적 으로 HttpClient 등 은 내부 에서 해석 이 이 루어 졌 을 텐 데 왜 이런 처리 방법 을 공개 하지 않 았 는 지 모 르 겠 습 니 다.(혹은 내 가 찾 지 못 했 거나)
그럼 이 데 이 터 를 스스로 분석 할 수 밖 에 없습니다.
gzip 을 통 해 압축 된 텍스트 내용 의 HTTP 메 시 지 를 살 펴 보 겠 습 니 다.

외국인 이 쓴 허름 한 해석 류 를 제공 합 니 다.

public enum HTTPHeaderField
{
 Accept = 0,
 Accept_Charset = 1,
 Accept_Encoding = 2,
 Accept_Language = 3,
 Accept_Ranges = 4,
 Authorization = 5,
 Cache_Control = 6,
 Connection = 7,
 Cookie = 8,
 Content_Length = 9,
 Content_Type = 10,
 Date = 11,
 Expect = 12,
 From = 13,
 Host = 14,
 If_Match = 15,
 If_Modified_Since = 16,
 If_None_Match = 17,
 If_Range = 18,
 If_Unmodified_Since = 19,
 Max_Forwards = 20,
 Pragma = 21,
 Proxy_Authorization = 22,
 Range = 23,
 Referer = 24,
 TE = 25,
 Upgrade = 26,
 User_Agent = 27,
 Via = 28,
 Warn = 29,
 Age = 30,
 Allow = 31,
 Content_Encoding = 32,
 Content_Language = 33,
 Content_Location = 34,
 Content_Disposition = 35,
 Content_MD5 = 36,
 Content_Range = 37,
 ETag = 38,
 Expires = 39,
 Last_Modified = 40,
 Location = 41,
 Proxy_Authenticate = 42,
 Refresh = 43,
 Retry_After = 44,
 Server = 45,
 Set_Cookie = 46,
 Trailer = 47,
 Transfer_Encoding = 48,
 Vary = 49,
 Warning = 50,
 WWW_Authenticate = 51
};
class HTTPHeader
{
 #region PROPERTIES
 private string[] m_StrHTTPField = new string[52];
 private byte[] m_byteData = new byte[4096];
 public string[] HTTPField
 {
  get { return m_StrHTTPField; }
  set { m_StrHTTPField = value; }
 }
 public byte[] Data
 {
  get { return m_byteData; }
  set { m_byteData = value; }
 }
 #endregion
 // convertion
 System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
 #region CONSTRUCTEUR
 /// <summary>
 /// Constructeur par défaut - non utilisé
 /// </summary>
 private HTTPHeader()
 { }
 public HTTPHeader(byte[] ByteHTTPRequest)
 {
  string HTTPRequest = encoding.GetString(ByteHTTPRequest);
  try
  {
   int IndexHeaderEnd;
   string Header;
   // Si la taille de requête est supérieur ou égale à 1460, alors toutes la chaine est l'entête http
   if (HTTPRequest.Length <= 1460)
    Header = HTTPRequest;
   else
   {
    IndexHeaderEnd = HTTPRequest.IndexOf("\r
\r
"); Header = HTTPRequest.Substring(0, IndexHeaderEnd); Data = ByteHTTPRequest.Skip(IndexHeaderEnd + 4).ToArray(); } HTTPHeaderParse(Header); } catch (Exception) { } } #endregion #region METHODES private void HTTPHeaderParse(string Header) { #region HTTP HEADER REQUEST & RESPONSE HTTPHeaderField HHField; string HTTPfield, buffer; int Index; foreach (int IndexHTTPfield in Enum.GetValues(typeof(HTTPHeaderField))) { HHField = (HTTPHeaderField)IndexHTTPfield; HTTPfield = "
" + HHField.ToString().Replace('_', '-') + ": "; //Ajout de
devant pour éviter les doublons entre cookie et set_cookie // Si le champ n'est pas présent dans la requête, on passe au champ suivant Index = Header.IndexOf(HTTPfield); if (Index == -1) continue; buffer = Header.Substring(Index + HTTPfield.Length); Index = buffer.IndexOf("\r
"); if (Index == -1) m_StrHTTPField[IndexHTTPfield] = buffer.Trim(); else m_StrHTTPField[IndexHTTPfield] = buffer.Substring(0, Index).Trim(); //Console.WriteLine("Index = " + IndexHTTPfield + " | champ = " + HTTPfield.Substring(1) + " " + m_StrHTTPField[IndexHTTPfield]); } // Affichage de tout les champs /*for (int j = 0; j < m_StrHTTPField.Length; j++) { HHField = (HTTPHeaderField)j; Console.WriteLine("m_StrHTTPField[" + j + "]; " + HHField + " = " + m_StrHTTPField[j]); } */ #endregion } #endregion }
다음 코드 를 작성 하여 파일 을 분석 합 니 다:

class Program
{
 static void Main(string[] args)
 {
  SRART: Console.WriteLine("      HTTP          :");
  var filename = Console.ReadLine();
  try
  {
   FileStream fs = new FileStream(filename, FileMode.Open);
   BinaryReader br = new BinaryReader(fs);
   var data = br.ReadBytes((int)fs.Length);
   var header = new HTTPHeader(data);
   var x = 0;
   foreach (var f in header.HTTPField)
   {
    if (!String.IsNullOrEmpty(f))
    {
     Console.WriteLine($"[{x:00}] - {(HTTPHeaderField) x} : {f}");
    }
    x++;
   }
   Console.WriteLine($"     {fs.Length}  ,      {header.Data.Length}  ");
   Console.WriteLine(Encoding.UTF8.GetString(header.Data));
   Console.WriteLine();
   br.Close();
   fs.Close();  
  }
  catch (Exception e)
  {
   Console.WriteLine(e);
  }
  goto SRART;
 }
}
gzip 압축 해제 와 문자 디 코딩 이 구현 되 지 않 았 습 니 다.UTF 8 디 코딩 으로 직접 출력 되 었 습 니 다.(필요 할 때 쓰 세 요.다 육체노동 이에 요~)
효과 도 표시:


아래 그림 은 gzip 압축 을 거치 지 않 은 데이터 입 니 다.
이상 은 C\#http 메시지 의 모든 내용 을 어떻게 해석 하 는 지 입 니 다.어떤 협객 이 좋 은 방법 이 있 습 니까?귀중 한 의견 을 제시 하 는 것 을 환영 합 니 다.여러분 이 상기 내용 을 좋아 하 는 것 을 좋아 합 니 다.

좋은 웹페이지 즐겨찾기