てきとうなメモ

本の感想とか技術メモとか

Reverse HTTP

Reverse HTTPが何やっているのかよくわからなかったのでメモ.

Reverse HTTPって何

これ.

http://www.reversehttp.net/index.html

  • URLを要求してそこにサービスを構築できる
  • アプリケーション開発者はhttp requestを処理してhttp responseを返すCGIのようなコードを書くだけ
  • httpクライアントの仕組みを用いてhttpサーバを実装している

目的は?

  • webサービスを簡単に作って簡単に配置しようということかな
  • 制限された環境でもwebサービスを実行可能
    • ブラウザ内JavaScriptでサービスを実行
    • global ipなしで実行可能
      • webhookを利用したい人はprivate ipしかもっていないマシンからGateway Service経由でサービスを公開できるので簡単とか.

仕組み

以下のようにGateway Serviceがサーバ-クライアントを仲介する構成になっている.

Original Requestor    Gateway Service        Application "foo"
        |                      |                      |
        |                      |<---- GET ------------|
        |                      |                      |
        |----- GET /foo/a ---->|                      |
        |                      |----- 200 ----------->|
        |                      |      "GET /a"        |
        |                      |                      |
        |                      |<---- POST -----------|
        |                      |      "404"           |
        |                      |                      |
        |<---- 404 ------------|----- 202 ----------->|
        |                      |                      |
  1. Application "foo"はGeteway Serviceにhttp requestを投げる.
  2. Gataway ServiceはApplication "foo"にすぐにhttp responseを返さずに,Original Requestorからrequestが来るかタイムアウトするまで待つ
  3. Gateway ServiceはOriginal Requestorからrequestが来ると,そのhttp requestをラップしたhttp responseをApplication "foo"に返す
  4. Application "foo"はOriginal Requestorからのhttp requestを処理しhttp responseを返す
    1. Gateway Serviceからのhttp responseからOriginal Requestorのhttp requestを取り出す.(ライブラリが行う)
    2. "foo"の本来の処理を行う.(この部分のコードをアプリ開発者が書く)
    3. Application "foo"は処理結果のhttp responseをラップしたhttp requestをGeteway ServiceにPOSTする.(ライブラリが行う)
  5. Gateway ServiceはApplication "foo"からのhttp requestからhttp responseを取り出してOriginal Requestorに返す
  6. Gateway ServiceはApplication "foo"に202のhttp responseを返して,ちゃんと中継したことを知らせる.

ライブラリ

Erlangで書かれたサーバ(Gateway Service)とJavaScript,Python,Javaで書かれたクライアント(Applicationを補助するライブラリ).

デモ

以下のデモが何をしているのか最初はよくわからなかったので解説.

このリンクを開くと,さらにhttp://demoXXXXX.www.reversehttp.net/(XXXXXは数値)へのリンクがある.これを開くとdemo.htmlのテキストエリアに書かれたHTMLが描画される.demo.htmlのテキストエリアを編集した後にdemoXXXXを更新するとその変更が反映される.

これはdemo.html上のJavaScriptがdemoXXXXX上のデータを更新しているとかそういうわけではなく,demo.html上でJavaScriptでHTTPサーバ起動しており,demoXXXXXへのアクセスをwww.revereshttp.netが仲介し,JavaScriptのHTTPサーバが実際の処理を行っている.demo.html上のJavaScriptなのでそのテキストエリアにもアクセスできるということ.

具体的には以下のようなシーケンスが実行されているみたい.

  1. demo.htmlを開くとdemo.htmlに書かれたJavaScriptが実行される.このコードはHTTPサーバを起動する.
  2. Gateway Service(www.reversehttp.net)にdemoXXXXXというラベルに対応するURLを要求する
  3. GatewayはURLを返すので,そのURLをGETする
  4. GatewayタイムアウトするまでHTTPサーバからのリクエストを保持する.タイムアウトした場合はHTTPサーバはGETを繰り返す
  5. ユーザがdemoXXXXXのURLを更新する
  6. GatewayはdemoXXXXXへのhttp requestをhttp responseにラップしてHTTPサーバに返す
  7. HTTPサーバはhttp responseからユーザのhttp requestを取り出す.
  8. HTTPサーバはhttp requestを処理する
    • ここではテキストエリアをそのままhttp responseとして返すのみ
  9. HTTPサーバは処理結果のhttp responseをhttp requestにラップしてGatewayにPOST
  10. GatewayはHTTPサーバのhttp requestからhttp responseを取り出してユーザに返す.これでテキストエリアのHTMLが描画される.