gpt4 book ai didi

php - 如何强制 CURL 请求 http/1.1?或者可能还有其他问题,不确定

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:04:44 27 4
gpt4 key购买 nike

我有一段代码(我们将其命名为代码 A)在一个框架中运行,我想让它在另一个框架中运行。工作代码使用 CURL 发出成功的 POST 请求,如下所示(打开 CURLOPT_VERBOSE 的请求):

* Connected to android.clients.google.com (216.58.209.238) port 443 (#0)
* ALPN, offering http/1.1
* Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
* successfully set certificate verify locations:
* CAfile: /Applications/MAMP/Library/OpenSSL/cert.pem
CApath: none
* SSL connection using TLSv1.2 / ECDHE-ECDSA-AES128-GCM-SHA256
* ALPN, server accepted to use http/1.1
* Server certificate:
* subject: C=US; ST=California; L=Mountain View; O=Google Inc; CN=*.google.com
* start date: Jan 18 19:17:59 2017 GMT
* expire date: Apr 12 18:51:00 2017 GMT
* subjectAltName: host "android.clients.google.com" matched cert's "android.clients.google.com"
* issuer: C=US; O=Google Inc; CN=Google Internet Authority G2
* SSL certificate verify ok.
> POST /auth HTTP/1.1
Host: android.clients.google.com
Accept: */*
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Content-Length: 97

这里的 http 框架(具体来说是 yii2/httpclient)有太多的依赖关系,无法将它带到另一个项目中,所以我试图在低级别上重新创建它(让我们将其命名为代码 B):

<?php 
$ch = curl_init();
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'post-data-here');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, 'https://android.clients.google.com/auth');
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Content-Type: application/x-www-form-urlencoded; charset=UTF-8"]); // just because I'm desperate
curl_setopt($ch, CURLOPT_VERBOSE, true);
$content = curl_exec($ch);

我希望得到相同的结果,但这是我得到的:

* Connected to android.clients.google.com (216.58.209.238) port 443 (#0)
* TLS 1.2 connection using TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
* Server certificate: *.google.com
* Server certificate: Google Internet Authority G2
* Server certificate: GeoTrust Global CA
> POST /auth HTTP/1.1
Host: android.clients.google.com
Accept: */*
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Content-Length: 97
* upload completely sent off: 97 out of 97 bytes
< HTTP/1.1 200 OK
< Content-Type: text/plain; charset=utf-8
< Cache-Control: no-cache, no-store, max-age=0, must-revalidate
< Pragma: no-cache
< Expires: Mon, 01 Jan 1990 00:00:00 GMT
< Date: Fri, 27 Jan 2017 12:07:12 GMT
< X-Content-Type-Options: nosniff
< X-Frame-Options: SAMEORIGIN
< X-XSS-Protection: 1; mode=block
< Server: GSE
< Alt-Svc: clear
< Accept-Ranges: none
< Vary: Accept-Encoding
< Transfer-Encoding: chunked
<HTML>
<HEAD>
<TITLE>HTTP Version Not Supported</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF" TEXT="#000000">
<H1>HTTP Version Not Supported</H1>
<H2>Error 505</H2>
</BODY>
</HTML>

我得到的不是有效响应,而是“错误 505:不支持 HTTP 版本”。我看到的唯一区别是工作代码尝试“ALPN,提供 http/1.1”,而后一个代码不这样做。之后是证书部分,但它从未在代码 A 中提及,所以我不确定提供它有什么作用。

两个版本的代码都在同一台服务器上运行,相同版本的 PHP (5.6) 和 CURL (7.51.0)。详细日志的差异在发送任何数据之前就开始了,所以我想这与任何数据或 header 设置不正确无关。

到目前为止我尝试了什么(效果很小或没有效果):

  1. curl_setopt($ch, CURLOPT_SSL_ENABLE_ALPN, whatever) - 不起作用,因为 CURLOPT_SSL_ENABLE_ALPN 根本没有定义(尽管它必须在这个版本的 CURL 中,不确定哪里出了问题)
  2. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, whatever)
  3. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, whatever)
  4. curl_setopt($ch, CURLOPT_SSLVERSION, whatever)
  5. 一些我什至羞于在这里展示的其他绝望的愚蠢的东西

我已尝试尽可能深入地学习工作代码,但它似乎无法通过简单的 HTTP POST 执行任何操作。我跟踪了它生成的每个 curl_setopt,似乎我在代码中使用的只有这些 curl_setopt,没有多余的东西。尽管如此,它仍然有效,但我的代码没有。

我试过使用命令行做同样的事情:

$ curl https://android.clients.google.com/auth -v --http1.1 -X POST --no-alpn --no-npn --data "copypasted-post-data-from-code-B-and-yes-its-urlencoded"

得到正确的结果:

*   Trying 216.58.209.238...
* TCP_NODELAY set
* Connected to android.clients.google.com (216.58.209.238) port 443 (#0)
* Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
* successfully set certificate verify locations:
* CAfile: /Applications/MAMP/Library/OpenSSL/cert.pem
CApath: none
...
> POST /auth HTTP/1.1
> Host: android.clients.google.com
> User-Agent: curl/7.51.0
> Accept: */*
> Content-Length: 97
> Content-Type: application/x-www-form-urlencoded
>
* upload completely sent off: 97 out of 97 bytes
< HTTP/1.1 200 OK
< Content-Type: text/plain; charset=utf-8
< Cache-Control: no-cache, no-store, max-age=0, must-revalidate
< Pragma: no-cache
< Expires: Mon, 01 Jan 1990 00:00:00 GMT
< Date: Fri, 27 Jan 2017 13:22:27 GMT
< X-Content-Type-Options: nosniff
< X-Frame-Options: SAMEORIGIN
< X-XSS-Protection: 1; mode=block
< Server: GSE
< Alt-Svc: clear
< Accept-Ranges: none
< Vary: Accept-Encoding
< Transfer-Encoding: chunked
<
SID=BAD_COOKIE
LSID=BAD_COOKIE
Auth=here-s-the-data-i-need

最佳答案

Error 505: HTTP Version Not Supported 不是 curl/libcurl 返回的错误字符串,这听起来像是您从服务器收到的内容沟通。如果您向我们展示包括 header 在内的完整 HTTP 响应,我们可能已经看到了。

因此,您尝试使用不同的 curl 选项都没有任何收获,因为 curl 每次都运行良好。您还可以通过对您尝试开始工作的主机使用 curl 命令行工具来验证:

curl https://android.clients.google.com/auth -v --http1.1 -X POST --no-alpn --no-npn

此命令行显示 TLS 和 HTTP“层”均正常。

另一个问题here当他们传入错误的数据(不是 url 编码)时得到了类似的错误。也许您有类似的东西,但由于切换到新框架而错过了它?

关于php - 如何强制 CURL 请求 http/1.1?或者可能还有其他问题,不确定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41894411/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com