From 1dc54e8ad0d5845aa1c163ce1d762f6cdb1a0e53 Mon Sep 17 00:00:00 2001 From: Roman Kozlovskyi Date: Wed, 18 Feb 2015 18:22:15 +0200 Subject: [PATCH 1/5] Fixed decoding header --- rfc6266.py | 8 ++++---- setup.py | 2 +- test_rfc6266.py | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/rfc6266.py b/rfc6266.py index 31992ae..4df97b8 100644 --- a/rfc6266.py +++ b/rfc6266.py @@ -183,11 +183,11 @@ def parse_headers(content_disposition, location=None, relaxed=False): return ContentDisposition(location=location) # Both alternatives seem valid. - if False: + #if False: # Require content_disposition to be ascii bytes (0-127), # or characters in the ascii range - content_disposition = ensure_charset(content_disposition, 'ascii') - else: + #content_disposition = ensure_charset(content_disposition, 'ascii') + #else: # We allow non-ascii here (it will only be parsed inside of # qdtext, and rejected by the grammar if it appears in # other places), although parsing it can be ambiguous. @@ -195,7 +195,7 @@ def parse_headers(content_disposition, location=None, relaxed=False): # won't get dismissed because of an unrelated ambiguity # in the filename parameter. But it does mean we occasionally # give less-than-certain values for some legacy senders. - content_disposition = ensure_charset(content_disposition, 'iso-8859-1') + #content_disposition = ensure_charset(content_disposition, 'iso-8859-1') # Check the caller already did LWS-folding (normally done # when separating header names and values; RFC 2616 section 2.2 diff --git a/setup.py b/setup.py index 619e8aa..ad34e55 100644 --- a/setup.py +++ b/setup.py @@ -8,7 +8,7 @@ url='https://github.com/g2p/rfc6266', keywords='rfc6266 Content-Disposition http attachments', name='rfc6266', - version='0.0.4', # semver + version='0.0.5', # semver license='GNU LGPL', platforms='OS-independent', py_modules=['rfc6266', 'test_rfc6266'], diff --git a/test_rfc6266.py b/test_rfc6266.py index b610499..f41cd4c 100644 --- a/test_rfc6266.py +++ b/test_rfc6266.py @@ -14,8 +14,8 @@ def test_parsing(): 'attachment; filename=simple').filename_unsafe == 'simple' # test ISO-8859-1 - fname = parse_headers(u'attachment; filename="oyé"').filename_unsafe - assert fname == u'oyé', repr(fname) + fname = parse_headers('attachment; filename="oyé"').filename_unsafe + assert fname == 'oyé', repr(fname) cd = parse_headers( 'attachment; filename="EURO rates";' From 53efb0069143592cd4c0abca4bd14b5121138d0f Mon Sep 17 00:00:00 2001 From: Roman Kozlovskyi Date: Fri, 20 Feb 2015 17:28:19 +0200 Subject: [PATCH 2/5] Fixed build_header --- rfc6266.py | 4 ++-- setup.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/rfc6266.py b/rfc6266.py index 4df97b8..57e9489 100644 --- a/rfc6266.py +++ b/rfc6266.py @@ -429,14 +429,14 @@ def build_header( if is_token(filename): rv += '; filename=%s' % (filename, ) - return rv + return rv.encode('iso-8859-1') elif is_ascii(filename) and is_lws_safe(filename): qd_filename = qd_quote(filename) rv += '; filename="%s"' % (qd_filename, ) if qd_filename == filename: # RFC 6266 claims some implementations are iffy on qdtext's # backslash-escaping, we'll include filename* in that case. - return rv + return rv.encode('iso-8859-1') elif filename_compat: if is_token(filename_compat): rv += '; filename=%s' % (filename_compat, ) diff --git a/setup.py b/setup.py index ad34e55..43cc638 100644 --- a/setup.py +++ b/setup.py @@ -8,7 +8,7 @@ url='https://github.com/g2p/rfc6266', keywords='rfc6266 Content-Disposition http attachments', name='rfc6266', - version='0.0.5', # semver + version='0.0.6', # semver license='GNU LGPL', platforms='OS-independent', py_modules=['rfc6266', 'test_rfc6266'], From 1a9dde8a946cfbb2d9b6641cabda7bd5e31d8a63 Mon Sep 17 00:00:00 2001 From: Taras Kozlovskyi Date: Wed, 25 Feb 2015 15:36:19 +0200 Subject: [PATCH 3/5] Added tests on content-disposition for multipart/form-data --- test_rfc6266.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/test_rfc6266.py b/test_rfc6266.py index b610499..fa07730 100644 --- a/test_rfc6266.py +++ b/test_rfc6266.py @@ -80,7 +80,6 @@ def test_relaxed(): assert cd.filename_unsafe == u'spa ced' - def test_roundtrip(): def roundtrip(filename): return parse_headers(build_header(filename)).filename_unsafe @@ -95,3 +94,10 @@ def assert_roundtrip(filename): assert_roundtrip('a\"b') assert_roundtrip(u'aéio o♥u"qfsdf!') + +def test_test_roundtrip(): + assert (build_header("test.txt", disposition='form-data', name="test1") + == 'form-data; name=test1; filename=test.txt') + + assert (build_header(u"тест.txt", disposition='form-data', name="test2") + == "form-data; name=test2; filename*=utf-8''%D1%82%D0%B5%D1%81%D1%82.txt") From a0864401a8b8db556791d69eba4e2a9621dca098 Mon Sep 17 00:00:00 2001 From: Taras Kozlovskyi Date: Wed, 25 Feb 2015 15:37:34 +0200 Subject: [PATCH 4/5] Added setup additional fields --- rfc6266.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/rfc6266.py b/rfc6266.py index 31992ae..2439ec4 100644 --- a/rfc6266.py +++ b/rfc6266.py @@ -396,7 +396,8 @@ def qd_quote(text): def build_header( - filename, disposition='attachment', filename_compat=None + filename, disposition='attachment', filename_compat=None, + **keys ): """Generate a Content-Disposition header for a given filename. @@ -427,6 +428,9 @@ def build_header( rv = disposition + for key in keys: + rv += '; {}={}'.format(key, keys[key]) + if is_token(filename): rv += '; filename=%s' % (filename, ) return rv @@ -451,4 +455,3 @@ def build_header( # This will only encode filename_compat, if it used non-ascii iso-8859-1. return rv.encode('iso-8859-1') - From 69e51c26129c3e056d55ce9ac5657d4dfc502abf Mon Sep 17 00:00:00 2001 From: Taras Kozlovskyi Date: Wed, 4 Nov 2015 13:38:43 +0200 Subject: [PATCH 5/5] Prepare rfc6266 0.0.6.op1. --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 43cc638..36eb4d8 100644 --- a/setup.py +++ b/setup.py @@ -8,7 +8,7 @@ url='https://github.com/g2p/rfc6266', keywords='rfc6266 Content-Disposition http attachments', name='rfc6266', - version='0.0.6', # semver + version='0.0.6.op1', # semver license='GNU LGPL', platforms='OS-independent', py_modules=['rfc6266', 'test_rfc6266'],