7
100 Continue in Heroku LBの祭典 冨田 寿弥 九州大学

100 Continue in Heroku

Embed Size (px)

Citation preview

Page 1: 100 Continue in Heroku

100 Continue in Heroku @LBの祭典

冨田 寿弥

九州大学

Page 2: 100 Continue in Heroku

コメント

LBの祭典ということで

LBについて話したかったんですが

めぼしい情報を見つけれませんでした

そこで皆さんに楽しんでいただけるような

マニアックな話題を用意しました

Page 3: 100 Continue in Heroku

100 Continueって?

Expert: 100-continue ヘッダー

リクエストボディが多い時、サーバがデータを

受け入れ可能かどうかを確認するために、優しいクライアントに使われるヘッダー

100 Continue

413 Request Entity Too Large

ステータスコード

ステータスコード

「受け入れOK!! データを送りな!」

「ごめん、ちょっと無理やわ。」

何のためにあるのか?受け入れ不可なのに、送っちゃうと無駄でしょ?

Page 4: 100 Continue in Heroku

実際のflow図 at Heroku成功時 失敗時

実際(Herokuのdefault)多くのWebサーバはこの仕組みに対応していない

ルータがサーバの代わりに100 Continueを返す

そして、しばらくしてサーバにBodyを送る

を打てば、end2endのメカニズムが有効になる

これが左図

Page 5: 100 Continue in Heroku

マニアックなケーススタディ Expectヘッダーを受け取ることなしでサーバから100 Continueが送られて来た時

100 Continueを返す前にBodyがやって来た!

o サーバは100 Continuを返さない可能性あり。

o ちなみにルータはサーバから送られる100 Continueを確認しなくても、Bodyを送れるこの時はBodyを送るのは少し間をおいてからになる

Expectヘッダが二つ以上の値を含んでいた時

o HTTP1.0かそれより古いクライアントの場合はプロキシかルータがレスポンスを破棄する

o ルータが自動的に417 Expectation Failedを返す

Page 6: 100 Continue in Heroku

マニアックなケーススタディ

クライアントが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ヘッダは通信を終わらせるステータスコードの後にのみ有効

Page 7: 100 Continue in Heroku

その他

ルータは100 Continueステータスコードのレスポンスをクライアントに転送する時にヘッダーを全て剥ぎ取る

100 Continueステータスコードを連続して受け取った場合ルータは5xxエラーを返す

サーバからのターミナルコードを受け取った時、ルータはWebサーバへのコネクションを切断する

100 Continueステータスコードを受け取った後に、サーバからのターミナルコードを受け取った場合クライアントとの通信はキープする

出典 https://httpstatusdogs.com/100-continuehttps://devcenter.heroku.com/articles/http-routing#http-versions-supported