Skip to content

Commit fdb5d22

Browse files
committedJul 24, 2011
Fix param* decoding
1 parent 38fae02 commit fdb5d22

File tree

2 files changed

+24
-11
lines changed

2 files changed

+24
-11
lines changed
 

‎lib/response_analyse.py

+2-5
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ def _parse_params(self, name, instr):
280280
self.setMessage(name, rs.PARAM_STAR_QUOTED, param=k)
281281
v = self.unquoteString(v)
282282
try:
283-
enc, lang, esc_v = param_dict["filename*"].split("'", 3)
283+
enc, lang, esc_v = v.split("'", 3)
284284
except ValueError:
285285
self.setMessage(name, rs.PARAM_STAR_ERROR, param=k)
286286
continue
@@ -293,8 +293,7 @@ def _parse_params(self, name, instr):
293293
enc=enc
294294
)
295295
# TODO: catch unquoting errors, range of chars, charset
296-
decoded_v = urllib.unquote(esc_v)
297-
param_dict[k.lower()] = decoded_v
296+
param_dict[k.lower()] = urllib.unquote(esc_v).decode('utf-8')
298297
else:
299298
param_dict[k.lower()] = self._unquoteString(v)
300299
return param_dict
@@ -708,8 +707,6 @@ def status205(self): # Reset Content
708707
def status206(self): # Partial Content
709708
if not "range" in nbhttp.header_dict(self.red.req_hdrs).keys():
710709
self.setMessage('', rs.PARTIAL_NOT_REQUESTED)
711-
if not self.red.parsed_hdrs.has_key('content-range'):
712-
print self.red.parsed_hdrs.keys()
713710
self.setMessage('header-location', rs.PARTIAL_WITHOUT_RANGE)
714711
def status207(self): # Multi-Status
715712
pass

‎test/test_response_analyse.py

+22-6
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
#!/usr/bin/env python
2+
# coding=UTF-8
3+
24

35
import sys
46
import unittest
@@ -29,35 +31,49 @@ def parseHeader(self, name, values):
2931
return getattr(self.parser, name_token)(name, values)
3032

3133
def test_content_disposition(self):
34+
i = 0
3235
for (hdrs, expected_val, expected_msgs) in [
33-
# quoted-string
36+
# 0: quoted-string
3437
(['attachment; filename="foo.txt"'],
3538
('attachment', {'filename': 'foo.txt'}),
3639
[]
3740
),
38-
# token
41+
# 1: token
3942
(['attachment; filename=foo.txt'],
4043
('attachment', {'filename': 'foo.txt'}),
4144
[]
4245
),
43-
# inline
46+
# 2: inline
4447
(['inline; filename=foo.txt'],
4548
('inline', {'filename': 'foo.txt'}),
4649
[]
4750
),
48-
# token
51+
# 3: token
4952
(['attachment; filename=foo.txt, inline; filename=bar.txt'],
5053
('inline', {'filename': 'bar.txt'}),
5154
[rs.SINGLE_HEADER_REPEAT]
5255
),
56+
# 4: filename*
57+
(["attachment; filename=foo.txt; filename*=UTF-8''a%cc%88.txt"],
58+
('attachment', {
59+
'filename': 'foo.txt',
60+
'filename*': u'a\u0308.txt'
61+
}),
62+
[]
63+
),
5364
]:
65+
self.red.__init__()
5466
val = self.parseHeader('Content-Disposition', hdrs)
55-
self.assertEqual(expected_val, val)
67+
self.assertEqual(expected_val, val,
68+
"[%s] %s != %s" % (i, str(expected_val), str(val)))
5669
diff = set(
5770
[n.__name__ for n in expected_msgs]).symmetric_difference(
5871
set(self.red.msg_classes)
5972
)
60-
self.assertEqual(len(diff), 0, diff)
73+
self.assertEqual(len(diff), 0,
74+
"[%s] Mismatched messages: %s" % (i, diff)
75+
)
76+
i += 1
6177

6278

6379
if __name__ == "__main__":

0 commit comments

Comments
 (0)
Please sign in to comment.