Python中的plisttext和HTTP的Content-Type

      網友投稿 764 2025-03-31

      這段時間本人在學習Android Service相關的內容,臨時需要一個可以提供文件上傳和下載功能的服務器,于是上網查找了一個簡單服務器的python實現代碼,本著溫顧一下HTTP協議的想法,于是深入研究了一下其中的代碼,發現大家對SimpleHTTPRequestsHandler中的self.headers.plisttext.split("=")[1]語句的含義不是很理解,于是自己查閱了一下python源碼定義和相關HTTP協議文檔,理解了這段代碼的含義。

      源碼定義

      我們先來看一下關于plisttext的源碼定義。

      #https://svn.python.org/projects/python/branches/alpha100/Lib/mimetools.py class Message(rfc822.Message): def __init__(self, fp): .... self.typeheader = \ self.getheader('content-type') .... def parsetype(self): str = self.typeheader if str == None: str = 'text/plain' if ';' in str: i = string.index(str, ';') self.plisttext = str[i:] str = str[:i] else: self.plisttext = '' ....

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      從源碼中可以得出,plisttext與HTTP頭部content-type有關,這里我們就要回想一下content-type的有關定義了。

      在w3c的文檔給出了content-type的格式定義,我們可以發現,content-type對的值有可選的內容,使用;隔開,所以plisttext的值就是parameter的內容。

      Content-Type := type "/" subtype *[";" parameter] type := "application" / "audio" / "image" / "message" / "multipart" / "text" / "video" / x-token x-token := subtype := token parameter := attribute "=" value attribute := token value := token / quoted-string token := 1* tspecials := "(" / ")" / "<" / ">" / "@" ; Must be in / "," / ";" / ":" / "\" / <"> ; quoted-string, / "/" / "[" / "]" / "?" / "." ; to use within / "=" ; parameter values

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      Python中的plisttext和HTTP的Content-Type

      19

      20

      21

      22

      23

      24

      使用原理

      知道了plisttext代表的含義,我們再來看一下它在文件上傳過程中的作用吧。我們先來看一下它在處理文件上傳的post請求時的作用吧。

      boundary = self.headers.plisttext.split("=")[1] remainbytes = int(self.headers['content-length']) line = self.rfile.readline() remainbytes -= len(line) if not boundary in line: return (False,"Content NOT begin with boundary") line = self.rfile.readline() remainbytes -= len(line) filename = re.findall(r'Content-Disposition.*name="file"; filename="(.*)"',line) if not fn: return (False,"Can't find out file name")

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      我們都知道當通過html的form來進行文件提交時,瀏覽器會發送POST請求,并且content-type為multipart/form-data; boundary=----WebKitFormBoundaryqdHXHkzdBEGWWZka,所以,plisttext的值為boundary=----WebKitFormBoundaryqdHXHkzdBEGWWZka。boundary在HTTP的body中會使用到,因為post請求提交了很多類型的數據,所以必須使用boundary進行間隔,也就是所謂的Multipart Content-Type時的body格式。詳細的body的格式在w3c的文檔中有詳細的介紹。

      這里貼一張wireShark截獲的tcp包的信息,來幫助大家理解一下這段python代碼的原理。通過form提交一份文件和一個名為other的字符串。

      POST / HTTP/1.1 Host: localhost:8080 Connection: keep-alive Content-Length: 269353 Cache-Control: max-age=0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Origin: http://localhost:8080 User-Agent: Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/43.0.2357.81 Chrome/43.0.2357.81 Safari/537.36 Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryqdHXHkzdBEGWWZka Referer: http://localhost:8080/ Accept-Encoding: gzip, deflate Accept-Language: en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4 ------WebKitFormBoundaryqdHXHkzdBEGWWZka Content-Disposition: form-data; name="file"; filename="AndroidStudy.png" Content-Type: image/png ..... //圖片內容 ------WebKitFormBoundaryqdHXHkzdBEGWWZka Content-Disposition: form-data; name="other" ddd ------WebKitFormBoundaryqdHXHkzdBEGWWZka--

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      HTTP Python

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:WPS表格怎么自動求和(wps表格怎么自動求和一豎排)
      下一篇:excel怎樣用函數統計區間數字
      相關文章
      亚洲精品国产专区91在线| 中文字幕不卡亚洲 | 亚洲午夜精品一区二区麻豆| 亚洲av永久无码精品秋霞电影影院 | 亚洲日韩国产二区无码| 亚洲精品第一国产综合野| 4444亚洲国产成人精品| 亚洲欧洲免费视频| 亚洲国产精品久久久久久| 亚洲va在线va天堂va不卡下载| 亚洲AV电影院在线观看| 麻豆亚洲av熟女国产一区二| 亚洲精品亚洲人成在线观看麻豆| 久久精品九九亚洲精品| 亚洲毛片基地日韩毛片基地| 亚洲成a人片7777| xxx毛茸茸的亚洲| 亚洲日韩精品无码专区| 亚洲国产精品无码久久| 亚洲精华国产精华精华液好用| 国产精品亚洲专区无码牛牛| 亚洲AV性色在线观看| 亚洲国产精品13p| 国产av无码专区亚洲av果冻传媒 | 亚洲国产成人99精品激情在线| 色噜噜亚洲男人的天堂| 亚洲熟伦熟女专区hd高清| 最新亚洲卡一卡二卡三新区| 亚洲av成本人无码网站| 2048亚洲精品国产| 久久精品国产亚洲沈樵| 亚洲色四在线视频观看| 亚洲国产日韩在线成人蜜芽 | 亚洲欧洲日产国码无码网站 | 亚洲AV无码精品国产成人| 亚洲Av无码乱码在线播放| 亚洲女久久久噜噜噜熟女| 午夜亚洲AV日韩AV无码大全| 亚洲国产精品yw在线观看| 亚洲日本VA午夜在线影院| 亚洲v国产v天堂a无码久久|