When prefix or subdir is unicode, it fails.
reproduce:
# before test, enable staticweb middleware
$ swift post test -r '.r:*'
$ swift post test -m 'web-listings: true'
$ mkdir ☃
$ mkdir ☃/☃
$ touch ☃/☃/file
$ swift upload test ☃
$ curl -v 'http://127.0.0.1/v1/AUTH_test/test/☃/'
$ curl -v 'http://127.0.0.1/v1/AUTH_test/test/☃/☃/'
# test subdir
root@saio:~# curl -v 'http://127.0.0.1/v1/AUTH_test/test/☃/'
* About to connect() to 127.0.0.1 port 80 (#0)
* Trying 127.0.0.1... connected
* Connected to 127.0.0.1 (127.0.0.1) port 80 (#0)
> GET /v1/AUTH_test/test/☃/ HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15
> Host: 127.0.0.1
> Accept: */*
>
< HTTP/1.1 500 Internal Error
< Content-Length: 17
< Content-Type: text/plain
< X-Trans-Id: txcba5fc6184d84c48ba04efc2cabe1c4c
< Date: Thu, 21 Mar 2013 01:49:16 GMT
<
* Connection #0 to host 127.0.0.1 left intact
* Closing connection #0
An error occurred
Mar 21 10:49:16 saio catch_errors Error: 'ascii' codec can't decode byte 0xe2 in position 157: ordinal not in range(128): Traceback (most recent call last): File "/usr/lib/python2.6/dist-packages/swift-1.7.6-py2.6.egg/swift/common/middleware/catch_errors.py", line 36, in handle_request resp = self._app_call(env) File "/usr/lib/python2.6/dist-packages/swift-1.7.6-py2.6.egg/swift/common/wsgi.py", line 270, in _app_call resp = self.app(env, self._start_response) File "/usr/lib/python2.6/dist-packages/swift-1.7.6-py2.6.egg/swift/common/middleware/healthcheck.py", line 57, in __call__ return self.app(env, start_response) File "/usr/lib/python2.6/dist-packages/swift-1.7.6-py2.6.egg/swift/common/middleware/memcache.py", line 65, in __call__ return self.app(env, start_response) File "/usr/local/lib/python2.6/dist-packages/swauth-1.0.7.dev-py2.6.egg/swauth/middleware.py", line 229, in __call__ return self.app(env, start_response) File "/usr/lib/python2.6/dist-packages/swift-1.7.6-py2.6.egg/swift/common/middleware/staticweb.py", line 559, in __call__ return context.handle_object(env, start_response) File "/usr/lib/python2.6/dist-packages/swift-1.7.6-py2.6.egg/swift/common/middleware/staticweb.py", line 437, in handle_object return self._listing(env, start_response, self.obj) File "/usr/lib/python2.6/dist-packages/swift-1.7.6-py2.6.egg/swift/common/middleware/staticweb.py", line 308, in _listing (quote(subdir), cgi.escape(subdir)) UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 157: ordinal not in range(128) (txn: txcba5fc6184d84c48ba04efc2cabe1c4c)
# test prefix
root@saio:~# curl -v 'http://127.0.0.1/v1/AUTH_test/test/☃/☃/'
* About to connect() to 127.0.0.1 port 80 (#0)
* Trying 127.0.0.1... connected
* Connected to 127.0.0.1 (127.0.0.1) port 80 (#0)
> GET /v1/AUTH_test/test/☃/☃/ HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15
> Host: 127.0.0.1
> Accept: */*
>
< HTTP/1.1 500 Internal Error
< Content-Length: 17
< Content-Type: text/plain
< X-Trans-Id: tx8865b8247bf24941a1bd54a44bf8afba
< Date: Thu, 21 Mar 2013 01:49:57 GMT
<
* Connection #0 to host 127.0.0.1 left intact
* Closing connection #0
An error occurred
Mar 21 10:49:57 saio catch_errors Error: 'ascii' codec can't decode byte 0xe2 in position 157: ordinal not in range(128): Traceback (most recent call last): File "/usr/lib/python2.6/dist-packages/swift-1.7.6-py2.6.egg/swift/common/middleware/catch_errors.py", line 36, in handle_request resp = self._app_call(env) File "/usr/lib/python2.6/dist-packages/swift-1.7.6-py2.6.egg/swift/common/wsgi.py", line 270, in _app_call resp = self.app(env, self._start_response) File "/usr/lib/python2.6/dist-packages/swift-1.7.6-py2.6.egg/swift/common/middleware/healthcheck.py", line 57, in __call__ return self.app(env, start_response) File "/usr/lib/python2.6/dist-packages/swift-1.7.6-py2.6.egg/swift/common/middleware/memcache.py", line 65, in __call__ return self.app(env, start_response) File "/usr/local/lib/python2.6/dist-packages/swauth-1.0.7.dev-py2.6.egg/swauth/middleware.py", line 229, in __call__ return self.app(env, start_response) File "/usr/lib/python2.6/dist-packages/swift-1.7.6-py2.6.egg/swift/common/middleware/staticweb.py", line 559, in __call__ return context.handle_object(env, start_response) File "/usr/lib/python2.6/dist-packages/swift-1.7.6-py2.6.egg/swift/common/middleware/staticweb.py", line 437, in handle_object return self._listing(env, start_response, self.obj) File "/usr/lib/python2.6/dist-packages/swift-1.7.6-py2.6.egg/swift/common/middleware/staticweb.py", line 324, in _listing replace('T', ' ')) UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 157: ordinal not in range(128) (txn: tx8865b8247bf24941a1bd54a44bf8afba)
Fix proposed to branch: master /review. openstack. org/24960
Review: https:/