鉴于此简单的网络服务器代码:
console.log('starting');
var server = require('http').createServer();
server.on('connection',function(socket){console.log('*server/connection');});
server.on(
'request',
function(request, response){
console.log('*server/request');
request.on(
'data',
function(chunk){
console.log('*request/data');
// <!> How do I abort next data calls from here?
}
);
request.on(
'readable',
function(chunk){
console.log('*request/readable');
// <!> How do I abort next readable calls from here?
}
);
request.on(
'end',
function(){
console.log('*request/end');
response.writeHead(200,"OK");
response.write('Hello');
response.end();
}
);
request.on('close',function(){ console.log('*request/close'); } );
request.on('error',function(){ console.log('*request/error'); } );
}
);
server.on('close',function(){console.log('server/close');});
server.on('checkContinue',function(request, response){console.log('*server/checkContinue');});
server.on('connect',function(request, socket, head){console.log('*server/connect');});
server.on('upgrade',function(request, socket, head){console.log('*server/upgrade');});
server.on('clientError',function(exception, socket){console.log('*server/clientError');});
server.listen(8080);
console.log('started');
Run Code Online (Sandbox Code Playgroud)
当提交POST或FILE时,我的on数据功能会被触发一次或多次.有时候(就像发送了一个可怕的大文件)我想在数据事件上取消它并触发用户的on …
我正在使用requests(它使用urllib3引擎盖下的 Python http 模块)库从 Python 脚本上传文件。我的后端首先检查请求的标头,如果它不符合所需的先决条件,它会立即停止请求并以有效的 400 响应进行响应。
这种行为在 Postman 或 Curl 中运行良好;即客户端能够解析 400 响应,即使它没有完成上传并且服务器过早地响应。但是,在 Python 中使用requests/执行此操作时urllib3,库无法处理后端响应:
Traceback (most recent call last):
File "C:\Users\Neumann\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\urllib3\connectionpool.py", line 670, in urlopen
httplib_response = self._make_request(
File "C:\Users\Neumann\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\urllib3\connectionpool.py", line 392, in _make_request
conn.request(method, url, **httplib_request_kw)
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.1776.0_x64__qbz5n2kfra8p0\lib\http\client.py", line 1255, in request
self._send_request(method, url, body, headers, encode_chunked)
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.1776.0_x64__qbz5n2kfra8p0\lib\http\client.py", line 1301, in _send_request
self.endheaders(body, encode_chunked=encode_chunked)
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.1776.0_x64__qbz5n2kfra8p0\lib\http\client.py", line 1250, in endheaders
self._send_output(message_body, encode_chunked=encode_chunked)
File "C:\Program …Run Code Online (Sandbox Code Playgroud) 我可以在完全读取 HTTP 请求之前发送 HTTP 响应吗?
例如,如果用户 POST 大文件 - 超出大小限制或服务发送错误的标头,我们不需要处理其余数据并使用 HTTP 错误代码重放?
更新我终于发现这个问题已经被问过:
这是可能的,但浏览器实现是“损坏的” - 没有考虑到此类事件。
在HTTP/1.1标准中,是否明确允许或禁止服务器在收到所有请求数据之前发送响应?
举个例子,当使用 POST 请求上传大量数据时,我可以想象服务器在收到请求的标头后但在收到整个正文之前返回“202 ACCEPTED”响应。合法还是不合法?这是野外存在的东西吗?
与服务器在收到整个请求之前发送 HTTP 响应是否可以接受密切相关?,但那里的响应似乎侧重于处理“错误”(可能是 4xx、5xx),而不是“成功”(2xx)