2016-05-13 10 views
2

私はJetty 9.3.9.M1組み込みサーバーとhttp/2を使用し、Apache Wicketと共にPushBuilder APIを使用してリソースをクライアント。Jettyは、http2を使用しているときに304の代わりにステータス200を返します。

私は、次のサーバーのセットアップに使用

http://127.0.0.1:8080/wicket/resource/de.jetty.wicket.http2.example.resources.TestResourceReference/TestResourceReference-ver-1463040221000.css

状況:今、私はこのようなリソースへのHTTP/1.1リクエストを行うという問題に直面しています

Server server = new Server(); 

// HTTP Configuration 
HttpConfiguration http_config = new HttpConfiguration(); 
http_config.setSecureScheme("https"); 
http_config.setSecurePort(8443); 
http_config.setSendXPoweredBy(true); 
http_config.setSendServerVersion(true); 

// keytool -keystore keystore -alias jetty -genkey -keyalg RSA 
SslContextFactory sslContextFactory = new SslContextFactory(); 
sslContextFactory.setKeyStorePath(new File(".","keystore").getCanonicalPath()); 
sslContextFactory.setKeyStorePassword("123456789"); 
sslContextFactory.setKeyManagerPassword("123456789"); 
sslContextFactory.setCipherComparator(HTTP2Cipher.COMPARATOR); 
sslContextFactory.setUseCipherSuitesOrder(true); 

// HTTPS Configuration 
HttpConfiguration https_config = new HttpConfiguration(http_config); 
https_config.addCustomizer(new SecureRequestCustomizer()); 

// HTTP Connector 
ServerConnector http1 = new ServerConnector(server, new HttpConnectionFactory(http_config), 
    new HTTP2CServerConnectionFactory(http_config)); 
http1.setPort(8080); 
server.addConnector(http1); 

// HTTP/2 Connection Factory 
HTTP2ServerConnectionFactory http2 = new HTTP2ServerConnectionFactory(https_config); 

NegotiatingServerConnectionFactory.checkProtocolNegotiationAvailable(); 
ALPNServerConnectionFactory alpn = new ALPNServerConnectionFactory(); 
alpn.setDefaultProtocol(http1.getDefaultProtocol()); 

// SSL Connection Factory 
SslConnectionFactory ssl = new SslConnectionFactory(sslContextFactory, alpn.getProtocol()); 

// HTTP/2 Connector 
ServerConnector http2Connector = new ServerConnector(server, ssl, alpn, http2, 
    new HttpConnectionFactory(https_config)); 
http2Connector.setPort(8443); 
server.addConnector(http2Connector); 

WebAppContext webAppContext = new WebAppContext(); 
webAppContext.setServer(server); 
webAppContext.setContextPath("/"); 
webAppContext.setWar("src/main/webapp"); 
server.setHandler(webAppContext); 

ContextHandlerCollection contexts = new ContextHandlerCollection(); 
contexts.addHandler(webAppContext); 
server.setHandler(contexts); 

ALPN.debug = false; 

server.start(); 
server.join(); 

をコード304は、2回目のリクエスト後にクロムデバッガに表示されます

同じリソースへのhttp/2.0リクエストを行う場合:

https://127.0.0.1:8443/wicket/resource/de.jetty.wicket.http2.example.resources.TestResourceReference/TestResourceReference-ver-1463040221000.css

ステータスコード200は、各要求に示されている - クライアントがそれをキャッシュしないようです。 https://github.com/klopfdreh/jetty-http2-example

よろしくと感謝事前に多く:ここ

はgitのプロジェクトへのリンクです。

+0

HTTPSと1.1で試してください。 –

+0

http/1.1でHTTPSを使用すると、期待どおりに動作しています。 2回目の要求の後に、リソースがキャッシュされ、304がステータスコードとして出力されます。私はSslConnectionFactoryのコンストラクタを変更し、http1.getDefaultProtocolを2番目の引数として渡しました。 – klopfdreh

+0

あなたは 'css'を押すか、ブラウザを使って直接要求していますか? – sbordet

答えて

1

この質問はgithubの問題として議論され、解決されました。

はこちらをご覧:

https://github.com/eclipse/jetty.project/issues/801

関連answeresを取得するには。

概要:

問題がPushBuilder APIについての誤解でした。インデックスページへのリクエストが行われた場合、このページに関するキャッシュ情報を使用して、さらなるリソースがプッシュされるかどうかを判断します。主に、ヘッダ項目「If-Modified-Since」は、さらなるプッシュ操作が必要かどうかを検出するために使用されます。

したがって、アプリケーションはキャッシュについてのロジックを提供する必要があります。

インデックスページの要求の「If-Modified-Since」ヘッダーが、たとえばインデックスページファイルの最終更新日より前であるかどうかを調べるのが最も簡単です。

関連する問題