我正在开发一个PHP webapp,它接受来自特定客户端的大量POSTed文件上传,并希望在使用HTTP/1.1 100上传文件之前接受或拒绝这些上传(基于各种标题和其他因素,而不仅仅是大小)继续.
HTTP/1.1规范8.2.3的一些快速背景:
100(继续)状态(参见第10.1.1节)的目的是允许正在向请求主体发送请求消息的客户端确定源服务器是否愿意接受请求(基于请求头)在客户端发送请求主体之前.在某些情况下,如果服务器在不查看正文的情况下拒绝邮件,则客户端发送正文可能不合适或效率极低.
问题是Apache看到Expect:100-continue从客户端继续,返回100 Continue并接受文件上传所有在PHP开始处理之前...但是我需要PHP在Expect之后立即开始处理:100-continue.我不确定这是否可行所以我有两个问题:
我目前正在考虑通过指定客户端首先使用与POST相同的头发送HEAD请求来继续模拟100.然后,webapp可以返回响应以继续POST或错误代码.欢迎提出其他建议!
我正在使用ASP.NET MVC实现REST API,并且Expect: 100-continue对于具有帖子正文的请求,请求头的形式出现了一个小绊脚石.
RFC 2616声明:
在收到包含具有"100-continue"期望的Expect请求标题字段的请求时,源服务器必须以100(继续)状态响应并继续从输入流中读取,或者以最终状态代码进行响应.在发送100(继续)响应之前,源服务器不得等待请求主体.如果它以最终状态代码响应,它可以关闭传输连接,或者它可以继续读取并丢弃请求的其余部分.如果它返回最终状态代码,则它不能执行所请求的方法.
这听起来像我需要对请求做出两个响应,即它需要立即发送HTTP 100 Continue响应,然后继续读取原始请求流(即HttpContext.Request.InputStream)而不结束请求,然后最终发送结果状态代码(为了参数,我们可以说它是204 No Content结果).
所以,问题是:
wrt(2)我在继续阅读输入流之前尝试使用以下代码...
HttpContext.Response.StatusCode = 100;
HttpContext.Response.Flush();
HttpContext.Response.Clear();
Run Code Online (Sandbox Code Playgroud)
...但是当我尝试设置最终的204状态代码时,我收到错误:
System.Web.HttpException:在发送HTTP标头后,服务器无法设置状态.
Expect: 100-continue默认情况下,许多库包含所有HTTP 1.1 POST和PUT请求.
我打算通过在客户端删除100-continue机制来减少感知延迟,我知道立即发送数据的费用少于等待100-continue的往返,即短请求.
当然我仍然想要HTTP 1.1的所有其他强大功能,因此我只想杀死Expect: 100-continue标题.我有两个选择:
Expect:\r\n这两者之间有什么区别吗?
任何软件可能会破坏其中一个?
我有一个ApiController响应POST请求,通过HTTP的状态码307重定向它.它只使用标题中的信息,因此此操作不需要请求的主体.此操作相当于:
public HttpResponseMessage Post() {
var url;
// Some logic to construct the URL
var response = new HttpResponseMessage(HttpStatusCode.TemporaryRedirect);
response.Headers.Location = new System.Uri(url);
return response;
}
Run Code Online (Sandbox Code Playgroud)
这很简单,但我想做一个改进.请求正文可能包含大量数据,因此我想利用HTTP状态代码100来提高此请求的效率.使用现在的控制器,对话可能如下所示:
> POST /api/test HTTP/1.1
> Expect: 100-continue
> ...
< HTTP/1.1 100 Continue
> (request body is sent)
< HTTP/1.1 307 Temporary Redirect
< Location: (the URL)
< ...
Run Code Online (Sandbox Code Playgroud)
由于重定向操作不需要请求主体,我希望能够将会话缩短为:
> POST /api/controller HTTP/1.1
> Expect: 100-continue
> ...
< HTTP/1.1 307 Temporary Redirect
< Location: (the URL)
< ...
Run Code Online (Sandbox Code Playgroud)
我花了一天的时间来研究如何实现这一目标,但我还没有找到解决方案.在我的研究中,我学到了: …
我对 Spring Webflux 和 WebClient 的使用相当陌生。例如,我所执行的 POST 请求如下:
Mono<ResponseEntity<Resource>> dotResponse = this.webClient
.method(HttpMethod.POST)
.uri(new URI("https://test.com/something"))
.headers(headers -> headers.addAll(requestHeaders))
.body(BodyInserters.fromResource(resource))
.exchange()
.flatMap(response -> response.toEntity(Resource.class));
Run Code Online (Sandbox Code Playgroud)
实际上,代码有点复杂,但这个示例足以演示基本问题。无论如何,这确实有效,并且我得到了想要的结果。现在,由于资源可能相当大,我想使用“Expect:100-continue”标头。
问题是,我现在得到的是一个空的 100 响应,没有任何关于如何触发剩余请求的线索。我在 Google 或 Stack Overflow 上找不到任何关于如何解决这个问题的信息。
如果有任何指点,我将不胜感激。
http-status-code-100 spring-boot reactor-netty spring-webflux
注意:我们在客户端使用lib_neon,在服务器端使用Tomcat和servlet api.
问题在于:当客户端想要放置一些内容时,它会执行带有"Expect:100-continue"标头的PUT请求,Tomcat通过简单地返回状态100继续处理它,然后客户端开始发送请求的剩余部分,它由我们的自定义过滤器处理,并且通常不会通过(例如用户未经授权,或尝试放置过大的文件,超出用户限制或其他内容).过滤器会立即发送错误响应,但客户端仅在提交完整请求主体时才读取响应.
似乎不可能手动发送一些东西而不是100 Continue状态,当某些检查失败时,这种行为被硬编码到tomcat中,有没有其他方式不上传请求体,何时不可能?
是否可以使用Java Servlet API(HttpServletResponse)处理整个请求后发送"100 Continue"HTTP状态代码,然后再发送一些其他状态代码?
虽然API似乎不支持它,但我找不到任何明确的"否"答案.
http ×3
http-1.1 ×2
ajax ×1
asp.net ×1
asp.net-mvc ×1
c# ×1
http-headers ×1
httpserver ×1
iis ×1
java ×1
neon ×1
php ×1
rest ×1
servlets ×1
spring-boot ×1
tomcat6 ×1
web ×1