public void ReadMessageReturnsNullOnEndOfStream() { Assert.IsNull(AMFMessageReader.ReadAMFMessage(input)); // Doing it a second time shouldn't hurt. Assert.IsNull(AMFMessageReader.ReadAMFMessage(input)); }
public void ReadMessageWrapsErrorsWithAMFException() { SetStreamContents(new byte[] { 0 }); // an incomplete message! // Should encounter an EndOfStreamException and wrap it with an AMFException. AMFMessageReader.ReadAMFMessage(input); }
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); }
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; }