问题标签 [http-1.1]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
php - PHP:获取 HTTP 协议版本(HTTP/1.1 与 HTTP/2)
到目前为止,我的 php 应用程序都假定 HTTP 1.1 无处不在。所以我像这样定义了所有标题:
但是现在我的服务器也支持 HTTP 2,我想用正确的 HTTP 状态代码更新所有的标头响应。
如何获取 http 请求的 HTTP 协议版本?
(我的网络服务器是 nginx,但我想如果我使用的是 nginx 或 apache,这无关紧要。)
http - 当客户端在 websocket 打开握手中指定 HTTP/1.0 时返回的最合适的 HTTP 状态代码是什么?
根据 WebSocket RFC ( RFC6455#section-4.2.1 ):
如果服务器在读取握手时发现客户端未发送与以下描述匹配的握手 [...],则服务器必须停止处理客户端的握手并返回带有适当错误代码的 HTTP 响应(例如400 错误请求)。
- 一个 HTTP/1.1 或更高版本的 GET 请求,包括一个“Request-URI”[RFC2616],应该解释为第 3 节中定义的 /resource name/(或包含 /resource name/ 的绝对 HTTP/HTTPS URI)。
[ETC...]
当客户端的握手消息改为指定HTTP/1.0
(或者可能是更低的版本号?)时,我不确定在HTTP/1.1 400 \r\n\r\n
给定其定义(RFC7231#section-6.5.1)的情况下响应是否合适:
400 (Bad Request) 状态码表示服务器不能或不会处理请求,因为某些东西被认为是客户端错误(例如,格式错误的请求语法、无效的请求消息帧或欺骗性请求路由)。
我想HTTP版本号是否太低是否被认为是客户端错误取决于如何解释客户端握手消息:
任何一个...
- 客户端握手消息是一个普通的 HTTP1.1 消息(如果它包含一组特定的 HTTP 标头,可能会导致未来升级到 WebSocket)。
...或者...
- 客户端握手消息实际上不是 HTTP1.1 消息,而是实际上是 WebSocket 标准的一部分并且只是伪装成 HTTP1.1 消息的消息。
如果是后者,状态码 400 是有意义的,因为客户端明显违反了 WebSocket 标准。
如果是前者,则状态码 400 没有意义,因为该消息作为 HTTP 消息是有效的;并且状态码 505 可能更可取:(RFC7231#section-6.6.6)
505(不支持 HTTP 版本)状态码表示服务器不支持或拒绝支持请求消息中使用的 HTTP 主要版本。服务器表示它无法或不愿意使用与客户端相同的主要版本完成请求,如 [RFC7230] 的第 2.6 节所述,除了此错误消息。服务器应该为 505 响应生成一个表示,描述为什么不支持该版本以及该服务器支持哪些其他协议。
再说一次,我不喜欢返回 5XX 类状态代码的想法,因为它或多或少表明服务器因抛出错误而出错......
编辑:正如我在下面的评论中提到的,大部分歧义可能源于我根本不检查客户端是否打算升级到 WebSocket。
http - HTTP 1.1 服务器如何响应 HTTP 1.0 请求?
HTTP 1.1 服务器应如何响应 HTTP 1.0 请求,以获取Pragma : no-cache
HTTP 1.0 支持但 HTTP 1.1 不支持的标头
http2 - 如果 HTTP/1.1 客户端与仅 HTTP/2 的服务器通信会怎样,如果 HTTP/2 客户端与仅 HTTP/1.1 的服务器通信会怎样?
HTTP/2 绝对是未来的趋势,因为它现在是 HTTP 协议的标准。正如我们在Can I use中看到的,70.15% 的浏览器支持 HTTP/2。但是 HTTP/2 太新了,有浏览器只支持 HTTP/1.x,也有很多服务器只支持 HTTP/1.x。我知道客户端可以使用 HTTP 升级机制来协商一个适当的协议来与服务器通信。例如,如果服务器支持 HTTP/2,他们的通信协议将切换到 HTTP/2,否则,使用 HTTP/1.x。但这仅适用于客户端使用的浏览器同时支持 HTTP/2 和 HTTP/1.x 的情况,对吧?
但是,如果只支持 HTTP/1.x 的浏览器上的用户想要与仅支持 HTTP/2 的服务器通信怎么办?服务器会忽略请求还是将错误发送回用户?
如果仅支持 HTTP/2 的浏览器上的用户想要与仅支持 HTTP/1.1 的服务器通信怎么办?我想这个过程可能是这样的:用户向服务器发送连接前言,服务器无法识别请求,因此用户可能会收到连接错误消息。这是正确的吗?
或者有没有只支持 HTTP/2 的浏览器?
paypal - Paypal 安全升级会影响订阅按钮吗?
我有一个带有订阅按钮的网页,在用户单击时它会重定向到 paypal.com/cgi-bin/webscr。
我将业务输入更改为我的业务沙箱帐户,并将端点更改为 sandbox.paypal.com/cgi-bin/webscr。
我的沙盒买家帐户似乎运行良好,因为执行测试交易时余额发生变化。
我想知道这个测试是否意味着我的页面符合新的 Paypal 安全更改(TLS 1.2 和 HTTP/1.1 协议以及 SHA-256 和 G5 证书)。
提前致谢。
java - Java Socket 编程 - HTTP 1.1 出现 301 错误
我刚开始用 Java 学习套接字编程,我已经遇到了一个不寻常的行为。这是代码片段
这将为我提供带有 HTTP 1.1 和 1.0 的“301 永久移动”代码。如果我取消注释请求和主机名之间的空行
它会给我HTTP 1.1 的“HTTP/1.1 400 Bad Request”和 HTTP 1.0 的“HTTP/1.1 200 OK”。
为什么会有这样的行为?发生这种情况是因为我们有 HTTP 1.0 中的请求而响应是 HTTP 1.1 中的吗?
谢谢。
rest - HTTP/1.1 400 错误请求 Sabre REST Api
目前使用 Sabre Dev Studio 的测试开发人员帐户并尝试使用他们的 REST Api - Instaflights_Search。
我正在创建身份验证并获得访问令牌,但是当我尝试发送请求时出现问题。我正在使用 curl 和 php 创建标题。
Sabre的回应是:
HTTP 1/1 请求标头内容如下:
任何想法可能是标题的问题?
编辑于 23/05/2016 更正版本,用于构建以下请求标头:
http2 - http/2 中的分块下载是如何工作的(或者更好的是什么是等效的?)
在分块下载中,每个块都有扩展,可以在访问浏览器时加以利用。最后一个块还可以包含定义诸如内容长度之类的可选标头,如果我们通过流式传输一个大文件,我们可以在最后以 http 标头的形式提供该信息。
这在 http/2 中是如何工作的?最后一段中是否有扩展名或标题。我看到有数据有效负载,但没有扩展或可选标头 AFAICT。我只看到填充。
也许更好的问题是浏览器甚至
- 利用最后一个块中的可选标头?
- 利用每个块中的扩展?
也许程序可能会关心,但如果它是一个程序,我相信http/2,服务器可能只是更好地定义了api,并在发送响应+数据后使用推送机制?
如果我是为客户端定义 api 的服务器,如何在这个新的 http/2 世界中发送可选标头?
我试图使用wireshark来捕获下载跟踪,但chrome似乎使用QUICK,当我使用firefox和drive.google.com下载文件时,我似乎无法用wireshark解密SSL(它仍然存在在同一个跟踪中加密时,我实际上在 TLS 中看到了一些 http2 流量,而其他一些服务工作得很好)。使用“(Pre)-Master-Secret 日志文件名”似乎只工作了一半,我不太清楚为什么。我最终不得不重新启动一切并重新运行我的案例。
此外,在 Server hello 中,h2 是选择的协议,但是当我过滤到 ip.addr=(server hello google ip) 和 tcp.port=443 时,没有出现 http2 数据包
谢谢,院长
rest - 如何在没有传输编码的情况下发送 POST 请求:从 Jersey ReST Client 2.22.2 分块
当我通过 Jersey ReST 客户端发送 POST 请求时,它会自动使用Header transfer-encoding: [chunked]。
有没有办法强制使用内容长度:而不是传输编码。?
添加 Content-Length 属性后,行为相同
http-1.1 - Is it allowed to use the 409 Conflict status code to prevent some fields from being updated in a HTTP PUT request
While working on an (json) REST API, I came upon the situation that we have a representation of a user
resource where I wanted to prevent a field (email
) to be overridden within a PUT
. If I understand correctly, then a PUT should contain the entire representation of the resource to replace the old one.
So for example, when fetching a user from the API (Some headers left out for simplicity):
And you'd want to fix the typo in John Smiths name, you'd do:
Now, if someone were to put a different e-mail address, am I allowed to use a 409 to indicate the request was not processed?
According to https://www.rfc-editor.org/rfc/rfc2616
- A 400 Bad Request indicates malformed syntax (which this isn't)
- A 403 Forbidden could be used, but it seems to me that it is more about access to the entire resource, not part of it
- A 409 Conflict seems to be about a technical reason for not being able to fulfil the request, and not about having privileges to do something.
So, my question is: which status code should I use?
Edit: in light of the accepted answer; the response would become