/// <summary> /// Unmarshaller the response from the service to the response class. /// </summary> /// <param name="context"></param> /// <returns></returns> public override AmazonWebServiceResponse Unmarshall(JsonUnmarshallerContext context) { PublishResponse response = new PublishResponse(); return response; }
/// <summary> /// Success call constructor. /// </summary> /// <param name="publishResponse">Google PubSub response data.</param> public GoogleCloudPubSubClientResponse(PublishResponse publishResponse) : this() { this.Success = true; this.ErrorMessage = null; this.PublishResponse = publishResponse; }
/// <summary> /// Initializes a new instance of the <see cref="AsyncPublishOperation"/> class. /// </summary> /// <param name="context">The context.</param> /// <param name="request">The request.</param> /// <param name="server">The server.</param> public AsyncPublishOperation( OperationContext context, IEndpointIncomingRequest request, StandardServer server) { m_context = context; m_request = request; m_server = server; m_response = new PublishResponse(); m_request.Calldata = this; }
/// <summary> /// Invokes the Publish service. /// </summary> public IServiceResponse Publish(IServiceRequest incoming) { PublishResponse response = null; PublishRequest request = (PublishRequest)incoming; uint subscriptionId = 0; UInt32Collection availableSequenceNumbers = null; bool moreNotifications = false; NotificationMessage notificationMessage = null; StatusCodeCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; response = new PublishResponse(); response.ResponseHeader = ServerInstance.Publish( request.RequestHeader, request.SubscriptionAcknowledgements, out subscriptionId, out availableSequenceNumbers, out moreNotifications, out notificationMessage, out results, out diagnosticInfos); response.SubscriptionId = subscriptionId; response.AvailableSequenceNumbers = availableSequenceNumbers; response.MoreNotifications = moreNotifications; response.NotificationMessage = notificationMessage; response.Results = results; response.DiagnosticInfos = diagnosticInfos; return response; }
private async Task<IServiceResponse> ReceiveResponseAsync(CancellationToken token = default(CancellationToken)) { await this.receivingSemaphore.WaitAsync(token).ConfigureAwait(false); try { token.ThrowIfCancellationRequested(); this.ThrowIfClosedOrNotOpening(); uint sequenceNumber; uint requestId; int paddingHeaderSize; int plainHeaderSize; int bodySize; int paddingSize; var bodyStream = SerializableBytes.CreateWritableStream(); var bodyDecoder = new BinaryDecoder(bodyStream, this); try { // read chunks int chunkCount = 0; bool isFinal = false; do { chunkCount++; if (this.LocalMaxChunkCount > 0 && chunkCount > this.LocalMaxChunkCount) { throw new ServiceResultException(StatusCodes.BadEncodingLimitsExceeded); } var count = await this.ReceiveAsync(this.receiveBuffer, 0, (int)this.LocalReceiveBufferSize, token).ConfigureAwait(false); if (count == 0) { return null; } var stream = new MemoryStream(this.receiveBuffer, 0, count, true, true); var decoder = new BinaryDecoder(stream, this); try { uint channelId; uint messageType = decoder.ReadUInt32(null); int messageLength = (int)decoder.ReadUInt32(null); Debug.Assert(count == messageLength, "Bytes received not equal to encoded Message length"); switch (messageType) { case UaTcpMessageTypes.MSGF: case UaTcpMessageTypes.MSGC: // header channelId = decoder.ReadUInt32(null); if (channelId != this.ChannelId) { throw new ServiceResultException(StatusCodes.BadTcpSecureChannelUnknown); } // symmetric security header var tokenId = decoder.ReadUInt32(null); // detect new token if (tokenId != this.currentServerTokenId) { this.currentServerTokenId = tokenId; // update with new keys if (this.symIsSigned) { this.symVerifier.Key = this.serverSigningKey; if (this.symIsEncrypted) { this.currentServerEncryptingKey = this.serverEncryptingKey; this.currentServerInitializationVector = this.serverInitializationVector; this.symDecryptor = this.symEncryptionAlgorithm.CreateDecryptor(this.currentServerEncryptingKey, this.currentServerInitializationVector); } } } plainHeaderSize = decoder.Position; // decrypt if (this.symIsEncrypted) { using (var symDecryptor = this.symEncryptionAlgorithm.CreateDecryptor(this.currentServerEncryptingKey, this.currentServerInitializationVector)) { int inputCount = messageLength - plainHeaderSize; Debug.Assert(inputCount % symDecryptor.InputBlockSize == 0, "Input data is not an even number of encryption blocks."); symDecryptor.TransformBlock(this.receiveBuffer, plainHeaderSize, inputCount, this.receiveBuffer, plainHeaderSize); symDecryptor.TransformFinalBlock(this.receiveBuffer, messageLength, 0); } } // verify if (this.symIsSigned) { var datalen = messageLength - this.symSignatureSize; byte[] signature = this.symVerifier.ComputeHash(this.receiveBuffer, 0, datalen); if (!signature.SequenceEqual(this.receiveBuffer.AsArraySegment(datalen, this.symSignatureSize))) { throw new ServiceResultException(StatusCodes.BadSecurityChecksFailed); } } // read sequence header sequenceNumber = decoder.ReadUInt32(null); requestId = decoder.ReadUInt32(null); // body if (this.symIsEncrypted) { if (this.symEncryptionBlockSize > 256) { paddingHeaderSize = 2; paddingSize = BitConverter.ToInt16(this.receiveBuffer, messageLength - this.symSignatureSize - paddingHeaderSize); } else { paddingHeaderSize = 1; paddingSize = this.receiveBuffer[messageLength - this.symSignatureSize - paddingHeaderSize]; } bodySize = messageLength - plainHeaderSize - SequenceHeaderSize - paddingSize - paddingHeaderSize - this.symSignatureSize; } else { bodySize = messageLength - plainHeaderSize - SequenceHeaderSize - this.symSignatureSize; } bodyStream.Write(this.receiveBuffer, plainHeaderSize + SequenceHeaderSize, bodySize); isFinal = messageType == UaTcpMessageTypes.MSGF; break; case UaTcpMessageTypes.OPNF: case UaTcpMessageTypes.OPNC: // header channelId = decoder.ReadUInt32(null); // asymmetric header var securityPolicyUri = decoder.ReadString(null); var serverCertificateByteString = decoder.ReadByteString(null); var clientThumbprint = decoder.ReadByteString(null); plainHeaderSize = decoder.Position; // decrypt if (this.asymIsEncrypted) { byte[] cipherTextBlock = new byte[this.asymLocalCipherTextBlockSize]; int jj = plainHeaderSize; for (int ii = plainHeaderSize; ii < messageLength; ii += this.asymLocalCipherTextBlockSize) { Buffer.BlockCopy(this.receiveBuffer, ii, cipherTextBlock, 0, this.asymLocalCipherTextBlockSize); // decrypt with local private key. byte[] plainTextBlock = this.LocalPrivateKey.Decrypt(cipherTextBlock, this.asymEncryptionPadding); Debug.Assert(plainTextBlock.Length == this.asymLocalPlainTextBlockSize, "Decrypted block length was not as expected."); Buffer.BlockCopy(plainTextBlock, 0, this.receiveBuffer, jj, this.asymLocalPlainTextBlockSize); jj += this.asymLocalPlainTextBlockSize; } messageLength = jj; decoder.Position = plainHeaderSize; } // verify if (this.asymIsSigned) { // verify with remote public key. var datalen = messageLength - this.asymRemoteSignatureSize; if (!this.RemotePublicKey.VerifyData(this.receiveBuffer, 0, datalen, this.receiveBuffer.AsArraySegment(datalen, this.asymRemoteSignatureSize).ToArray(), this.asymSignatureHashAlgorithmName, RSASignaturePadding.Pkcs1)) { throw new ServiceResultException(StatusCodes.BadSecurityChecksFailed); } } // sequence header sequenceNumber = decoder.ReadUInt32(null); requestId = decoder.ReadUInt32(null); // body if (this.asymIsEncrypted) { if (this.asymLocalCipherTextBlockSize > 256) { paddingHeaderSize = 2; paddingSize = BitConverter.ToInt16(this.receiveBuffer, messageLength - this.asymRemoteSignatureSize - paddingHeaderSize); } else { paddingHeaderSize = 1; paddingSize = this.receiveBuffer[messageLength - this.asymRemoteSignatureSize - paddingHeaderSize]; } bodySize = messageLength - plainHeaderSize - SequenceHeaderSize - paddingSize - paddingHeaderSize - this.asymRemoteSignatureSize; } else { bodySize = messageLength - plainHeaderSize - SequenceHeaderSize - this.asymRemoteSignatureSize; } bodyStream.Write(this.receiveBuffer, plainHeaderSize + SequenceHeaderSize, bodySize); isFinal = messageType == UaTcpMessageTypes.OPNF; break; case UaTcpMessageTypes.ERRF: case UaTcpMessageTypes.MSGA: case UaTcpMessageTypes.OPNA: case UaTcpMessageTypes.CLOA: var code = (StatusCode)decoder.ReadUInt32(null); var message = decoder.ReadString(null); throw new ServiceResultException(code, message); default: throw new ServiceResultException(StatusCodes.BadUnknownResponse); } if (this.LocalMaxMessageSize > 0 && bodyStream.Position > this.LocalMaxMessageSize) { throw new ServiceResultException(StatusCodes.BadEncodingLimitsExceeded); } } finally { decoder.Dispose(); } } while (!isFinal); bodyStream.Seek(0L, SeekOrigin.Begin); var nodeId = bodyDecoder.ReadNodeId(null); IServiceResponse response; // fast path if (nodeId == PublishResponseNodeId) { response = new PublishResponse(); } else if (nodeId == ReadResponseNodeId) { response = new ReadResponse(); } else { // find node in dictionary Type type2; if (!BinaryEncodingIdToTypeDictionary.TryGetValue(NodeId.ToExpandedNodeId(nodeId, this.NamespaceUris), out type2)) { throw new ServiceResultException(StatusCodes.BadEncodingError, "NodeId not registered in dictionary."); } // create response response = (IServiceResponse)Activator.CreateInstance(type2); } // set properties from message stream response.Decode(bodyDecoder); return response; } finally { bodyDecoder.Dispose(); } } finally { this.receivingSemaphore.Release(); } }
/// <summary> /// Initializes the message with a service fault. /// </summary> public PublishResponseMessage(ServiceFault ServiceFault) { this.PublishResponse = new PublishResponse(); if (ServiceFault != null) { this.PublishResponse.ResponseHeader = ServiceFault.ResponseHeader; } }
/// <summary> /// Initializes the message with the body. /// </summary> public PublishResponseMessage(PublishResponse PublishResponse) { this.PublishResponse = PublishResponse; }
/// <summary cref="IServiceMessage.CreateResponse" /> public object CreateResponse(IServiceResponse response) { PublishResponse body = response as PublishResponse; if (body == null) { body = new PublishResponse(); body.ResponseHeader = ((ServiceFault)response).ResponseHeader; } return new PublishResponseMessage(body); }