2015-11-01 5 views
9

私はHTMLページを読み込むときに、私は約5秒間で書かれた5つの文字列を持っています。Safariは受け取ったHTMLをレンダリングします

<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はリクエストが終了するまでタグの表示を拒否します。

クロムがやっているようです。

Firefoxは最初のコンテンツのエンコーディングhttps://bugzilla.mozilla.org/show_bug.cgi?id=647203

を決定する必要がある。しかしSafariはちょうど断るようです。別の応答コードまたはヘッダーが必要ですか?明示的にコンテンツタイプをtext/htmlに設定しようとしています。うまくいきませんでした。

私は、文字列が2番目に離れて送信されていることをWiresharkで確認しました。つまり、キャッシュされておらず、一度に送信されています。

ローカルホストを経由するか、私のパブリックIPアドレスを使用すると、これが発生することを確認しました。

私はコンテンツの長さを試して、生き続ける、前者は自動的に要求を終了し、後者は効果がないようです。

ヘッダと

Firefoxの(作業)Wiresharkのからの応答(動作しない)

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 

サファリ

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() 
+0

あなたは、ヘッダー(要求と応答の両方)を投稿することができますか? – Craneum

+0

Wiresharkの両方から追加しました。 – Zimm3r

+0

bodyタグを閉じ、2秒待ってからhtmlタグを閉じ、2秒待ってから最後にリクエストを終了すると、動作が変わりますか? – abathur

答えて

0

[OK] Safariがhtmlをレンダリングするためには、受信時にレンダリングを開始する前に少なくとも1024バイトを書き込む必要があります。

下記のように、動作しているバージョンと動作していないバージョンの両方を示すデモが表示されます。 Firefoxでも同様のことが起こります(エンコーディングを判断するのに1024バイト必要です)が、Firefoxでそれをバイパスするようにエンコーディングを設定することができます。 Safariでこれを行う方法があるかどうかはわかりません。


+---------------------------------------------------+ 
| What you send | How much you need    | 
+---------------------------------------------------+ 
| Nothing  | 1024 bytes      | 
+---------------------------------------------------+ 
| Meta Charset | 512 bytes      | 
+---------------------------------------------------+ 
| Header Charset | 512 bytes (not including header) | 
+---------------------------------------------------+ 

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 

import time 


# max 133 
# 133 * 8 = 1064 

html_string_working = "<p>" # 3 bytes 
html_string_working += "I'm the version that works! I show up right away!" # 49 bytes 
html_string_working += "<!---" # 5 bytes 
html_string_working += " " * (1024 - (3+49+5+3+4)) # filler 
html_string_working += "-->" # 3 bytes 
html_string_working += "</p>" # 4 bytes 

print len(html_string_working) 


html_string_non_working = "<p>" # 3 bytes 
html_string_non_working += "I'm the version that does not work! I don't show up right away!" # 63 bytes 
html_string_non_working += "</p>" # 4 bytes 
html_string_non_working += "<!---" # 5 bytes 
html_string_non_working += " " * (1023 - (3+63+5+3+4)) # filler but one byte short (notice 1023 instead of 1024) 
html_string_non_working += "-->" # 3 bytes 


print len(html_string_non_working) 

# charset maybe? Firefox won't start parsing until 1024 
# unless it has charset specified see https://bugzilla.mozilla.org/show_bug.cgi?id=647203 
# "Your script does not appear to declare the character encoding. When the character 
# encoding is not declared, Gecko won't start parsing until it has received 1024 
# bytes of HTTP payload." 

# charset works but requires 512 bytes 
html_string_charset = "<meta charset=utf-8>" # 20 bytes 
html_string_charset += "<p>" # 3 bytes 
html_string_charset += "I'm the meta charset version. I may work!" # 41 bytes 
html_string_charset += "</p>" # 4 bytes 
html_string_charset += "<!---" # 5 bytes 
html_string_charset += " " * (512 - (20+3+41+5+3+4)) # filler but one byte short (512 bytes; 511 doesn't work) 
html_string_charset += "-->" # 3 bytes 

# what about in header form 
# charset works but requires 512 bytes not including the headers (so same as meta version) 
html_string_charset_headers = "<p>" # 3 bytes 
html_string_charset_headers += "I'm the header charset version. I may work!" # 43 bytes 
html_string_charset_headers += "</p>" # 4 bytes 
html_string_charset_headers += "<!---" # 5 bytes 
html_string_charset_headers += " " * (512 - (3+43+5+3+4)) # filler but one byte short (512 bytes; 511 doesn't work) 
html_string_charset_headers += "-->" # 3 bytes 


print len(html_string_charset_headers) 


later = "<p> I'm written later. Now it suddenly will work because bytes >= 1024." # 71 bytes 

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) 
     # firefox require the char set see https://bugzilla.mozilla.org/show_bug.cgi?id=647203 

     # render working version or not 
     try: 
      w = int(request.args["w"][0]) 
     except: 
      w = 1 

     if w == 1: 
      request.write(html_string_working) 
     elif w == 2: 
      request.write(html_string_non_working) 
     elif w == 3: 
      request.write(html_string_charset) 
     elif w == 4: 
      # 12 + 24 = 36 bytes but doesn't count towards 512 total 
      request.responseHeaders.addRawHeader("Content-Type", "text/html; charset=utf-8") 
      request.write(html_string_charset_headers) 

     reactor.callLater(2, self.run_later, request) 

     return NOT_DONE_YET 


    def run_later(self, request): 
     request.write(later) 
     request.finish() 





class Root(Resource): 
    isLeaf = False 
    def render_GET(self, request): 
     return """<html><body> 

     <p><a href="pe?w=1">Working version here</a></p> 
     <p><a href="pe?w=2">Non working version here</a></p> 
     <p><a href="pe?w=3">Meta charset version here</a></p> 
     <p><a href="pe?w=4">Header charset version here</a></p> 
     </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__": 
    print "Running" 
    reactor.listenTCP(8080, site) 
    reactor.run() 
1

有効なタグではありません使用<br />または<br>の代わり</br>

+0


タグを使用するように変更されたデモ、何も変わらない、
も問題なく動作します。 – Zimm3r

+1

@ Zimm3rそうかもしれない。 [こちら](http://stackoverflow.com/questions/158539/br-not-working-in-firefox-and-chrome)や[ここ](http://stackoverflow.com/questions/6486792/safari- not-registering-br-tags) –

1

Safari for Windowsでこれを試していますか?はいの場合、それ以上正式にはサポートされません。 Safari for Macでこの問題を解決しようとしている場合は、デモを作成するか、すでにリンクしている場合はリンクを共有してください。

私はこのことをテストして助けます。

+0

Macにはありません。 (Wow Safari Windowsは過去からの爆発です)。私はデモを実行します。 – Zimm3r

+0

デモが追加されました。 – Zimm3r

関連する問題