예제 #1
0
        public void ReadMessageReturnsNullOnEndOfStream()
        {
            Assert.IsNull(AMFMessageReader.ReadAMFMessage(input));

            // Doing it a second time shouldn't hurt.
            Assert.IsNull(AMFMessageReader.ReadAMFMessage(input));
        }
예제 #2
0
        public void ReadMessageWrapsErrorsWithAMFException()
        {
            SetStreamContents(new byte[] { 0 }); // an incomplete message!

            // Should encounter an EndOfStreamException and wrap it with an AMFException.
            AMFMessageReader.ReadAMFMessage(input);
        }
예제 #3
0
        public void ReadMessageWithMultipleHeadersAndBodies()
        {
            SetStreamContents(new byte[] {
                0x12, 0x34,                                                                                                             // version
                0x00, 0x02,                                                                                                             // header count
                0x00, 0x03, 0x61, 0x62, 0x63, 0x01, 0xff, 0xff, 0xff, 0xff, 0x02, 0x00, 0x03, 0x31, 0x32, 0x33,                         // header abc
                0x00, 0x03, 0x64, 0x65, 0x66, 0x00, 0xff, 0xff, 0xff, 0xff, 0x05,                                                       // header def
                0x00, 0x02,                                                                                                             // body count
                0x00, 0x02, 0x74, 0x6f, 0x00, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0xff, 0xff, 0xff, 0xff, 0x02, 0x00, 0x03, 0x31, 0x32, 0x33, // first body
                0x00, 0x02, 0x74, 0x6f, 0x00, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0xff, 0xff, 0xff, 0xff, 0x05                                // second body
            });

            AMFMessage message = AMFMessageReader.ReadAMFMessage(input);

            Assert.AreEqual(0x1234, message.Version);

            Assert.AreEqual(2, message.Headers.Count);
            Assert.AreEqual("abc", message.Headers[0].Name);
            Assert.AreEqual(true, message.Headers[0].MustUnderstand);
            Assert.AreEqual(new ASString("123"), message.Headers[0].Content);
            Assert.AreEqual("def", message.Headers[1].Name);
            Assert.AreEqual(false, message.Headers[1].MustUnderstand);
            Assert.AreEqual(null, message.Headers[1].Content);

            Assert.AreEqual(2, message.Bodies.Count);
            Assert.AreEqual("to", message.Bodies[0].RequestTarget);
            Assert.AreEqual("from", message.Bodies[0].ResponseTarget);
            Assert.AreEqual(new ASString("123"), message.Bodies[0].Content);
            Assert.AreEqual("to", message.Bodies[1].RequestTarget);
            Assert.AreEqual("from", message.Bodies[1].ResponseTarget);
            Assert.AreEqual(null, message.Bodies[1].Content);
        }
예제 #4
0
            protected override IEnumerable <Step> GetSteps()
            {
                // Set properties from context.
                context.Request.IsSecureConnection = context.HttpContext.Request.IsSecureConnection;

                // Read the AMF message and prepare the response context.
                AMFDataInput dataInput         = new AMFDataInput(context.HttpContext.Request.InputStream, context.Serializer);
                AMFMessage   amfRequestMessage = AMFMessageReader.ReadAMFMessage(dataInput);

                context.Request.SetMessage(amfRequestMessage);
                context.Response.PrepareResponseMessage(amfRequestMessage);

                // Process all message bodies.
                foreach (AMFBody requestBody in amfRequestMessage.Bodies)
                {
                    object nativeContent;
                    try
                    {
                        nativeContent = context.Serializer.ToNative(requestBody.Content, null);
                    }
                    catch (Exception ex)
                    {
                        context.Response.AddErrorResponse(requestBody.ResponseTarget,
                                                          "An error occurred while deserializing the request body.", ex);
                        continue;
                    }

                    if (requestBody.RequestTarget == "null")
                    {
                        IMessage requestMessage = nativeContent as IMessage;
                        if (requestMessage == null)
                        {
                            object[] array = nativeContent as object[];
                            if (array != null)
                            {
                                requestMessage = array[0] as IMessage;
                            }

                            if (requestMessage != null)
                            {
                                IAsyncResult result;
                                try
                                {
                                    result = messageBroker.BeginProcessRequest(context, requestMessage, OnAsyncResultCallbackResume, null);
                                }
                                catch (Exception ex)
                                {
                                    ErrorMessage errorMessage = ErrorMessage.CreateErrorResponse(requestMessage,
                                                                                                 "An error occurred while the message broker was processing the message.",
                                                                                                 "Gateway.MessageBroker.BeginProcessRequestFailed",
                                                                                                 ex);

                                    context.Response.AddErrorResponse(requestBody.ResponseTarget, errorMessage);
                                    continue;
                                }

                                yield return(new Step("Waiting for message broker."));

                                try
                                {
                                    IMessage responseMessage = messageBroker.EndProcessRequest(result);
                                    context.Response.AddResultResponse(requestBody.ResponseTarget, responseMessage);
                                }
                                catch (Exception ex)
                                {
                                    ErrorMessage errorMessage = ErrorMessage.CreateErrorResponse(requestMessage,
                                                                                                 "An error occurred while the message broker was processing the message.",
                                                                                                 "Gateway.MessageBroker.EndProcessRequestFailed",
                                                                                                 ex);

                                    context.Response.AddErrorResponse(requestBody.ResponseTarget, errorMessage);
                                }

                                continue;
                            }
                        }
                    }

                    // Don't know what to do with this message.
                    context.Response.AddErrorResponse(requestBody.ResponseTarget,
                                                      String.Format(CultureInfo.CurrentCulture,
                                                                    "Received a message for unsupported request target '{0}'.", requestBody.RequestTarget), null);
                }

                // Generate the response.
                AMFDataOutput dataOutput = new AMFDataOutput(context.HttpContext.Response.OutputStream, context.Serializer);

                AMFMessageWriter.WriteAMFMessage(dataOutput, context.Response.Message);

                context.HttpContext.Response.ContentType = AMFContentType;
                context.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
                yield break;
            }