BLOGブログ

2015.08.25UE4UE/ Network

[UE4] HTTP通信 その2 ~HTTPモジュールの構成~

こんにちは。ほげたつ(@HogeTatu)です。

 

前回に引き続き、HTTP通信の中身を見ていきたいと思います。

今回はプログラマ向けの内容となります。

また、UE4のバージョンは 4.8.3 を想定しています。

 

HTTP通信に関係するコードは主に Engine/Source/Runtime/Online/Http に展開されています。

また、プラットフォームネイティブな処理が多いため、Engine/Source/Runtime/Core/Public にも宣言のみが存在します。

ひとまず、いくつかピックアップして内部を見ていこうと思います。

 

HttpModule

Engine/Source/Runtime/Online/HTTP/Public/HttpModule.h

Engine/Source/Runtime/Online/HTTP/Private/HttpModule.cpp

HTTPモジュールの管理者です。

新規リクエストの作成や、エンジンのコンフィグからタイムアウト等の設定を受け取って反映させる役割を担っています。

 

IHttpBase

Engine/Source/Runtime/Online/HTTP/Public/Interfaces/IHttpBase.h

リクエスト/レスポンス共通で取得できるパラメータ用のインターフェースを定義しています。

主な機能は以下の通りです。

 

  • URLの取得
  • URLパラメータの取得
  • ヘッダー情報の取得
  • コンテンツ情報の取得

 

IHttpRequest

Engine/Source/Runtime/Online/HTTP/Public/Interfaces/IHttpRequest.h

サーバーへの通信リクエストで使用できるパラメータ用のインターフェースを定義しています。

主な機能は以下の通りです。

 

  • URLの設定
  • Verb(GET、POST等のリクエストタイプ)の設定/取得
  • リクエスト内容(コンテンツ情報)の設定
  • ヘッダー情報の設定
  • リクエスト開始
  • リクエストキャンセル
  • 経過イベント、完了時イベントの登録

 

リクエストのインスタンス生成に関する詳細は GenericPlatformHttp の項で説明します。

 

IHttpResponse

Engine/Source/Runtime/Online/HTTP/Public/Interfaces/IHttpResponse.h

サーバーからの通信レスポンスで使用できるパラメータ用のインターフェースを定義しています。

主な機能は以下の通りです。

 

 

GenericPlatformHttp

Engine/Source/Runtime/Core/Public/GenericPlatform/GenericPlatformHttp.h

Engine/Source/Runtime/Core/Private/GenericPlatform/GenericPlatformHttp.cpp

各プラットフォーム用の静的な処理を記述するためのベースクラスです。

 

静的なので継承してもポリモーフィズムが適応される訳ではありませんが、

共通で処理できるものを記述するために定義されています。

 

FHttpModule::CreateRequest() した時には内部で FPlatformHttp::ConstructRequest() して

各プラットフォーム用のリクエストインスタンスを生成しています。

FPlatformHttp は各プラットフォーム用の FGenericPlatformHttp クラスを継承したもの(Windows なら FWindowsPlatformHttp)の typedef 定義です。

そのため、各プラットフォーム用のリクエストインスタンスを生成する場合は、

Windows なら FWindowsPlatformHttp::ConstructRequest() が実際には呼ばれ、

FCurlHttpRequest 型のリクエストインスタンスが生成されるという流れとなります。

 

ちなみに FCurlHttpRequest の中では curl という、

クロスプラットフォームでHTTP通信を使用するためのライブラリが使われています。

以下、wikipedia からの引用です。

 

libcurlはフリーであり、スレッドセーフであり、IPv6 コンパチブルである。機能は多く動作は速い。ソフトウェアプログラマはlibcurlを彼らのプログラムに組み込むことができる。40以上のプログラミング言語でlibcurlのためのバインディングが提供されている。

 

HttpManager

Engine/Source/Runtime/Online/HTTP/Public/HttpManager.h

Engine/Source/Runtime/Online/HTTP/Private/HttpManager.cpp

複数のリクエストを管理するために存在します。

IHttpRequest インスタンスがあれば通信リクエスト自体は可能ですが、

管理者がいる事で様々な機能が使えるようになっています。

 

  • リクエストの有効判定
  • 管理されているリクエストの一括更新(Tick実行)機能
  • 管理されているリクエスト全てをダンプする機能
  • リクエストインスタンスの遅延破棄

 

また、通信リクエストは非同期で行われるため、並列処理に対するロック対応を行う必要がありますが、

HttpManager では CriticalSection に対応しているので問題ありません。

 

個人的には Shutdown みたいな全リクエスト一括キャンセル機能も有用だと思うので、

そういった機能を追加する際には HttpManager に追記してあげると良さそうですね。

 

終わりに

まだまだ試していない機能(HttpRetrySystem 等)はありますが、

これで大体のHTTP通信に関する機能は網羅できたかと思います。

HTTP通信に関する実装を行うとき、何か問題が起こって調査する時にご活用下さい。