react / react/react-native

WebSocket.ping() on Android sends an empty binary frame instead of a protocol-level PING

Ouverte Adaptée aux débutants
#57,840 3 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Needs: Author Feedback Needs: Repro Platform: Android
Langage dominant
C++
Étoiles
127k
Forks
25.3k
Merge moyen
1 j 23 h
PR mergées (30 j)
4

Description

Description

WebSocket.ping() on Android sends an empty binary data frame (opcode 0x2) via OkHttp's
client.send(ByteString.EMPTY), instead of a real RFC 6455 PING control frame (opcode 0x9). On iOS,
ping() correctly sends a protocol-level ping via SocketRocket's sendPing:error:.

This breaks against WebSocket servers that reject binary frames (e.g. AWS API Gateway WebSocket APIs),
which close the connection with code 1003 UNSUPPORTED_DATA instead of responding with a pong.

The incorrect ping() that sends the empty frame is still present on the latest version (v0.86.2) of RN here: https://github.com/react/react-native/blob/v0.86.2/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/modules/websocket/WebSocketModule.kt#L327

    try {
      client.send(ByteString.EMPTY)
    } catch (e: Exception) {
      notifyWebSocketFailed(id, e.message)
    }
Steps to reproduce
  1. Connect a WebSocket to a server that rejects binary frames (e.g. AWS API Gateway WS API).
  2. Call webSocket.ping() on Android.
  3. Observe the connection closes with 1003 UNSUPPORTED_DATA instead of receiving a pong.
React Native Version

0.86.2

Affected Platforms

Runtime - Android

Output of npx @react-native-community/cli info
System:
  OS: macOS 26.5.2
  CPU: (12) arm64 Apple M4 Pro
  Memory: 106.66 MB / 24.00 GB
  Shell:
    version: "5.9"
    path: /opt/homebrew/bin/zsh
Binaries:
  Node:
    version: 23.10.0
    path: /opt/homebrew/bin/node
  Yarn:
    version: 1.22.19
    path: /opt/homebrew/bin/yarn
  npm:
    version: 10.9.2
    path: /opt/homebrew/bin/npm
  Watchman:
    version: 2025.05.19.00
    path: /opt/homebrew/bin/watchman
Managers:
  CocoaPods: Not Found
SDKs:
  iOS SDK:
    Platforms:
      - DriverKit 25.2
      - iOS 26.2
      - macOS 26.2
      - tvOS 26.2
      - visionOS 26.2
      - watchOS 26.2
  Android SDK: Not Found
IDEs:
  Android Studio: 2024.2 AI-242.23726.103.2422.12816248
  Xcode:
    version: 26.2/17C52
    path: /usr/bin/xcodebuild
Languages:
  Java:
    version: 17.0.14
    path: /Users/inging/.jenv/shims/javac
  Ruby: Not Found
npmPackages:
  "@react-native-community/cli": Not Found
  react: Not Found
  react-native: Not Found
  react-native-macos: Not Found
npmGlobalPackages:
  "*react-native*": Not Found
Android:
  hermesEnabled: Not found
  newArchEnabled: Not found
iOS:
  hermesEnabled: Not found
  newArchEnabled: Not found
Stacktrace or Logs
Logs from mitmproxy with a custom interceptor script:


<IP_REDACTED>:44604 -> WebSocket binary message -> <WSS_HOST_REDACTED>:443/
Error in WebSocket connection to <WSS_HOST_REDACTED>:443: WebSocket Error: UNSUPPORTED_DATA (reason: Binary is not supported)
MANDATORY Reproducer

https://gist.github.com/dekpient/4b611eb4efb58ecc1a881942f842a595

Screenshots and Videos

No response

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez dans ReactAndroid/src/main/java/com/facebook/react/modules/websocket/WebSocketModule.kt autour de la ligne 327 et comparez le chemin Android avec SocketRocket sendPing:error: d’iOS. Utilisez le reproducteur obligatoire contre un serveur qui rejette les frames binaires ; c’est terminé lorsque Android émet un PING RFC 6455 (opcode 0x9) et ne se ferme plus avec 1003 UNSUPPORTED_DATA.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
android, kotlin
Domaine
mobile, networking
Type d'issue
Bug
Difficulté
2/5
Temps estimé
1-3 heures
Activité
Active
Clarté
Clairement spécifiée
Accessibilité débutants
78/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.