public void WriteMessageWrapsErrorsWithAMFException() { // Deliberately inject an exception. // This should be caught and wrapped by the AMFMessageWriter code. IASValue mockValue = Mocks.CreateMock <IASValue>(); mockValue.AcceptVisitor(serializer, null); LastCall.IgnoreArguments().Throw(new Exception("Something bad happened.")); Mocks.ReplayAll(); AMFMessage message = new AMFMessage(); message.Version = 0x1234; message.Headers.Add(new AMFHeader("abc", true, mockValue)); AMFMessageWriter.WriteAMFMessage(output, message); }
public void WriteMessageWithMultipleHeadersAndBodies() { AMFMessage message = new AMFMessage(); message.Version = 0x1234; message.Headers.Add(new AMFHeader("abc", true, new ASString("123"))); message.Headers.Add(new AMFHeader("def", false, null)); message.Bodies.Add(new AMFBody("to", "from", new ASString("123"))); message.Bodies.Add(new AMFBody("to", "from", null)); AMFMessageWriter.WriteAMFMessage(output, message); CollectionAssert.AreElementsEqual(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 }, stream.ToArray()); }
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; }