โค้ดแยกวิเคราะห์ส่วนหัว Python3 HTTP ของฉันตกลงหรือไม่

ฉันได้เขียนฟังก์ชันสั้น ๆ ใน Python3 เพื่อแยกวิเคราะห์ส่วนหัว HTTP ฉันสงสัยว่าจะมีใครสามารถดูมันได้หรือไม่ และบอกฉันว่ามีอะไรที่ฉันสามารถทำได้แตกต่างออกไปเพื่อทำให้โค้ดดีขึ้นหรือไม่ สิ่งที่ฉันสร้างผลลัพธ์ที่ต้องการในปัจจุบัน แต่ฉันไม่แน่ใจว่าจะมีสถานการณ์ใดที่โค้ดนี้จะไม่ให้ผลลัพธ์ที่ต้องการหรือไม่

นี่คือสิ่งที่ฉันมี:

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 แหล่งที่มา
comment
คำตอบนี้ให้วิธีที่ดีในการแยกวิเคราะห์ส่วนหัวโดยใช้วิธีการจากไลบรารีมาตรฐาน ใช้มันแทนการกลิ้งรหัสของคุณเอง   -  person    schedule 11.09.2014
comment
ฉันเห็นปัญหาบางอย่างที่นี่ สิ่งนี้ไม่สามารถจัดการส่วนหัวที่ขยายหลายบรรทัดได้อย่างถูกต้อง และไม่สามารถจัดการส่วนหัวที่มีค่ามีอักขระ : ได้อย่างถูกต้อง นอกจากนี้ยังมีปัญหาการรับรู้เฉพาะตัวแบ่งบรรทัด \r\n แม้ว่าตัวแบ่งบรรทัด \n จะไม่สอดคล้องกันอย่างเคร่งครัด แต่คุณควรยอมรับหรือปฏิเสธอย่างชัดเจน   -  person Dietrich Epp    schedule 11.09.2014
comment
ฉันเห็นด้วยกับผู้โพสต์คนอื่นๆ ที่แนะนำให้ใช้ไลบรารีการแยกวิเคราะห์ที่มีอยู่ แต่ถ้าคุณต้องการม้วนของคุณเอง คุณสามารถกำจัดโครงสร้าง if สามอันนั้นด้วยแฮ็กนี้: method, path, protocol = (info + 3*[None])[:3] แต่ เป็น การแฮ็ก :)   -  person PM 2Ring    schedule 12.09.2014


คำตอบ (1)


ตามที่ระบุไว้โดยAndréในความคิดเห็น การแยกวิเคราะห์ HTTP นั้นไม่ควรมองข้าม เว้นแต่จะเป็นแบบฝึกหัด ในโปรแกรมจริง โดยทั่วไปคุณควรยึดติดกับการใช้งานที่มีอยู่และมีความสมบูรณ์หากเป็นไปได้

โปรดทราบว่านอกเหนือจากโครงสร้างข้อความโดยรวมแล้ว ทุกส่วนหัวยังมีโครงสร้างภายในที่แปลกประหลาดเป็นของตัวเอง และคุณมักจะต้องแยกวิเคราะห์ด้วยเช่นกัน Werkzeug สามารถ ช่วยที่นั่น

ปัญหาเฉพาะที่ชัดเจนกับโค้ดของคุณคือ:

  • เมื่อกำหนดส่วนหัว Host: www.example.com:80 ก็จะส่งคืน www.example.com เป็นค่าของมัน
  • เมื่อมีหลายส่วนหัวที่มีชื่อเดียวกัน ระบบจะส่งกลับค่าของส่วนหัวสุดท้ายเท่านั้น
person Vasiliy Faronov    schedule 11.09.2014
comment
ฉันได้แก้ไขหัวข้อย่อยแรกแล้ว แต่สำหรับหัวข้อที่สองฉันจะจัดการอย่างไร - person TechnoCF; 11.09.2014
comment
@TechnoCF ใช้โครงสร้างข้อมูลที่คล้ายกับ โครงสร้างสำหรับส่วนหัวของอีเมล เนื่องจากเป็นที่มาของรูปแบบข้อความนี้ ดูมาตรฐาน http.server - person Vasiliy Faronov; 12.09.2014