8. Error Handling (エラーハンドリング)
8.1 Handling Errors in UTF-8-Encoded Data (UTF-8エンコードデータのエラー処理)
Textフレーム(Opcode 0x1)を受信する場合、ペイロードデータは有効なUTF-8エンコードテキストでなければなりません。
UTF-8の検証
実装は、受信したテキストデータが有効なUTF-8であることを検証しなければなりません (MUST)。
function isValidUTF8(buffer) {
try {
// Node.jsは無効なUTF-8でエラーをスロー
const str = buffer.toString('utf8');
// ラウンドトリップ変換を検証
return Buffer.from(str, 'utf8').equals(buffer);
} catch (e) {
return false;
}
}
ws.on('message', (data, isBinary) => {
if (!isBinary && !isValidUTF8(data)) {
// クローズコード1007 = 無効なフレームペイロードデータ
ws.close(1007, 'Invalid UTF-8 in text frame');
}
});
エラー処理フロー
無効なUTF-8が検出された場合:
- メッセージの処理を停止
- ステータスコード1007でCloseフレームを送信
- 接続をクローズ
その他の一般的なエラー
プロトコル違反
| エラータイプ | クローズコード | 処理方法 |
|---|---|---|
| マスクされていないクライアントフレームを受信 | 1002 | 直ちに接続をクローズ |
| マスクされたサーバーフレームを受信 | 1002 | 直ちに接続をクローズ |
| 無効なOpcode | 1002 | 直ちに接続をクローズ |
| フラグメント化された制御フレーム | 1002 | 直ちに接続をクローズ |
| 125バイトを超える制御フレーム | 1002 | 直ちに接続をクローズ |
| 無効なUTF-8 | 1007 | Closeフレームを送信後クローズ |
| メッセージが大きすぎる | 1009 | Closeフレームを送信後クローズ |
エラーハンドリングのベストプラクティス
ws.on('error', (error) => {
console.error('WebSocketエラー:', error);
// エラーをログに記録
// 監視システムに通知
});
ws.on('close', (code, reason) => {
if (code !== 1000 && code !== 1001) {
console.error(`異常クローズ: ${code} - ${reason}`);
// 再接続ロジックを実装
setTimeout(() => reconnect(), 5000);
}
});