http - Safari 呈现接收到的 HTML

标签 http safari

当我加载一个 html 页面时,我有 5 个字符串,间隔大约一秒。

<br>1</br>
...... 1 second ......
<br>2</br>
...... 1 second ......
<br>3</br>
...... 1 second ......
<br>4</br>
...... 1 second ......
<br>5</br>
...... 1 second ......

--- end request ---

Chromium 和 Firefox 都加载并显示第一个 br,然后显示接收到的下一个。 (但是 Firefox 需要内容编码)。但是在请求结束之前,Safari 拒绝显示任何标签。

Chromium 似乎可以做到这一点。

Firefox首先需要判断内容编码https://bugzilla.mozilla.org/show_bug.cgi?id=647203

但 Safari 似乎只是拒绝。是否需要不同的响应代码或 header ?我尝试将内容类型明确设置为 text/html。没用。

我已经在 Wireshark 中确认字符串是分开发送的,即它们没有被缓存并一次发送。

我还确认,如果我通过本地主机或使用我的公共(public) IP 地址,就会发生这种情况。

我试过content-length和keep alive,前者只是自动关闭请求,后者似乎没有效果。

来自 Wireshark 的 header 和响应

Firefox(工作)

GET /pe HTTP/1.1
Host: 127.0.01:8080
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:42.0) Gecko/20100101 Firefox/42.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
DNT: 1
Connection: keep-alive
Cache-Control: max-age=0

HTTP/1.1 200 OK
Transfer-Encoding: chunked
Date: Tue, 10 Nov 2015 17:10:20 GMT
Connection: keep-alive
Content-Type: text/html; charset=utf-8
Server: TwistedWeb/13.2.0

1f
<html>
<title>PE</title>
<body>
2e

<br> This is the 1th time I've written. </br>
2e

<br> This is the 2th time I've written. </br>
2e

<br> This is the 3th time I've written. </br>
2e

<br> This is the 4th time I've written. </br>
2e

<br> This is the 5th time I've written. </br>
8

</body>
8

</html>
0

Safari(不工作)

GET /pe HTTP/1.1
Host: 127.0.0.01:8080
Accept-Encoding: gzip, deflate
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/601.1.56 (KHTML, like Gecko) Version/9.0 Safari/601.1.56
Accept-Language: en-us
DNT: 1
Connection: keep-alive

HTTP/1.1 200 OK
Transfer-Encoding: chunked
Date: Tue, 10 Nov 2015 17:12:55 GMT
Connection: keep-alive
Content-Type: text/html; charset=utf-8
Server: TwistedWeb/13.2.0

1f
<html>
<title>PE</title>
<body>
2e

<br> This is the 1th time I've written. </br>
2e

<br> This is the 2th time I've written. </br>
2e

<br> This is the 3th time I've written. </br>
2e

<br> This is the 4th time I've written. </br>
2e

<br> This is the 5th time I've written. </br>
8

</body>
8

</html>
0

演示

import twisted
from twisted.python import log
import sys

log.startLogging(sys.stdout)
from twisted.web.server import Site, NOT_DONE_YET
from twisted.web.resource import Resource
from twisted.internet import reactor



class PersistantExample(Resource):
    '''Gives an example of a persistant request'''
    # does not exist on Safari until stopping browser / ending connection

    isLeaf = True
    def render_GET(self, request):
        log.msg("Ooooh a render request")
        # schedule the reoccuring thing (this could be something else like a deferred result)

        reactor.callLater(1.1, self.keeps_going, request, 0) # 1.1 seconds just to show it can take floats

        # firefox require the char set see https://bugzilla.mozilla.org/show_bug.cgi?id=647203
        request.responseHeaders.addRawHeader("Content-Type",
        "text/html; charset=utf-8") # set the MIME header (charset needed for firefox)

        # this will cause the connection to keep only open for x length
        # (only helpful if the length is known, also does NOT make it render right away)
        # request.responseHeaders.addRawHeader("Content-Length", "150")

        request.write("<html>\n<title>PE</title>\n<body>")
        return NOT_DONE_YET


    def keeps_going(self, request, i):
        log.msg("I'm going again....")
        i = i + 1
        request.write("\n<br> This is the %sth time I've written. <br>" % i) ## probably not best to use <br> tag

        if i < 5:
            reactor.callLater(1.1, self.keeps_going, request, i) # 1.1 seconds just to show it can take floats
        if i >= 5 and not request.finished:
            log.msg("Done")
            request.write("\n</body>")
            request.write("\n</html>")
            # safari will only render when finished
            request.finish()


class Root(Resource):
    isLeaf = False
    def render_GET(self, request):
        return "<html><body>Demo is <a href=\"pe\">here</a></body></html>"




class Site(Site):
    pass



root = Root()
pe = PersistantExample()
site = Site(root)

root.putChild("", root)
root.putChild("index", root)
root.putChild("pe", pe)

# listen
if __name__ == "__main__":
    reactor.listenTCP(8080, site)
    reactor.run()

最佳答案

您是在 Windows 版 Safari 上尝试这个吗?如果是,那么它不再正式支持。如果您尝试在 Safari for Mac 上解决此问题,请创建演示或共享链接(如果您已有)。

我可以测试并帮助你解决这个问题。

关于http - Safari 呈现接收到的 HTML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33464381/

相关文章:

java - 我需要只能执行 Web 服务请求的 Java 守护进程或服务器(Web 服务客户端)

javascript - Safari 中 WebSQL 中的 SELECT 查询返回错误

ios - iOS 113 上的 PWA 问题

html - Safari 中的缩放问题 - 为什么 Border-top 会修复它,还有其他方法吗?

java - 为什么从字节数组而非 InputStream 创建 Message.Builder 时会收到 InvalidProtocolBufferException?

angularjs http远程api加载失败

http - 获取请求时出现 Elm NetworkError,但控制台表示没问题

Safari Mobile 无法在 http 上打开相机

iphone - iPhone 模拟器启动时自动打开 Safari 调试器

javascript - Firefox 正在解析空响应负载