use of org.apache.qpid.server.protocol.v0_10.transport.Frame in project qpid-broker-j by apache.
the class ServerAssembler method assemble.
private void assemble(ServerFrame frame, QpidByteBuffer frameBuffer) {
try {
ServerDecoder dec = new ServerDecoder(frameBuffer);
int channel = frame.getChannel();
Method command;
switch(frame.getType()) {
case CONTROL:
int controlType = dec.readUint16();
Method control = Method.create(controlType);
control.read(dec);
emit(channel, control);
break;
case COMMAND:
int commandType = dec.readUint16();
// read in the session header, right now we don't use it
int hdr = dec.readUint16();
command = Method.create(commandType);
command.setSync((0x0001 & hdr) != 0);
command.read(dec);
if (command.hasPayload() && !frame.isLastSegment()) {
setIncompleteCommand(channel, command);
} else {
emit(channel, command);
}
break;
case HEADER:
command = getIncompleteCommand(channel);
List<Struct> structs = null;
DeliveryProperties deliveryProps = null;
MessageProperties messageProps = null;
while (dec.hasRemaining()) {
Struct struct = dec.readStruct32();
if (struct instanceof DeliveryProperties && deliveryProps == null) {
deliveryProps = (DeliveryProperties) struct;
} else if (struct instanceof MessageProperties && messageProps == null) {
messageProps = (MessageProperties) struct;
} else {
if (structs == null) {
structs = new ArrayList<>(2);
}
structs.add(struct);
}
}
command.setHeader(new Header(deliveryProps, messageProps, structs));
if (frame.isLastSegment()) {
setIncompleteCommand(channel, null);
emit(channel, command);
}
break;
case BODY:
command = getIncompleteCommand(channel);
command.setBody(frameBuffer);
setIncompleteCommand(channel, null);
emit(channel, command);
break;
default:
throw new IllegalStateException("unknown frame type: " + frame.getType());
}
} finally {
frameBuffer.dispose();
}
}
use of org.apache.qpid.server.protocol.v0_10.transport.Frame in project qpid-broker-j by apache.
the class FrameDecoder method next.
private State next(int pos) {
input.order(ByteOrder.BIG_ENDIAN);
switch(_state) {
case PROTO_HDR:
if (input.get(pos) != 'A' && input.get(pos + 1) != 'M' && input.get(pos + 2) != 'Q' && input.get(pos + 3) != 'P') {
error("bad protocol header: %s", str(input));
return State.ERROR;
}
byte protoClass = input.get(pos + 4);
byte instance = input.get(pos + 5);
byte major = input.get(pos + 6);
byte minor = input.get(pos + 7);
_assembler.received(new ProtocolHeader(protoClass, instance, major, minor));
_needed = Frame.HEADER_SIZE;
return State.FRAME_HDR;
case FRAME_HDR:
_flags = input.get(pos);
_type = SegmentType.get(input.get(pos + 1));
int size = (0xFFFF & input.getShort(pos + 2));
size -= Frame.HEADER_SIZE;
_maxFrameSize = 64 * 1024;
if (size < 0 || size > (_maxFrameSize - 12)) {
error("bad frame size: %d", size);
return State.ERROR;
}
byte b = input.get(pos + 5);
if ((b & 0xF0) != 0) {
error("non-zero reserved bits in upper nibble of " + "frame header byte 5: '%x'", b);
return State.ERROR;
} else {
_track = (byte) (b & 0xF);
}
_channel = (0xFFFF & input.getShort(pos + 6));
if (size == 0) {
Frame frame = new Frame(_flags, _type, _track, _channel, EMPTY_BYTE_BUFFER);
_assembler.received(frame);
_needed = Frame.HEADER_SIZE;
return State.FRAME_HDR;
} else {
_needed = size;
return State.FRAME_BODY;
}
case FRAME_BODY:
Frame frame = new Frame(_flags, _type, _track, _channel, input.slice());
_assembler.received(frame);
_needed = Frame.HEADER_SIZE;
return State.FRAME_HDR;
default:
throw new IllegalStateException();
}
}
use of org.apache.qpid.server.protocol.v0_10.transport.Frame in project qpid-broker-j by apache.
the class ConnectionTest method tooSmallFrameSize.
@Test
@SpecificationTest(section = "9.connection.tune-ok.minimum", description = "[...] the minimum negotiated value for max-frame-size is also MIN-MAX-FRAME-SIZE [4096]")
public void tooSmallFrameSize() throws Exception {
try (FrameTransport transport = new FrameTransport(_brokerAddress).connect()) {
final Interaction interaction = transport.newInteraction();
ConnectionTune response = interaction.negotiateProtocol().consumeResponse().consumeResponse(ConnectionStart.class).connection().startOkMechanism(ConnectionInteraction.SASL_MECHANISM_ANONYMOUS).startOk().consumeResponse().getLatestResponse(ConnectionTune.class);
interaction.connection().tuneOkChannelMax(response.getChannelMax()).tuneOkMaxFrameSize(1024).tuneOk().connection().open().consumeResponse(ConnectionClose.class, ChannelClosedResponse.class);
}
}
use of org.apache.qpid.server.protocol.v0_10.transport.Frame in project qpid-broker-j by apache.
the class ConnectionTest method tooLargeFrameSize.
@Test
@SpecificationTest(section = "9.connection.tune-ok.max-frame-size", description = "If the client specifies a channel max that is higher than the value provided by the server," + " the server MUST close the connection without attempting a negotiated close." + " The server may report the error in some fashion to assist implementers.")
public void tooLargeFrameSize() throws Exception {
try (FrameTransport transport = new FrameTransport(_brokerAddress).connect()) {
final Interaction interaction = transport.newInteraction();
ConnectionTune response = interaction.negotiateProtocol().consumeResponse().consumeResponse(ConnectionStart.class).connection().startOkMechanism(ConnectionInteraction.SASL_MECHANISM_ANONYMOUS).startOk().consumeResponse().getLatestResponse(ConnectionTune.class);
assumeThat(response.hasMaxFrameSize(), is(true));
assumeThat(response.getMaxFrameSize(), is(lessThan(0xFFFF)));
interaction.connection().tuneOkChannelMax(response.getChannelMax()).tuneOkMaxFrameSize(response.getMaxFrameSize() + 1).tuneOk().connection().open().consumeResponse(ConnectionClose.class, ChannelClosedResponse.class);
}
}
use of org.apache.qpid.server.protocol.v0_10.transport.Frame in project qpid-broker-j by apache.
the class ConnectionTest method heartbeating.
@Test
@SpecificationTest(section = "9.connection", description = "The heartbeat control may be used to generate artificial network traffic when a connection " + "is idle.")
public void heartbeating() throws Exception {
try (FrameTransport transport = new FrameTransport(_brokerAddress).connect()) {
final Interaction interaction = transport.newInteraction();
ConnectionTune response = interaction.negotiateProtocol().consumeResponse().consumeResponse(ConnectionStart.class).connection().startOkMechanism(ConnectionInteraction.SASL_MECHANISM_ANONYMOUS).startOk().consumeResponse().getLatestResponse(ConnectionTune.class);
assumeThat(response.hasHeartbeatMin(), is(true));
assumeThat(response.hasHeartbeatMax(), is(true));
assumeThat(response.getHeartbeatMin(), is(greaterThanOrEqualTo(0)));
assumeThat(response.getHeartbeatMax(), is(greaterThanOrEqualTo(1)));
final int heartbeatPeriod = 1;
interaction.connection().tuneOkChannelMax(response.getChannelMax()).tuneOkMaxFrameSize(response.getMaxFrameSize()).tuneOkHeartbeat(heartbeatPeriod).tuneOk();
final long startTime = System.currentTimeMillis();
interaction.connection().open().consumeResponse(ConnectionOpenOk.class).consumeResponse().getLatestResponse(ConnectionHeartbeat.class);
final long actualHeartbeatDelay = System.currentTimeMillis() - startTime;
// Includes wiggle room to allow for slow boxes.
final int maximumExpectedHeartbeatDelay = heartbeatPeriod * 2 * 2;
assertThat("Heartbeat not received within expected time frame", ((int) actualHeartbeatDelay / 1000), is(both(greaterThanOrEqualTo(heartbeatPeriod)).and(lessThanOrEqualTo(maximumExpectedHeartbeatDelay))));
interaction.connection().heartbeat();
interaction.consumeResponse(ConnectionHeartbeat.class).connection().heartbeat();
}
}
Aggregations