我正在使用超级框架来生成HTTP / 2通信。在生成请求和响应时,我目前正在使用hyper.HTTP20Connection.request和h2.H2Connection.send_headers分别发送HTTP / 2请求和响应。
我需要能够发送具有重复字段的HTTP / 2请求和响应。例如,这里是一个YAML指定的请求,其中包含两个x-test-duplicate
字段:
headers:
fields:
- [ :method, GET, equal ]
- [ :scheme, https, equal ]
- [ :authority, example.data.com, equal ]
- [ :path, '/a/path?q=3', equal ]
- [ Accept, '*/*' ]
- [ Accept-Language, en-us ]
- [ Accept-Encoding, gzip ]
- [ x-test-duplicate, first ]
- [ x-test-duplicate, second ]
- [ Content-Length, "0" ]
请注意,根据HTTP / 2规范,这是明确允许的。参见示例RFC 7541第2.3.2节:
动态表可以包含重复的条目(即,具有相同名称和相同值的条目)。因此,解码器不得将重复的条目视为错误。
问题是,尽管h2.H2Connection.send_headers正确处理了可包含重复字段(例如(("name1", "value1"), ("name2", "value2"), ("name1", "another_value"))
)的元组的迭代,但是hyper.HTTP20Connection.request需要一个字典,该字典当然不是为重复键设计的。该文档是不清楚其类型要求headers
,但在为源代码HTTP20Connection:请求,线261,items()
被称为的其关闭。如果我通过一个可迭代的元组,则得到AttributeError: 'tuple' object has no attribute 'items'
。请注意,这是多么令人难过:超级框架迫使用户传递不允许重复的字典,然后立即通过将该字典转换为可迭代的元组items()
,后者将允许重复的字段。如果像h2的界面一样,只花了一个可迭代的元组作为开始,我就不会遇到这个问题。
我在超级github项目中提交了有关此限制的问题437。同时,我希望我可以解决此问题。我有一个可重复的元组,表示具有重复字段的HTTP / 2标头。我能否以某种方式将其包装在对象中,以便当HTTP20Connection:request的第261行对其调用items()
时,它仅返回元组的可迭代对象?
Python通常EmailMessage
为此使用一个实例(docs)。
类似
EmailMessage
字典的接口由标头名称索引,标头名称必须是ASCII值。字典的值是带有一些额外方法的字符串。标头以保留大小写的形式存储和返回,但是字段名称不区分大小写。与真正的字典不同,这些键有一个顺序,并且可以有重复的键。提供了其他方法来处理具有重复键的标头。
在基本用法中,您将使用设置项目,然后使用EmailMessage.add_header
进行检索EmailMessage.items
。您可以将有效负载留空。
>>> headers = EmailMessage()
>>> headers.add_header("x-test-duplicate", "first")
>>> headers.add_header("x-test-duplicate", "second")
>>> headers.items()
[('x-test-duplicate', 'first'), ('x-test-duplicate', 'second')]
这urllib
本身就是经过战斗测试的,它对HTTPResponse标头使用相同的类。
滚动自己的multidict或使用简单的对列表的好处是,您将获得标头的正确行为(RFC 5322和RFC 6532样式字段名称和值),例如,不区分大小写:
>>> headers.add_header("aBc", "val1")
>>> headers.add_header("AbC", "val2")
>>> headers.get_all("ABC")
['val1', 'val2']
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句