Upload
kazuya-tomita
View
936
Download
0
Embed Size (px)
Citation preview
100 Continue in Heroku @LBの祭典
冨田 寿弥
九州大学
コメント
LBの祭典ということで
LBについて話したかったんですが
めぼしい情報を見つけれませんでした
そこで皆さんに楽しんでいただけるような
マニアックな話題を用意しました
100 Continueって?
Expert: 100-continue ヘッダー
リクエストボディが多い時、サーバがデータを
受け入れ可能かどうかを確認するために、優しいクライアントに使われるヘッダー
100 Continue
413 Request Entity Too Large
ステータスコード
ステータスコード
「受け入れOK!! データを送りな!」
「ごめん、ちょっと無理やわ。」
何のためにあるのか?受け入れ不可なのに、送っちゃうと無駄でしょ?
実際のflow図 at Heroku成功時 失敗時
実際(Herokuのdefault)多くのWebサーバはこの仕組みに対応していない
ルータがサーバの代わりに100 Continueを返す
そして、しばらくしてサーバにBodyを送る
を打てば、end2endのメカニズムが有効になる
これが左図
マニアックなケーススタディ Expectヘッダーを受け取ることなしでサーバから100 Continueが送られて来た時
100 Continueを返す前にBodyがやって来た!
o サーバは100 Continuを返さない可能性あり。
o ちなみにルータはサーバから送られる100 Continueを確認しなくても、Bodyを送れるこの時はBodyを送るのは少し間をおいてからになる
Expectヘッダが二つ以上の値を含んでいた時
o HTTP1.0かそれより古いクライアントの場合はプロキシかルータがレスポンスを破棄する
o ルータが自動的に417 Expectation Failedを返す
マニアックなケーススタディ
クライアントがWebSocketへのUpgradeヘッダと
Expect:100-continueヘッダの両方を送って来た時
サーバが100 Continueステータスコードと
Connection: closeヘッダの両方を含むレスポンスを返した時
o Webサーバへとそのまま送られ、ルータはどちらに対するレスポンスでも受け取る
o 100 ContinueステータスコードはWebSocketへのUpgradeヘッダを無視する可能性あり
o 101 Switching ProtocolはExpectヘッダを無視する
なお、ルータは100 Continueの後に101 Switching Protocolを待つ
o 100 Continueを優先
o Connection:closeヘッダは通信を終わらせるステータスコードの後にのみ有効
その他
ルータは100 Continueステータスコードのレスポンスをクライアントに転送する時にヘッダーを全て剥ぎ取る
100 Continueステータスコードを連続して受け取った場合ルータは5xxエラーを返す
サーバからのターミナルコードを受け取った時、ルータはWebサーバへのコネクションを切断する
100 Continueステータスコードを受け取った後に、サーバからのターミナルコードを受け取った場合クライアントとの通信はキープする
出典 https://httpstatusdogs.com/100-continuehttps://devcenter.heroku.com/articles/http-routing#http-versions-supported