<!--

Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements.  See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License.  You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

-->
<amf-request>
    <message>
        <version>3</version>

        <headers count="1">
            <header name="DUMMY_HEADER" mustUnderstand="false">
                <string>NOTHING</string>
            </header>
        </headers>

        <bodies count="3">

            <!-- Messaging Body -->
            <body targetUri="" responseUri="/1" length="-1">
                <array count="1">
                    <avmplus>
                        <object>
                            <traits classname="flex.messaging.messages.RemotingMessage" count="5" dynamic="false">
                                <property name="headers"/>
                                <property name="messageId"/>
                                <property name="destination"/>
                                <property name="operation"/>
                                <property name="body"/>
                            </traits>
                            <!-- headers -->
                            <object>
                                <traits classname="" count="0" dynamic="true"/>
                                <property name="principalName">
                                    <string>sampleuser</string>
                                </property>
                                <property name="credentials">
                                    <string>samplepassword</string>
                                </property>
                            </object>
                            <!-- messageId -->
                            <integer>1</integer>
                            <!-- destination -->
                            <string>testing</string>
                            <!-- operation -->
                            <string>echoObject</string>
                            <!-- body -->
                            <string>Hello World</string>
                        </object>
                    </avmplus>
                </array>
            </body>

            <!-- Legacy Simple Body -->
            <body targetUri="testing.echoObject" responseUri="/2" length="-1">
                <array count="1">
                    <string>Hello World</string>
                </array>
            </body>

            <!-- Legacy Envelope Body -->
            <body targetUri="testing.echoObject" responseUri="/3" length="-1">
                <array count="1">
                    <object>
                        <property name="_flag">
                            <string>Envelope</string>
                        </property>
                        <property name="headers">
                            <array count="0" />
                        </property>
                        <property name="body">
                            <string>Hello World</string>
                        </property>
                    </object>
                </array>
            </body>

        </bodies>
    </message>
</amf-request>
