Search in sources :

Example 6 with Frame

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();
    }
}
Also used : ProtocolHeader(org.apache.qpid.server.protocol.v0_10.transport.ProtocolHeader) Header(org.apache.qpid.server.protocol.v0_10.transport.Header) MessageProperties(org.apache.qpid.server.protocol.v0_10.transport.MessageProperties) ArrayList(java.util.ArrayList) Method(org.apache.qpid.server.protocol.v0_10.transport.Method) DeliveryProperties(org.apache.qpid.server.protocol.v0_10.transport.DeliveryProperties) Struct(org.apache.qpid.server.protocol.v0_10.transport.Struct)

Example 7 with Frame

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();
    }
}
Also used : Frame(org.apache.qpid.server.protocol.v0_10.transport.Frame) ProtocolHeader(org.apache.qpid.server.protocol.v0_10.transport.ProtocolHeader)

Example 8 with Frame

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);
    }
}
Also used : ConnectionTune(org.apache.qpid.server.protocol.v0_10.transport.ConnectionTune) ConnectionStart(org.apache.qpid.server.protocol.v0_10.transport.ConnectionStart) Test(org.junit.Test) SpecificationTest(org.apache.qpid.tests.protocol.SpecificationTest) SpecificationTest(org.apache.qpid.tests.protocol.SpecificationTest)

Example 9 with Frame

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);
    }
}
Also used : ConnectionTune(org.apache.qpid.server.protocol.v0_10.transport.ConnectionTune) ConnectionStart(org.apache.qpid.server.protocol.v0_10.transport.ConnectionStart) Test(org.junit.Test) SpecificationTest(org.apache.qpid.tests.protocol.SpecificationTest) SpecificationTest(org.apache.qpid.tests.protocol.SpecificationTest)

Example 10 with Frame

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();
    }
}
Also used : ConnectionTune(org.apache.qpid.server.protocol.v0_10.transport.ConnectionTune) ConnectionStart(org.apache.qpid.server.protocol.v0_10.transport.ConnectionStart) Test(org.junit.Test) SpecificationTest(org.apache.qpid.tests.protocol.SpecificationTest) SpecificationTest(org.apache.qpid.tests.protocol.SpecificationTest)

Aggregations

ProtocolHeader (org.apache.qpid.server.protocol.v0_10.transport.ProtocolHeader)4 ArrayList (java.util.ArrayList)3 ConnectionStart (org.apache.qpid.server.protocol.v0_10.transport.ConnectionStart)3 ConnectionTune (org.apache.qpid.server.protocol.v0_10.transport.ConnectionTune)3 SpecificationTest (org.apache.qpid.tests.protocol.SpecificationTest)3 Test (org.junit.Test)3 QpidByteBuffer (org.apache.qpid.server.bytebuffer.QpidByteBuffer)2 DeliveryProperties (org.apache.qpid.server.protocol.v0_10.transport.DeliveryProperties)2 Frame (org.apache.qpid.server.protocol.v0_10.transport.Frame)2 Header (org.apache.qpid.server.protocol.v0_10.transport.Header)2 MessageProperties (org.apache.qpid.server.protocol.v0_10.transport.MessageProperties)2 Method (org.apache.qpid.server.protocol.v0_10.transport.Method)2 ProtocolError (org.apache.qpid.server.protocol.v0_10.transport.ProtocolError)2 Struct (org.apache.qpid.server.protocol.v0_10.transport.Struct)2 ByteBuffer (java.nio.ByteBuffer)1 BBDecoder (org.apache.qpid.server.protocol.v0_10.transport.BBDecoder)1