Apakah kode penguraian header HTTP Python3 saya OK?

Saya telah menulis fungsi singkat di Python3 untuk mengurai header HTTP. Saya bertanya-tanya apakah ada orang yang bisa melihatnya dan memberi tahu saya apakah ada sesuatu yang bisa saya lakukan secara berbeda untuk membuat kodenya lebih baik. Apa yang saya miliki saat ini menghasilkan hasil yang diperlukan tetapi saya tidak yakin apakah akan ada situasi di mana kode ini tidak memberikan hasil yang diinginkan.

Inilah yang saya punya:

def _parse_headers(self, headers):
  lines = headers.split("\r\n")
  info = lines[0].split(" ")

  method = None
  path = None
  protocol = None
  headers = {}

  if len(info) > 0:
    method = info[0]
  if len(info) > 1:
    path = info[1]
  if len(info) > 2:
    protocol = info[2]

  for line in lines[1:]:
    if line:
      parts = line.split(":")
      key = None
      value = None
      if len(parts) > 0:
        key = parts[0]
      if len(parts) > 1:
        value = parts[1]
      if not key is None and not value is None:
        headers[key.strip().upper()] = value.strip()

  return {
    "method": method,
    "path": path,
    "protocol": protocol,
    "headers": headers
  }

person TechnoCF    schedule 11.09.2014    source sumber
comment
Jawaban ini memberikan cara yang bagus untuk menguraikan header menggunakan metode dari perpustakaan standar. Gunakan itu alih-alih menggulirkan kode Anda sendiri.   -  person    schedule 11.09.2014
comment
Saya dapat melihat beberapa masalah di sini. Ini tidak menangani dengan benar header yang mencakup beberapa baris, dan tidak menangani dengan benar header yang nilainya berisi karakter :. Ada juga masalah dalam mengenali hanya \r\n jeda baris, meskipun \n jeda baris tidak sepenuhnya sesuai, Anda harus menerima atau menolaknya secara eksplisit.   -  person Dietrich Epp    schedule 11.09.2014
comment
Saya setuju dengan poster lain yang merekomendasikan penggunaan perpustakaan parsing yang ada. Namun jika Anda ingin membuat sendiri, Anda dapat menghilangkan konstruksi rangkap tiga if tersebut dengan peretasan ini: method, path, protocol = (info + 3*[None])[:3]. Tapi ini adalah sebuah peretasan. :)   -  person PM 2Ring    schedule 12.09.2014


Jawaban (1)


Seperti yang dicatat oleh André dalam komentarnya, penguraian HTTP tidak bisa dianggap enteng, kecuali sebagai latihan. Dalam program nyata, Anda biasanya harus tetap berpegang pada implementasi yang sudah ada dan matang jika memungkinkan.

Perhatikan bahwa di luar struktur pesan secara keseluruhan, setiap header memiliki struktur internal tersendiri, dan Anda sering kali perlu menguraikannya juga; Werkzeug dapat bantuan di sana.

Masalah spesifik yang jelas pada kode Anda adalah:

  • diberi header Host: www.example.com:80, ia akan mengembalikan www.example.com sebagai nilainya;
  • jika diberikan beberapa header dengan nama yang sama, itu hanya akan mengembalikan nilai yang terakhir.
person Vasiliy Faronov    schedule 11.09.2014
comment
Saya telah memperbaiki poin pertama, tetapi untuk poin kedua, bagaimana cara mengatasinya? - person TechnoCF; 11.09.2014
comment
@TechnoCF Gunakan struktur data yang mirip dengan yang digunakan untuk header email, karena itulah asal format pesan ini. Lihat standar http.server. - person Vasiliy Faronov; 12.09.2014