Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
HTTP响应头是否可以不以状态行开头? 我在C++中编写了一个REST API,它响应文件的请求。有时,我响应的文件需要一段时间来准备(需要解密)。当一个大文件被解密时,套接字有时会超时,并且我的API永远无法响应任何内容_C++_Rest_Sockets_Http - Fatal编程技术网

HTTP响应头是否可以不以状态行开头? 我在C++中编写了一个REST API,它响应文件的请求。有时,我响应的文件需要一段时间来准备(需要解密)。当一个大文件被解密时,套接字有时会超时,并且我的API永远无法响应任何内容

HTTP响应头是否可以不以状态行开头? 我在C++中编写了一个REST API,它响应文件的请求。有时,我响应的文件需要一段时间来准备(需要解密)。当一个大文件被解密时,套接字有时会超时,并且我的API永远无法响应任何内容,c++,rest,sockets,http,C++,Rest,Sockets,Http,请求系统在收到我的响应时不会超时 所以我想发送一个初始响应头(哪一个?),然后才开始解密。然后将响应(从状态代码开始,然后是文件)发送到仍然打开的套接字 这是可能的还是有更好的方法?HTTP/1.1 100继续 规格如下: (是HTTP/1.1协议的扩展)为这种情况引入了: 10.1 102处理 102(处理)状态代码是一个临时响应,用于 通知客户端服务器已接受完整请求, 但尚未完成。此状态代码只应发送 当服务器合理预期请求将 花大量的时间来完成。作为指导,如果采用了一种方法 处理时间超过20秒

请求系统在收到我的响应时不会超时

所以我想发送一个初始响应头(哪一个?),然后才开始解密。然后将响应(从状态代码开始,然后是文件)发送到仍然打开的套接字


这是可能的还是有更好的方法?

HTTP/1.1 100继续

规格如下:

(是HTTP/1.1协议的扩展)为这种情况引入了:

10.1 102处理 102(处理)状态代码是一个临时响应,用于
通知客户端服务器已接受完整请求,
但尚未完成。此状态代码只应发送
当服务器合理预期请求将
花大量的时间来完成。作为指导,如果采用了一种方法 处理时间超过20秒(合理但任意的值) 服务器应返回102(处理)响应。服务器必须 在请求完成后发送最终响应

处理方法可能需要很长时间,
特别是支持深度标题的方法。在这种情况下,
客户端可能在等待响应时超时连接。到
如果不这样做,服务器可能会将102(处理)状态代码返回到
向客户端指示服务器仍在处理
方法


不在
HTTP
协议本身的上下文中。在
HTTP
协议中没有这样的东西

类似的内容通常在更高的级别上实现。这通常是由原始请求在后台启动长时间运行的任务,并返回一个临时的“请等待…”类型的页面来完成的。页面的javascript立即执行AJAX调用。在服务器上,AJAX调用会等待适当的时间(通常为一分钟)来完成进程。如果它仍在运行,AJAX调用将相应地返回一个指示,客户端javascript将发出另一个调用。客户端javascript继续进行定期AJAX调用,等待后台进程完成


最终,AJAX调用返回后台任务已完成的指示,此时客户端javascript执行HTTP请求以立即检索准备检索的文档。

100继续仅在上载大型请求时使用。@SamVarshavchik文档中没有说明。请参阅RFC 2616第8.2.3节。100 continue“允许正在发送请求消息的客户机使用请求正文来确定源服务器是否愿意接受请求”。就是这样。@SamVarshavchik“这个规则有一个例外:为了与RFC 2068兼容,服务器可以发送100(继续)状态来响应HTTP/1.1 PUT或POST请求,该请求不包括带有“100-继续”期望的Expect请求头字段。”@obay字面上发送字符串“HTTP/1.1 102请稍候\r\n\r\n“-这将完成第一个头-然后,您可以在准备好后发送第二个头+正文。通常的做法是安排对文件进行解密,以便您可以在解密文件结尾之前发送文件开头。当然,这取决于您对加密的选择。从根本上说,如果在收到请求后的24小时内无法发送响应的任何部分,那么HTTP over TCP/IP就不是适合您的协议…@SteveJessop 24小时?你能详细说明一下吗?@Leon:提问者没有说明准备回答需要多长时间。我以24小时为例,它显然太长了,HTTP(单独)是不合适的。不过,可以设计一个RESTAPI,通过调用请求准备特定数据(也许这可以返回所需时间的估计值),然后另一个调用来轮询它是否准备就绪和/或在它准备就绪后收集结果。@Steve我们不能用解密文件的一部分进行响应,因为这意味着我们的响应应该以200开头,如果解密(文件的其余部分)无法完成/失败,这可能不是真的,对吗?似乎这就是我要寻找的。但是,既然这看起来像是两种反应,怎么能做到这一点呢?我们没有客户端,因此如果第一个请求是102,我无法修改它以创建另一个请求。您不必等待另一个请求。如果客户端理解此响应代码,则它将等待您的后续最终响应。您的意思是,这是发送2个状态代码的同一响应流?是的。服务器甚至可能会连续多次发送此状态代码。谢谢,我将尝试此操作。我们不拥有客户端,也无法修改代码。如果您不拥有客户端,也无法修改代码,那么您显然无法对客户端发出请求并期待对该请求做出响应的情况采取任何措施。客户端将不得不等待,直到您完成对请求的处理。唯一可能的远程攻击是自定义http服务器,它每隔一分钟左右向客户端发送一个虚拟头“Foo:bar\r\n”,直到处理就绪,然后发送真正的头。