void OnProtocolHeader(ByteBuffer buffer) { ProtocolHeader header = new ProtocolHeader(); header.Decode(buffer); AmqpTrace.Provider.AmqpLogOperationInformational(this, TraceOperation.Receive, header); // Protocol id negotiation TransportProvider provider = null; if (!this.parent.settings.TryGetTransportProvider(header, out provider)) { Fx.Assert(provider != null, "At least on provider should be configured."); this.WriteReplyHeader(new ProtocolHeader(provider.ProtocolId, provider.DefaultVersion), true); return; } // Protocol version negotiation AmqpVersion version; if (!provider.TryGetVersion(header.Version, out version)) { this.WriteReplyHeader(new ProtocolHeader(provider.ProtocolId, version), true); return; } TransportBase newTransport = provider.CreateTransport(this.args.Transport, false); if (object.ReferenceEquals(newTransport, this.args.Transport)) { if ((this.parent.settings.RequireSecureTransport && !newTransport.IsSecure) || (!this.parent.settings.AllowAnonymousConnection && !newTransport.IsAuthenticated)) { AmqpTrace.Provider.AmqpInsecureTransport(this.parent, newTransport, newTransport.IsSecure, newTransport.IsAuthenticated); this.WriteReplyHeader(this.parent.settings.GetDefaultHeader(), true); } else { this.args.UserToken = header; this.parent.OnHandleTransportComplete(this.args); } } else { #if DEBUG header.Trace(false); #endif AmqpTrace.Provider.AmqpUpgradeTransport(this, args.Transport, newTransport); this.args.Transport = newTransport; this.WriteReplyHeader(header, false); } }
void WriteSecurityHeader(TransportAsyncCallbackArgs args) { // secure transport: header negotiation TransportProvider provider = this.settings.TransportProviders[this.providerIndex]; this.sentHeader = new ProtocolHeader(provider.ProtocolId, provider.DefaultVersion); #if DEBUG this.sentHeader.Trace(true); AmqpTrace.Provider.AmqpLogOperationVerbose(this, TraceOperation.Send, this.sentHeader); #endif ByteBuffer buffer = new ByteBuffer(new byte[AmqpConstants.ProtocolHeaderSize]); this.sentHeader.Encode(buffer); args.SetBuffer(buffer.Buffer, buffer.Offset, buffer.Length); args.CompletedCallback = this.OnWriteHeaderComplete; this.writer.WriteBuffer(args); }
void OnConnectComplete(TransportAsyncCallbackArgs args) { if (args.Exception != null) { this.Complete(args); return; } TransportProvider provider = this.settings.TransportProviders[this.providerIndex]; if (provider.ProtocolId == ProtocolId.Amqp) { this.Complete(args); return; } this.writer = new AsyncIO.AsyncBufferWriter(args.Transport); this.reader = new AsyncIO.AsyncBufferReader(args.Transport); this.WriteSecurityHeader(args); }