use of org.apache.qpid.server.protocol.v0_10.transport.Header in project qpid-broker-j by apache.
the class Disassembler method method.
private void method(Method method, SegmentType type) {
BBEncoder enc = _encoder.get();
enc.init();
enc.writeUint16(method.getEncodedType());
if (type == SegmentType.COMMAND) {
if (method.isSync()) {
enc.writeUint16(0x0101);
} else {
enc.writeUint16(0x0100);
}
}
method.write(enc);
int methodLimit = enc.position();
byte flags = FIRST_SEG;
boolean payload = method.hasPayload();
if (!payload) {
flags |= LAST_SEG;
}
int headerLimit = -1;
if (payload) {
final Header hdr = method.getHeader();
if (hdr != null) {
if (hdr.getDeliveryProperties() != null) {
enc.writeStruct32(hdr.getDeliveryProperties());
}
if (hdr.getMessageProperties() != null) {
enc.writeStruct32(hdr.getMessageProperties());
}
if (hdr.getNonStandardProperties() != null) {
for (Struct st : hdr.getNonStandardProperties()) {
enc.writeStruct32(st);
}
}
}
headerLimit = enc.position();
}
synchronized (_sendlock) {
ByteBuffer buf = enc.underlyingBuffer();
buf.flip();
ByteBuffer copy = ByteBuffer.allocate(buf.remaining());
copy.put(buf.duplicate());
copy.flip();
final ByteBuffer methodBuf = view(copy, 0, methodLimit);
fragment(flags, type, method, methodBuf);
if (payload) {
QpidByteBuffer qpidByteBuffer = method.getBody();
ByteBuffer body = null;
if (qpidByteBuffer != null) {
body = ByteBuffer.allocate(qpidByteBuffer.remaining());
qpidByteBuffer.copyTo(body);
body.flip();
}
ByteBuffer headerBuf = view(copy, methodLimit, headerLimit);
fragment(body == null ? LAST_SEG : 0x0, SegmentType.HEADER, method, headerBuf);
if (body != null) {
fragment(LAST_SEG, SegmentType.BODY, method, body.duplicate());
}
}
}
}
use of org.apache.qpid.server.protocol.v0_10.transport.Header 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.Header in project qpid-broker-j by apache.
the class Interaction method copyPerformative.
private <T extends Method> T copyPerformative(final T src) {
T dst = (T) Method.create(src.getStructType());
final BBEncoder encoder = new BBEncoder(4096);
encoder.init();
src.write(encoder);
ByteBuffer buffer = encoder.buffer();
final BBDecoder decoder = new BBDecoder();
decoder.init(buffer);
dst.read(decoder);
dst.setChannel(src.getChannel());
if (src.getHeader() != null) {
Header srcHeader = src.getHeader();
MessageProperties dstMessageProperties = null;
DeliveryProperties dstDeliveryProperties = null;
if (srcHeader.getMessageProperties() != null) {
MessageProperties properties = srcHeader.getMessageProperties();
dstMessageProperties = new MessageProperties();
encoder.init();
properties.write(encoder);
decoder.init(encoder.buffer());
dstMessageProperties.read(decoder);
}
if (srcHeader.getDeliveryProperties() != null) {
DeliveryProperties properties = srcHeader.getDeliveryProperties();
dstDeliveryProperties = new DeliveryProperties();
encoder.init();
properties.write(encoder);
decoder.init(encoder.buffer());
dstDeliveryProperties.read(decoder);
}
if (dstMessageProperties != null || dstDeliveryProperties != null) {
dst.setHeader(new Header(dstDeliveryProperties, dstMessageProperties));
}
}
if (src.getBody() != null) {
dst.setBody(src.getBody());
}
return dst;
}
use of org.apache.qpid.server.protocol.v0_10.transport.Header in project qpid-broker-j by apache.
the class ConnectionTest method authenticationBypassAfterSendingStartOk.
@Test
@SpecificationTest(section = "9", description = "open-connection = C:protocol-header S:START C:START-OK *challenge S:TUNE C:TUNE-OK C:OPEN S:OPEN-OK")
public void authenticationBypassAfterSendingStartOk() throws Exception {
InetSocketAddress brokerAddress = getBrokerAdmin().getBrokerAddress(BrokerAdmin.PortType.AMQP);
try (FrameTransport transport = new FrameTransport(brokerAddress).connect()) {
final Interaction interaction = transport.newInteraction();
interaction.negotiateProtocol().consumeResponse().consumeResponse(ConnectionStart.class).connection().startOkMechanism(ConnectionInteraction.SASL_MECHANISM_PLAIN).startOk().consumeResponse(ConnectionSecure.class).connection().tuneOk().connection().open().consumeResponse(ConnectionClose.class, ChannelClosedResponse.class);
}
}
use of org.apache.qpid.server.protocol.v0_10.transport.Header in project qpid-broker-j by apache.
the class ConsumerTarget_0_10 method doSend.
@Override
public void doSend(final MessageInstanceConsumer consumer, final MessageInstance entry, boolean batch) {
ServerMessage serverMsg = entry.getMessage();
MessageTransfer xfr;
DeliveryProperties deliveryProps;
MessageProperties messageProps = null;
MessageTransferMessage msg;
MessageConverter<? super ServerMessage, MessageTransferMessage> converter = null;
if (serverMsg instanceof MessageTransferMessage) {
msg = (MessageTransferMessage) serverMsg;
} else {
converter = (MessageConverter<? super ServerMessage, MessageTransferMessage>) MessageConverterRegistry.getConverter(serverMsg.getClass(), MessageTransferMessage.class);
msg = converter.convert(serverMsg, _session.getAddressSpace());
}
DeliveryProperties origDeliveryProps = msg.getHeader() == null ? null : msg.getHeader().getDeliveryProperties();
messageProps = msg.getHeader() == null ? null : msg.getHeader().getMessageProperties();
deliveryProps = new DeliveryProperties();
if (origDeliveryProps != null) {
if (origDeliveryProps.hasDeliveryMode()) {
deliveryProps.setDeliveryMode(origDeliveryProps.getDeliveryMode());
}
if (origDeliveryProps.hasExchange()) {
deliveryProps.setExchange(origDeliveryProps.getExchange());
}
if (origDeliveryProps.hasExpiration()) {
deliveryProps.setExpiration(origDeliveryProps.getExpiration());
}
if (origDeliveryProps.hasPriority()) {
deliveryProps.setPriority(origDeliveryProps.getPriority());
}
if (origDeliveryProps.hasRoutingKey()) {
deliveryProps.setRoutingKey(origDeliveryProps.getRoutingKey());
}
if (origDeliveryProps.hasTimestamp()) {
deliveryProps.setTimestamp(origDeliveryProps.getTimestamp());
}
if (origDeliveryProps.hasTtl()) {
deliveryProps.setTtl(origDeliveryProps.getTtl());
}
}
deliveryProps.setRedelivered(entry.isRedelivered());
boolean msgCompressed = messageProps != null && GZIPUtils.GZIP_CONTENT_ENCODING.equals(messageProps.getContentEncoding());
QpidByteBuffer bodyBuffer = msg.getBody();
boolean compressionSupported = _session.getConnection().getConnectionDelegate().isCompressionSupported();
if (msgCompressed && !compressionSupported && bodyBuffer != null) {
QpidByteBuffer uncompressedBuffer = inflateIfPossible(bodyBuffer);
messageProps.setContentEncoding(null);
bodyBuffer.dispose();
bodyBuffer = uncompressedBuffer;
} else if (!msgCompressed && compressionSupported && (messageProps == null || messageProps.getContentEncoding() == null) && bodyBuffer != null && bodyBuffer.remaining() > _session.getConnection().getMessageCompressionThreshold()) {
QpidByteBuffer compressedBuffers = deflateIfPossible(bodyBuffer);
if (messageProps == null) {
messageProps = new MessageProperties();
}
messageProps.setContentEncoding(GZIPUtils.GZIP_CONTENT_ENCODING);
bodyBuffer.dispose();
bodyBuffer = compressedBuffers;
}
Header header = new Header(deliveryProps, messageProps, msg.getHeader() == null ? null : msg.getHeader().getNonStandardProperties());
xfr = batch ? new MessageTransfer(_name, _acceptMode, _acquireMode, header, bodyBuffer, BATCHED) : new MessageTransfer(_name, _acceptMode, _acquireMode, header, bodyBuffer);
if (bodyBuffer != null) {
bodyBuffer.dispose();
bodyBuffer = null;
}
if (_acceptMode == MessageAcceptMode.NONE && _acquireMode != MessageAcquireMode.PRE_ACQUIRED) {
xfr.setCompletionListener(new MessageAcceptCompletionListener(this, consumer, _session, entry, _flowMode == MessageFlowMode.WINDOW));
} else if (_flowMode == MessageFlowMode.WINDOW) {
final long messageSize = entry.getMessage().getSize();
xfr.setCompletionListener(new Method.CompletionListener() {
@Override
public void onComplete(Method method) {
deferredAddCredit(1, messageSize);
}
});
}
_postIdSettingAction.setXfr(xfr);
_postIdSettingAction.setAction(null);
if (_acquireMode == MessageAcquireMode.PRE_ACQUIRED) {
entry.incrementDeliveryCount();
}
if (_acceptMode == MessageAcceptMode.EXPLICIT) {
_postIdSettingAction.setAction(new ExplicitAcceptDispositionChangeListener(entry, this, consumer));
} else if (_acquireMode != MessageAcquireMode.PRE_ACQUIRED) {
_postIdSettingAction.setAction(new ImplicitAcceptDispositionChangeListener(entry, this, consumer));
}
_session.sendMessage(xfr, _postIdSettingAction);
xfr.dispose();
if (converter != null) {
converter.dispose(msg);
}
_postIdSettingAction.setAction(null);
_postIdSettingAction.setXfr(null);
if (_acceptMode == MessageAcceptMode.NONE && _acquireMode == MessageAcquireMode.PRE_ACQUIRED) {
forceDequeue(entry, false);
} else if (_acquireMode == MessageAcquireMode.PRE_ACQUIRED) {
addUnacknowledgedMessage(entry);
}
}
Aggregations