private void sendCloseMessage(CloseReason closeReason) { // 125 is maximum size for the payload of a control message ByteBuffer msg = ByteBuffer.allocate(125); CloseCode closeCode = closeReason.getCloseCode(); // CLOSED_ABNORMALLY should not be put on the wire if (closeCode == CloseCodes.CLOSED_ABNORMALLY) { // PROTOCOL_ERROR is probably better than GOING_AWAY here msg.putShort((short) CloseCodes.PROTOCOL_ERROR.getCode()); } else { msg.putShort((short) closeCode.getCode()); } String reason = closeReason.getReasonPhrase(); if (reason != null && reason.length() > 0) { appendCloseReasonWithTruncation(msg, reason); } msg.flip(); try { wsRemoteEndpoint.startMessageBlock(Constants.OPCODE_CLOSE, msg, true); } catch (IOException ioe) { handleCloseException(ioe, closeCode); } catch (WritePendingException wpe) { handleCloseException(wpe, closeCode); } finally { webSocketContainer.unregisterSession(localEndpoint, this); } }
private void handleCloseException(Exception e, CloseCode closeCode) { // Failed to send close message. Close the socket and let the caller // deal with the Exception if (log.isDebugEnabled()) { log.debug(sm.getString("wsSession.sendCloseFail", id), e); } wsRemoteEndpoint.close(); // Failure to send a close message is not unexpected in the case of // an abnormal closure (usually triggered by a failure to read/write // from/to the client. In this case do not trigger the endpoint's // error handling if (closeCode != CloseCodes.CLOSED_ABNORMALLY) { localEndpoint.onError(this, e); } }
public void sendCloseFrame(CloseCode closeCode) throws IOException { int code = closeCode.getCode(); byte[] codeBytes = new byte[2]; codeBytes[0] = (byte) (code >> 8); codeBytes[1] = (byte) code; write(createFrame(true, 8, codeBytes)); }
public static void awaitOnClose(CloseCode... codes) { Set<CloseCode> set = new HashSet<CloseCode>(); for (CloseCode code : codes) { set.add(code); } awaitOnClose(set); }
public void stopThread() { LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); if (ActivityCompat.checkSelfPermission(EventNotificationService.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(EventNotificationService.this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // TODO: Consider calling // ActivityCompat#requestPermissions // here to request the missing permissions, and then overriding // public void onRequestPermissionsResult(int requestCode, String[] permissions, // int[] grantResults) // to handle the case where the user grants the permission. See the documentation // for ActivityCompat#requestPermissions for more details. Intent errorActivityIntent = new Intent(EventNotificationService.this, ErrorReportActivity.class); errorActivityIntent.putExtra(Constants.ERROR_MESSAGE, "Unable to start the event " + "notification service because the user has not provided permission to " + "use the GPS."); EventNotificationService.this.startActivity(errorActivityIntent); Log.i(TAG,"Unable to start the event notification service because the user has not " + "provided permission to use the GPS."); return; } locationManager.removeUpdates(this); stopThread = true; try { session.close(new CloseReason(new CloseCode() { @Override public int getCode() { return 1000; } }, "The user stopped the reasoning.")); Log.i(TAG, "Session is not null and is going to close from stopThread()."); session = null; } catch (IOException e) { e.printStackTrace(); } }
/** * Sends the given status on the given WebSocket connection and closes the * connection. * * @param session The outbound WebSocket connection to close. * @param guac_status The status to send. */ private void closeConnection(Session session, GuacamoleStatus guac_status) { try { CloseCode code = CloseReason.CloseCodes.getCloseCode(guac_status.getWebSocketCode()); String message = Integer.toString(guac_status.getGuacamoleStatusCode()); session.close(new CloseReason(code, message)); } catch (IOException e) { logger.debug("Unable to close WebSocket connection.", e); } }
private void sendCloseMessage(CloseReason closeReason) { // 125 is maximum size for the payload of a control message ByteBuffer msg = ByteBuffer.allocate(125); CloseCode closeCode = closeReason.getCloseCode(); // CLOSED_ABNORMALLY should not be put on the wire if (closeCode == CloseCodes.CLOSED_ABNORMALLY) { // PROTOCOL_ERROR is probably better than GOING_AWAY here msg.putShort((short) CloseCodes.PROTOCOL_ERROR.getCode()); } else { msg.putShort((short) closeCode.getCode()); } String reason = closeReason.getReasonPhrase(); if (reason != null && reason.length() > 0) { appendCloseReasonWithTruncation(msg, reason); } msg.flip(); try { wsRemoteEndpoint.startMessageBlock( Constants.OPCODE_CLOSE, msg, true); } catch (IOException ioe) { // Failed to send close message. Close the socket and let the caller // deal with the Exception if (log.isDebugEnabled()) { log.debug(sm.getString("wsSession.sendCloseFail"), ioe); } wsRemoteEndpoint.close(); // Failure to send a close message is not unexpected in the case of // an abnormal closure (usually triggered by a failure to read/write // from/to the client. In this case do not trigger the endpoint's // error handling if (closeCode != CloseCodes.CLOSED_ABNORMALLY) { localEndpoint.onError(this, ioe); } } finally { webSocketContainer.unregisterSession(localEndpoint, this); } }
static CloseCode getCloseCode(int code) { if (code > 2999 && code < 5000) { return CloseCodes.getCloseCode(code); } switch (code) { case 1000: return CloseCodes.NORMAL_CLOSURE; case 1001: return CloseCodes.GOING_AWAY; case 1002: return CloseCodes.PROTOCOL_ERROR; case 1003: return CloseCodes.CANNOT_ACCEPT; case 1004: // Should not be used in a close frame // return CloseCodes.RESERVED; return CloseCodes.PROTOCOL_ERROR; case 1005: // Should not be used in a close frame // return CloseCodes.NO_STATUS_CODE; return CloseCodes.PROTOCOL_ERROR; case 1006: // Should not be used in a close frame // return CloseCodes.CLOSED_ABNORMALLY; return CloseCodes.PROTOCOL_ERROR; case 1007: return CloseCodes.NOT_CONSISTENT; case 1008: return CloseCodes.VIOLATED_POLICY; case 1009: return CloseCodes.TOO_BIG; case 1010: return CloseCodes.NO_EXTENSION; case 1011: return CloseCodes.UNEXPECTED_CONDITION; case 1012: // Not in RFC6455 // return CloseCodes.SERVICE_RESTART; return CloseCodes.PROTOCOL_ERROR; case 1013: // Not in RFC6455 // return CloseCodes.TRY_AGAIN_LATER; return CloseCodes.PROTOCOL_ERROR; case 1015: // Should not be used in a close frame // return CloseCodes.TLS_HANDSHAKE_FAILURE; return CloseCodes.PROTOCOL_ERROR; default: return CloseCodes.PROTOCOL_ERROR; } }
public static void awaitOnClose(Set<CloseCode> codes) { awaitLatch(events.onCloseCalled, "onClose not called"); CloseCode received = events.closeReason.getCloseCode(); Assert.assertTrue("Rx: " + received, codes.contains(received)); }
static CloseCode getCloseCode(int code) { if (code > 2999 && code < 5000) { return CloseCodes.NORMAL_CLOSURE; } switch (code) { case 1000: return CloseCodes.NORMAL_CLOSURE; case 1001: return CloseCodes.GOING_AWAY; case 1002: return CloseCodes.PROTOCOL_ERROR; case 1003: return CloseCodes.CANNOT_ACCEPT; case 1004: // Should not be used in a close frame // return CloseCodes.RESERVED; return CloseCodes.PROTOCOL_ERROR; case 1005: // Should not be used in a close frame // return CloseCodes.NO_STATUS_CODE; return CloseCodes.PROTOCOL_ERROR; case 1006: // Should not be used in a close frame // return CloseCodes.CLOSED_ABNORMALLY; return CloseCodes.PROTOCOL_ERROR; case 1007: return CloseCodes.NOT_CONSISTENT; case 1008: return CloseCodes.VIOLATED_POLICY; case 1009: return CloseCodes.TOO_BIG; case 1010: return CloseCodes.NO_EXTENSION; case 1011: return CloseCodes.UNEXPECTED_CONDITION; case 1012: // Not in RFC6455 // return CloseCodes.SERVICE_RESTART; return CloseCodes.PROTOCOL_ERROR; case 1013: // Not in RFC6455 // return CloseCodes.TRY_AGAIN_LATER; return CloseCodes.PROTOCOL_ERROR; case 1015: // Should not be used in a close frame // return CloseCodes.TLS_HANDSHAKE_FAILURE; return CloseCodes.PROTOCOL_ERROR; default: return CloseCodes.PROTOCOL_ERROR; } }