ProxyManで通信を意図的にtimeoutさせる方法

スポンサーリンク

導入:timeout検証、ちゃんとやってますか?

Androidアプリで通信処理を書いていると、
だいたいこんな要求が来ます。

「通信がタイムアウトしたときの挙動を確認したいです」
「回線が悪いときでも落ちませんか?」

ただ、実機で自然にtimeoutを起こすのって、
正直かなり難しいですよね。

そこで使えるのが ProxyMan です。

この記事では、ProxyManで通信を意図的にtimeoutさせる方法を、
実務でそのまま使えるレベルまで掘り下げます。

先に結論です。

  • ProxyManなら通信遅延・無応答を人工的に作れる
  • BreakpointとScriptingが鍵
  • timeout検証は「必ず」やるべき

なぜtimeout検証が重要なのか

普段の開発では、
通信が正常に返ってくる前提でコードを書きがちです。

しかし実際のユーザー環境では、

  • 地下鉄
  • 電波の弱い場所
  • バックグラウンド制限

などで、通信が返らないケースが普通に起きます。

timeout時の挙動を未検証のままリリースすると、
以下のような事故が起きがちです。

  • ローディングが永遠に消えない
  • リトライが無限ループ
  • UIが固まる

ProxyManでできること(timeout観点)

ProxyManは単なる通信閲覧ツールではありません。

  • 通信を途中で止める
  • レスポンスを遅延させる
  • レスポンスを返さない

これらを使うことで、
ほぼ確実にtimeoutを再現できます。

前提:ProxyManで通信が見えている状態

この記事では、以下が完了している前提で進めます。

  • Android端末がProxyMan経由で通信している
  • HTTPS通信が復号できている

ここができていない場合、
まずは通常のWebView / API通信確認から行ってください。

方法① Breakpointで通信を止める(最も簡単)

一番手軽なのが、この方法です。

ProxyManで、
特定のリクエストにBreakpointを設定します。

手順

  • 対象リクエストを右クリック
  • Enable Breakpoint
  • そのまま何もしない

これだけで、
通信はサーバーに届かず、レスポンスも返りません。

結果、Android側では
timeout待ち状態になります。

向いている用途

  • readTimeoutの検証
  • UIの待機状態確認

方法② Responseを遅延させる

「完全に止める」のではなく、
遅い通信を再現したい場合はこちらです。

Delay機能を使う

ProxyManのResponse設定で、
人工的にDelayを入れます。

  • Delay: 10s / 20s / 30s

これで、

  • ギリギリtimeoutしない
  • ちょうどtimeoutする

といった境界条件を検証できます。

方法③ Scriptで完全に制御する(上級)

ProxyManのScript機能を使うと、
意図的にレスポンスを返さないことも可能です。


async function onResponse(context, response) {
  // 何も返さず待ち続ける
  await new Promise(() => {});
}

これを使うと、
確実にtimeoutが発生します。

Android側で確認すべきポイント

OkHttpのtimeout設定


OkHttpClient.Builder()
    .connectTimeout(10, TimeUnit.SECONDS)
    .readTimeout(10, TimeUnit.SECONDS)
    .writeTimeout(10, TimeUnit.SECONDS)
    .build()

どのtimeoutが効いているかを、
ProxyManでの操作と合わせて確認します。

エラーの拾い方

timeout時は、

  • IOException
  • SocketTimeoutException

になることが多いです。

よくあるハマりポイント

① timeoutまで待っていない

意外と多いです。
ちゃんと秒数を計ってください。

② UIスレッドで待っている

通信待ち中にUIスレッドを止めると、
timeout以前に固まります。

③ retry処理が邪魔をする

自動リトライが入っていると、
timeoutしたように見えません。

実務での使いどころ

  • 通信失敗時のUI確認
  • リトライ仕様の検証
  • エラーメッセージ表示確認

セキュリティ・運用上の注意

  • debugビルド限定で行う
  • Proxy設定は検証後に戻す
  • スクリプトは必ず無効化

よくある質問

Q. エミュレータでも再現できる?

できますが、実機の方が安定します。

Q. WebView通信も同じ?

同じです。ProxyManから見ると区別はありません。

まとめ

  • ProxyManでtimeoutは簡単に作れる
  • Breakpointが最速
  • timeout検証は必須作業

迷ったら:通信を止めてみる。
それが一番確実です。

コメント

タイトルとURLをコピーしました