parse data from recieved header
(self)
| 258 | return None #:All is fine |
| 259 | |
| 260 | def parseHeader(self): |
| 261 | """parse data from recieved header""" |
| 262 | for orgline in self.header.splitlines(): |
| 263 | line = orgline.strip().lower() |
| 264 | if line.startswith("accept-ranges") and "bytes" in line: |
| 265 | self.p.chunkSupport = True |
| 266 | |
| 267 | elif line.startswith("content-disposition"): |
| 268 | try: |
| 269 | orgline.encode('iso-8859-1') |
| 270 | except UnicodeDecodeError: |
| 271 | self.log.debug("Content-Disposition: | error: header contains nonstandard characters") |
| 272 | else: |
| 273 | disposition_value = orgline.split(":", 1)[1].strip() |
| 274 | disposition_type, disposition_params = parse_header(disposition_value) |
| 275 | |
| 276 | fname = None |
| 277 | if 'filename*' in disposition_params: |
| 278 | fname = disposition_params['filename*'] |
| 279 | m = re.search(r'=\?([^?]+)\?([QB])\?([^?]*)\?=', fname, re.I) #: rfc2047 |
| 280 | if m is not None: |
| 281 | fname, enc = decode_header(fname)[0] |
| 282 | try: |
| 283 | fname = fname.decode(enc) |
| 284 | except LookupError: |
| 285 | self.log.warning("Content-Disposition: | error: No decoder found for %s" % enc) |
| 286 | fname = None |
| 287 | except UnicodeEncodeError: |
| 288 | self.log.warning("Content-Disposition: | error: Error when decoding string from %s." % enc) |
| 289 | fname = None |
| 290 | |
| 291 | else: |
| 292 | m = re.search(r'(.+?)\'(.*)\'(.+)', fname) |
| 293 | if m is not None: |
| 294 | enc, lang, data = m.groups() |
| 295 | try: |
| 296 | fname = urllib.unquote(data).decode(enc) |
| 297 | except LookupError: |
| 298 | self.log.warning("Content-Disposition: | error: No decoder found for %s" % enc) |
| 299 | fname = None |
| 300 | except UnicodeEncodeError: |
| 301 | self.log.warning("Content-Disposition: | error: Error when decoding string from %s." % enc) |
| 302 | fname = None |
| 303 | |
| 304 | else: |
| 305 | fname = None |
| 306 | |
| 307 | if fname is None: |
| 308 | if 'filename' in disposition_params: |
| 309 | fname = disposition_params['filename'] |
| 310 | m = re.search(r'=\?([^?]+)\?([QB])\?([^?]*)\?=', fname, re.I) #: rfc2047 |
| 311 | if m is not None: |
| 312 | fname, enc = decode_header(m.group(0))[0] |
| 313 | try: |
| 314 | fname = fname.decode(enc) |
| 315 | except LookupError: |
| 316 | self.log.warning("Content-Disposition: | error: No decoder found for %s" % enc) |
| 317 | continue |
no test coverage detected