Unable to upload files with non-ASCII name to swift container
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
OpenStack Dashboard (Horizon) |
Won't Fix
|
Medium
|
Unassigned |
Bug Description
If a file name is non-ASCII, it is unable to upload to the swift container.
[Wed Jun 06 13:06:09 2012] [error] DEBUG:django.
ata", "django_
ND "django_
40')
[Wed Jun 06 13:06:09 2012] [error] DEBUG:horizon.
.0.
[Wed Jun 06 13:06:09 2012] [error] DEBUG:keystonec
nt: python-
[Wed Jun 06 13:06:09 2012] [error]
[Wed Jun 06 13:06:09 2012] [error] DEBUG:keystonec
http://
/json'}
[Wed Jun 06 13:06:09 2012] [error] RESP BODY: {"tenants_links": [], "tenants": [{"enabled": true, "description": null, "name": "admin"
, "id": "3d2a25b5cf6140
c2266"}]}
[Wed Jun 06 13:06:09 2012] [error]
[Wed Jun 06 13:06:17 2012] [error] DEBUG:django.
ata", "django_
ND "django_
33')
[Wed Jun 06 13:06:17 2012] [error] DEBUG:horizon.
url "http://
[Wed Jun 06 13:06:17 2012] [error] CRITICAL:
" in dashboard.
[Wed Jun 06 13:06:17 2012] [error] Traceback (most recent call last):
[Wed Jun 06 13:06:17 2012] [error] File "/usr/local/
onse
[Wed Jun 06 13:06:17 2012] [error] response = callback(request, *callback_args, **callback_kwargs)
[Wed Jun 06 13:06:17 2012] [error] File "/opt/stack/
[Wed Jun 06 13:06:17 2012] [error] return view_func(request, *args, **kwargs)
[Wed Jun 06 13:06:17 2012] [error] File "/opt/stack/
[Wed Jun 06 13:06:17 2012] [error] return view_func(request, *args, **kwargs)
[Wed Jun 06 13:06:17 2012] [error] File "/opt/stack/
[Wed Jun 06 13:06:17 2012] [error] return view_func(request, *args, **kwargs)
[Wed Jun 06 13:06:17 2012] [error] File "/opt/stack/
[Wed Jun 06 13:06:17 2012] [error] return view_func(request, *args, **kwargs)
[Wed Jun 06 13:06:17 2012] [error] File "/usr/local/
[Wed Jun 06 13:06:17 2012] [error] return self.dispatch(
[Wed Jun 06 13:06:17 2012] [error] File "/usr/local/
[Wed Jun 06 13:06:17 2012] [error] return handler(request, *args, **kwargs)
[Wed Jun 06 13:06:17 2012] [error] File "/opt/stack/
[Wed Jun 06 13:06:17 2012] [error] return self.get(self, request, *args, **kwargs)
[Wed Jun 06 13:06:17 2012] [error] File "/opt/stack/
[Wed Jun 06 13:06:17 2012] [error] form, handled = self.maybe_handle()
[Wed Jun 06 13:06:17 2012] [error] File "/opt/stack/
e_handle
[Wed Jun 06 13:06:17 2012] [error] self.form, self.handled = form.maybe_
[Wed Jun 06 13:06:17 2012] [error] File "/opt/stack/
[Wed Jun 06 13:06:17 2012] [error] exceptions.
[Wed Jun 06 13:06:17 2012] [error] File "/opt/stack/
[Wed Jun 06 13:06:17 2012] [error] return form, form.handle(
[Wed Jun 06 13:06:17 2012] [error] File "/opt/stack/
[Wed Jun 06 13:06:17 2012] [error] exceptions.
[Wed Jun 06 13:06:17 2012] [error] File "/opt/stack/
[Wed Jun 06 13:06:17 2012] [error] obj.sync_metadata()
[Wed Jun 06 13:06:17 2012] [error] File "/usr/local/
[Wed Jun 06 13:06:17 2012] [error] return f(*args, **kwargs)
[Wed Jun 06 13:06:17 2012] [error] File "/usr/local/
[Wed Jun 06 13:06:17 2012] [error] data='')
[Wed Jun 06 13:06:17 2012] [error] File "/usr/local/
[Wed Jun 06 13:06:17 2012] [error] self.connection
[Wed Jun 06 13:06:17 2012] [error] File "/usr/lib/
[Wed Jun 06 13:06:17 2012] [error] self._send_
[Wed Jun 06 13:06:17 2012] [error] File "/usr/lib/
[Wed Jun 06 13:06:17 2012] [error] self.putheader(hdr, value)
[Wed Jun 06 13:06:17 2012] [error] File "/usr/lib/
[Wed Jun 06 13:06:17 2012] [error] hdr = '%s: %s' % (header, '\\r\\n\
[Wed Jun 06 13:06:17 2012] [error] UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
[Wed Jun 06 13:06:17 2012] [error] ERROR:django.
[Wed Jun 06 13:06:17 2012] [error] Traceback (most recent call last):
[Wed Jun 06 13:06:17 2012] [error] File "/usr/local/
[Wed Jun 06 13:06:17 2012] [error] response = callback(request, *callback_args, **callback_kwargs)
[Wed Jun 06 13:06:17 2012] [error] File "/opt/stack/
[Wed Jun 06 13:06:17 2012] [error] return view_func(request, *args, **kwargs)
[Wed Jun 06 13:06:17 2012] [error] File "/opt/stack/
[Wed Jun 06 13:06:17 2012] [error] return view_func(request, *args, **kwargs)
[Wed Jun 06 13:06:17 2012] [error] File "/opt/stack/
[Wed Jun 06 13:06:17 2012] [error] return view_func(request, *args, **kwargs)
[Wed Jun 06 13:06:17 2012] [error] File "/opt/stack/
[Wed Jun 06 13:06:17 2012] [error] return view_func(request, *args, **kwargs)
[Wed Jun 06 13:06:17 2012] [error] File "/usr/local/
[Wed Jun 06 13:06:17 2012] [error] return self.dispatch(
[Wed Jun 06 13:06:17 2012] [error] File "/usr/local/
[Wed Jun 06 13:06:17 2012] [error] return handler(request, *args, **kwargs)
[Wed Jun 06 13:06:17 2012] [error] File "/opt/stack/
[Wed Jun 06 13:06:17 2012] [error] return self.get(self, request, *args, **kwargs)
[Wed Jun 06 13:06:17 2012] [error] File "/opt/stack/
[Wed Jun 06 13:06:17 2012] [error] form, handled = self.maybe_handle()
[Wed Jun 06 13:06:17 2012] [error] File "/opt/stack/
[Wed Jun 06 13:06:17 2012] [error] self.form, self.handled = form.maybe_
[Wed Jun 06 13:06:17 2012] [error] File "/opt/stack/
[Wed Jun 06 13:06:17 2012] [error] exceptions.
[Wed Jun 06 13:06:17 2012] [error] File "/opt/stack/
[Wed Jun 06 13:06:17 2012] [error] return form, form.handle(
[Wed Jun 06 13:06:17 2012] [error] File "/opt/stack/
[Wed Jun 06 13:06:17 2012] [error] exceptions.
[Wed Jun 06 13:06:17 2012] [error] File "/opt/stack/
[Wed Jun 06 13:06:17 2012] [error] obj.sync_metadata()
[Wed Jun 06 13:06:17 2012] [error] File "/usr/local/
[Wed Jun 06 13:06:17 2012] [error] return f(*args, **kwargs)
[Wed Jun 06 13:06:17 2012] [error] File "/usr/local/
[Wed Jun 06 13:06:17 2012] [error] data='')
[Wed Jun 06 13:06:17 2012] [error] File "/usr/local/
[Wed Jun 06 13:06:17 2012] [error] self.connection
[Wed Jun 06 13:06:17 2012] [error] File "/usr/lib/
[Wed Jun 06 13:06:17 2012] [error] self._send_
[Wed Jun 06 13:06:17 2012] [error] File "/usr/lib/
[Wed Jun 06 13:06:17 2012] [error] self.putheader(hdr, value)
[Wed Jun 06 13:06:17 2012] [error] File "/usr/lib/
[Wed Jun 06 13:06:17 2012] [error] hdr = '%s: %s' % (header, '\\r\\n\
[Wed Jun 06 13:06:17 2012] [error] UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
Changed in horizon: | |
status: | New → Confirmed |
importance: | Undecided → Medium |
milestone: | none → folsom-3 |
assignee: | nobody → Nebula (nebula) |
Changed in horizon: | |
assignee: | Registry Administrators (registry) → nobody |
Actually this is not quite a Horizon bug. It could be fixed in Horizon, but I think it is better to fix the main problem, and not side effects.
The problem here is that object upload connects to Swift service, and passes original filename of the uploaded file as a HTTP header. By definition, Unicode symbols are not allowed for HTTP headers. They should be quoted in ISO-8859-1 accorging to RFC 2047 (http:// www.ietf. org/rfc/ rfc2047. txt). connection. py, row 177, right before "isinstance(hdrs, dict) and headers. update( hdrs)" it's needed a encoding to be performed to header values:
The actual place where this should be done is cloudfiles/
from urllib import urlencode, quote
.......
if hdrs:
hdrs[ key] = quote(value. encode( 'utf-8' ))
for key, value in hdrs.items():
quote() function will perform the needed quoting in ISO-8859-1, and everything works fine then.