首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以冒号开头的HTTP/2请求和头

以冒号开头的HTTP/2请求和头
EN

Stack Overflow用户
提问于 2019-08-13 19:45:17
回答 1查看 5.2K关注 0票数 11

你好,亲爱的苏社区。

我有一个问题,折磨了我几个月,却没有解决办法。

我试图在HTTP/2端点上发出请求,该端点使用一些以冒号开头的头。示例:

代码语言:javascript
复制
:method: "POST"

我尝试过python(hyper,requests)、php(guzzle)和js(fetch)。据推测,我已经使用js实现了所需的结果,但是CORS策略返回给我一个“不透明”的结果。

任何帮助都会很棒的!

JS结果假定正确的“不透明”

代码语言:javascript
复制
fetch("https://www.example.com/users/sign_in", 
        {
          "credentials":"include",
          "headers":{
            "accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3",
            "accept-language":"en-US,en;q=0.9,el;q=0.8",
            "cache-control":"max-age=0",
            "content-type":"application/x-www-form-urlencoded",
            "accept-encoding": "gzip, deflate, br",
            "content-length": 614,
            "origin": "https://www.example.com",
            "sec-fetch-mode": "navigate",
            "sec-fetch-site": "same-origin",
            "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36",
          },
          "referrer":"https://www.example.com/users/sign_in",
          "referrerPolicy":"no-referrer-when-downgrade",
          "redirect": "follow",
          "body":"..."
          "method":"POST",
          "mode":"no-cors",
          ":authority": "www.example.com",
          ":method": "POST",
          ":path": "/users/sign_in",
          ":scheme": "https"
        })

Python结果500或404

代码语言:javascript
复制
 context = tls.init_context()
    context.check_hostname = False
    context.verify_mode = ssl.CERT_NONE
    with HTTP20Connection('www.example.com', port=443, ssl_context=context) as c:
        headers = {
            ":authority": "www.example.com",
            ":method": "GET",
            ":path": "/users/sign_in",
            ":scheme": "https",
            "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3",
            "accept-encoding": "gzip, deflate, br",
            "accept-language": "en-US,en;q=0.9,el;q=0.8",
            "sec-fetch-mode": "navigate",
            "sec-fetch-site": "none",
            "sec-fetch-user": "?1",
            "upgrade-insecure-requests": "1",
            "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36"
        }

        c.request('GET', 'www.example.com/users/sign_in', headers=headers)

PHP结果500或卷曲错误55

代码语言:javascript
复制
$jar = new CookieJar;
    $client = new Client([
        // Base URI is used with relative requests
        'cookies' => $jar,
        'version' => 2.0,
        'debug' => fopen('php://stderr', 'w'),
    ]);

    $client->request('GET', 'https://www.example.com/users/sign_in');

    $response = $client->request('POST', 'https://www.example.com/users/sign_in', [
        'headers' => [
            ":authority"=> "www.example.com",
            ":method"=> "POST",
            ":path"=> "/users/sign_in",
            ":scheme"=> "https",
            "accept"=> "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3",
            "accept-encoding"=> "gzip, deflate, br",
            "accept-language"=> "en-US,en;q=0.9,el;q=0.8",
            "cache-control"=> "max-age=0",
            "content-length"=> "616",
            "content-type"=> "application/x-www-form-urlencoded",
            "origin"=> "https://www.example.com",
            "referer"=> "https://www.example.com/users/sign_in",
            "sec-fetch-mode"=> "navigate",
            "sec-fetch-site"=> "same-origin",
            "sec-fetch-user"=> "?1",
            "upgrade-insecure-requests"=> "1",
            "user-agent"=> "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36"
        ],
        'form_params' => [ ... ],
        'version' => 2.0,
        'allow_redirects' => true
    ]);
EN

回答 1

Stack Overflow用户

发布于 2020-01-16 19:32:26

这些是适用于HTTP/2流中的请求和响应的HTTP/2伪标头。HTTP/2从每个不同的起始端到服务器创建一个单一的持久连接。该连接向端点发送多个请求和响应;这些请求和响应被解析为“帧”,并作为“流”传输。HTTP/2可以同时从多个请求流和响应流中交织帧,从而获得巨大的性能好处。http/2简介

伪标头适用于流;另一组标头应用于连接本身。为请求定义了四个伪头::方法、:path、:authority和:path。不允许其他人。这4必须包含在每个请求头块中,并且它们必须位于任何其他头之前:

“所有伪标头字段必须出现在常规头字段之前的头块中。任何包含出现在常规标头字段后的头块中的伪标头字段的请求或响应都必须被视为格式错误( http2规范 8.1.2.6节)。”

我不太熟悉“fetch”是如何实现头的,但是在上面的代码中,您似乎在头块之外有伪标头,并将它们放在末尾。可能是搞砸了。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57484393

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档