apache / apache/libcloud

Tilde ('~') character is incorrectly URL-encoded with Python 2

未关闭
#1,452 6 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看
api: http layer potential 2.8.x candidate python 2.x and 3.x compatibility stale
主要语言
Python
星标
2.1k
派生
931
平均合并
1 天 2 小时
30 天内合并 PR
4

描述

I'm referring to the older, unresolved issue here (it seems I cannot create a new issue nor comment on the older one over at issues.apache.org though I have a long-time user there...):

https://issues.apache.org/jira/browse/LIBCLOUD-979

I can confirm that the reported issue happens also for Amazon S3, not only for CEPH as originally reported. And the problem is indeed that libcloud URL-encodes the tilde '~' sign to '%7E', which it shouldn't according to RFC 3986.

The problem seems specific to Python 2 because in Python 3 urllib.quote() has been already updated to not URL-encode the tilde '~' sign anymore:

https://bugs.python.org/issue16285

Because of this, I think the correct fix (other than the patch proposed in LIBCLOUD-979) would be adding the tilde '~' character to the safe characters in the urlquote() utility function in utils/py3.py to ensure consistent behavior between Python 2 and Python 3.

```diff
--- libcloud/utils/py3.py 2020-04-30 12:58:55.804591828 +0000
+++ libcloud_fixed/utils/py3.py 2020-04-30 12:59:25.975368813 +0000
@@ -211,7 +211,7 @@

tostring = ET.tostring

- def urlquote(s, safe='/'):
+ def urlquote(s, safe='/~'):
if isinstance(s, _real_unicode):
# Pretend to be py3 by encoding the URI automatically.
s = s.encode('utf8')
```

贡献指南

打开贡献指南

调研方向

从 utils/py3.py 中的 urlquote() 工具开始,将其在 Python 2 中的行为与 Python 3 和 RFC 3986 进行比较。当波浪号字符在两个 Python 版本中都始终保持未编码状态(包括 issue 中描述的 Amazon S3 情况)时,工作就完成了。

由索引模型根据 Issue 内容生成。

评估

技术栈
python
领域
backend
Issue 类型
缺陷
难度
2/5
预计耗时
1-3 小时
活跃度
停滞
描述清晰度
描述清楚
新手友好度
45/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。