public static Headers create(String... kv) { Headers headers = create(); if (kv.length % 2 != 0) { throw new IllegalArgumentException("Wrong number of parameters: " + Arrays.toString(kv)); } for (int i = 0; i < kv.length; i = i + 2) { headers.add(kv[i], kv[i + 1]); } return headers; }
public static Headers create(Map<String, String> headers) { return create().addAll(headers); } }
@Override public StompClientConnection ack(String id, String txId, Handler<Frame> receiptHandler) { Objects.requireNonNull(id, "A ACK frame must contain the ACK id"); Objects.requireNonNull(txId); send(new Frame(Frame.Command.ACK, Headers.create(Frame.ID, id, Frame.TRANSACTION, txId), null), receiptHandler); return this; }
static Frame createReceiptFrame(String receiptId, Map<String, String> headers) { Objects.requireNonNull(receiptId); Objects.requireNonNull(headers); return new Frame(Frame.Command.RECEIPT, Headers.create(headers) .add(Frame.RECEIPT_ID, receiptId), null); }
@Override public StompClientConnection nack(String id, String txId, Handler<Frame> receiptHandler) { Objects.requireNonNull(id, "A NACK frame must contain the ACK id"); Objects.requireNonNull(txId); Frame toSend = new Frame(Frame.Command.NACK, Headers.create(Frame.ID, id, Frame.TRANSACTION, txId), null); send(toSend, receiptHandler); return this; }
@Override public StompClientConnection ack(String id, Handler<Frame> receiptHandler) { Objects.requireNonNull(id); send(new Frame(Frame.Command.ACK, Headers.create(Frame.ID, id), null), receiptHandler); return this; }
@Override public StompClientConnection nack(String id, Handler<Frame> receiptHandler) { Objects.requireNonNull(id); send(new Frame(Frame.Command.NACK, Headers.create(Frame.ID, id), null), receiptHandler); return this; }
@Override public synchronized StompClientConnection unsubscribe(String destination, Map<String, String> headers, Handler<Frame> receiptHandler) { Objects.requireNonNull(destination); if (headers == null) { headers = Headers.create(); } String id = headers.containsKey(Frame.ID) ? headers.get(Frame.ID) : destination; headers.put(Frame.ID, id); final Optional<Subscription> maybeSubscription = subscriptions.stream() .filter(s -> s.id.equals(id)).findFirst(); if (maybeSubscription.isPresent()) { final Subscription subscription = maybeSubscription.get(); subscriptions.remove(subscription); send(new Frame(Frame.Command.UNSUBSCRIBE, headers, null), receiptHandler); return this; } else { throw new IllegalArgumentException("No subscription with id " + id); } }
static Frame createErrorFrame(String message, Map<String, String> headers, String body) { Objects.requireNonNull(message); Objects.requireNonNull(headers); Objects.requireNonNull(body); return new Frame(Frame.Command.ERROR, Headers.create(headers) .add(Frame.MESSAGE, message) .add(Frame.CONTENT_LENGTH, Integer.toString(body.length())) .add(Frame.CONTENT_TYPE, "text/plain"), Buffer.buffer(body)); }
@Override public synchronized String subscribe(String destination, Map<String, String> headers, Handler<Frame> handler, Handler<Frame> receiptHandler) { Objects.requireNonNull(destination); Objects.requireNonNull(handler); if (headers == null) { headers = Headers.create(); } String id = headers.getOrDefault(Frame.ID, destination); final Optional<Subscription> maybeSubscription = subscriptions.stream() .filter(s -> s.id.equals(id)).findFirst(); if (maybeSubscription.isPresent()) { throw new IllegalArgumentException("The client is already registered to " + destination); } subscriptions.add(new Subscription(destination, id, handler)); headers.put(Frame.DESTINATION, destination); if (!headers.containsKey(Frame.ID)) { headers.put(Frame.ID, id); } Frame frame = new Frame(Frame.Command.SUBSCRIBE, headers, null); send(frame, receiptHandler); return id; }
static void handleReceipt(Frame frame, StompServerConnection connection) { String receipt = frame.getReceipt(); if (receipt != null) { connection.write(createReceiptFrame(receipt, Headers.create())); } }
@GenIgnore static Frame createInvalidFrameErrorFrame(FrameException exception) { return createErrorFrame("Invalid frame received", Headers.create(), exception.getMessage()); }
public static Frame transform(Frame frame, Subscription subscription, String messageId) { final Headers headers = Headers.create(frame.getHeaders()) // Destination already set in the input headers. .add(Frame.SUBSCRIPTION, subscription.id) .add(Frame.MESSAGE_ID, messageId); if (!subscription.ackMode.equals("auto")) { // We reuse the message Id as ack Id headers.add(Frame.ACK, messageId); } return new Frame(Frame.Command.MESSAGE, headers, frame.getBody()); }
public static Frame transform(Frame frame, Subscription subscription, String messageId) { final Headers headers = Headers.create(frame.getHeaders()) // Destination already set in the input headers. .add(Frame.SUBSCRIPTION, subscription.id) .add(Frame.MESSAGE_ID, messageId); if (!subscription.ackMode.equals("auto")) { // We reuse the message Id as ack Id headers.add(Frame.ACK, messageId); } return new Frame(Frame.Command.MESSAGE, headers, frame.getBody()); }
private void authenticate(Frame frame, StompServerConnection connection, Handler<AsyncResult<Void>> remainingActions) { if (connection.server().options().isSecured()) { String login = frame.getHeader(Frame.LOGIN); String passcode = frame.getHeader(Frame.PASSCODE); connection.handler().onAuthenticationRequest(connection, login, passcode, ar -> { if (ar.result()) { remainingActions.handle(Future.succeededFuture()); } else { connection.write(Frames.createErrorFrame( "Authentication failed", Headers.create( Frame.VERSION, getSupportedVersionsHeaderLine(connection), Frame.CONTENT_TYPE, "text/plain"), "The connection frame does not contain valid credentials.") ); connection.close(); } }); } else { remainingActions.handle(Future.succeededFuture()); } }
@Override public void handle(ServerFrame serverFrame) { Frame frame = serverFrame.frame(); StompServerConnection connection = serverFrame.connection(); String txId = frame.getHeader(Frame.TRANSACTION); if (txId == null) { Frame error = Frames.createErrorFrame("Missing transaction id", Headers.create(), "BEGIN frames " + "must contain the 'transaction' header."); connection.write(error).close(); return; } if (!Transactions.instance().registerTransaction(connection, txId)) { Frame error = Frames.createErrorFrame("Already existing transaction", Headers.create(Frame.TRANSACTION, txId), "A transaction using the same id is still active."); connection.write(error).close(); return; } Frames.handleReceipt(frame, connection); } }
@Override public void handle(ServerFrame sf) { String txId = sf.frame().getHeader(Frame.TRANSACTION); if (txId == null) { Frame error = Frames.createErrorFrame("Missing transaction id", Headers.create(), "ABORT frames " + "must contain the 'transaction' header."); sf.connection().write(error).close(); return; } if (! Transactions.instance().unregisterTransaction(sf.connection(), txId)) { Frame error = Frames.createErrorFrame("Unknown transaction", Headers.create(Frame.TRANSACTION, txId), "The transaction id is unknown."); sf.connection().write(error).close(); return; } Frames.handleReceipt(sf.frame(), sf.connection()); } }
Frames.createErrorFrame( "Invalid unsubscribe", Headers.create(frame.getHeaders()), "The 'id' header must be set")); connection.close(); connection.write(Frames.createErrorFrame( "Invalid unsubscribe", Headers.create(frame.getHeaders()), "No subscription associated with the given 'id'")); connection.close();
private Frame getConnectFrame(String host) { Headers headers = Headers.create(); String accepted = getAcceptedVersions(); if (accepted != null) { headers.put(Frame.ACCEPT_VERSION, accepted); } if (!options.isBypassHostHeader()) { headers.put(Frame.HOST, host); } if (options.getVirtualHost() != null) { headers.put(Frame.HOST, options.getVirtualHost()); } if (options.getLogin() != null) { headers.put(Frame.LOGIN, options.getLogin()); } if (options.getPasscode() != null) { headers.put(Frame.PASSCODE, options.getPasscode()); } headers.put(Frame.HEARTBEAT, Frame.Heartbeat.create(options.getHeartbeat()).toString()); Frame.Command cmd = options.isUseStompFrame() ? Frame.Command.STOMP : Frame.Command.CONNECT; return new Frame(cmd, headers, null); }
private Buffer getConnectFrame(String host) { Headers headers = Headers.create(); String accepted = getAcceptedVersions(); if (accepted != null) { headers.put(Frame.ACCEPT_VERSION, accepted); } if (!options.isBypassHostHeader()) { headers.put(Frame.HOST, host); } if (options.getVirtualHost() != null) { headers.put(Frame.HOST, options.getVirtualHost()); } if (options.getLogin() != null) { headers.put(Frame.LOGIN, options.getLogin()); } if (options.getPasscode() != null) { headers.put(Frame.PASSCODE, options.getPasscode()); } headers.put(Frame.HEARTBEAT, Frame.Heartbeat.create(options.getHeartbeat()).toString()); Frame.Command cmd = options.isUseStompFrame() ? Frame.Command.STOMP : Frame.Command.CONNECT; final Frame frame = new Frame(cmd, headers, null); return frame.toBuffer(); }