Ejemplo n.º 1
0
        public override void Invoke(AMFContext context)
        {
            AMFDeserializer deserializer = new AMFDeserializer(context.InputStream);

            deserializer.UseLegacyCollection = _useLegacyCollection;
            try
            {
                AMFMessage amfMessage = deserializer.ReadAMFMessage();
                context.AMFMessage    = amfMessage;
                context.MessageOutput = new MessageOutput(amfMessage.Version);
                if (deserializer.FailedAMFBodies.Length > 0)
                {
                    AMFBody[] failedAMFBodies = deserializer.FailedAMFBodies;
                    //Write out failed AMFBodies
                    for (int i = 0; i < failedAMFBodies.Length; i++)
                    {
                        context.MessageOutput.AddBody(failedAMFBodies[i]);
                    }
                }
            }
            catch
            {
                Dump(context.InputStream);
                throw;
            }
        }
Ejemplo n.º 2
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);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// 发送基于x-amf3的http请求
        /// </summary>
        /// <param name="requestUrl">请求url</param>
        /// <param name="amfMessage">amf3的报文体</param>
        /// <param name="cookieContainer">请求的cookie</param>
        public static WebResponse Amf3RequestHelper(string requestUrl, AMFMessage amfMessage, CookieContainer cookieContainer = null)
        {
            HttpWebRequest req = (HttpWebRequest)WebRequest.Create(requestUrl);

            req.Method          = "POST";
            req.ContentType     = "application/x-amf";
            req.UserAgent       = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36";
            req.CookieContainer = cookieContainer;
            req.LoadConfig(requestUrl);
            using (Stream stream = req.GetRequestStream())
            {
                using (AMFSerializer AMFSerializer = new AMFSerializer(stream))
                {
                    AMFSerializer.WriteMessage(amfMessage);
                }
            }
            try
            {
                return(req.GetResponse());
            }
            catch (WebException ex)
            {
                if (ex.Message.Contains("502"))
                {
                    Console.WriteLine("连接远程服务器时发生错误!", ex);
                    throw new Exception("地址:" + requestUrl + "连接失败,(ERROR:-1)");
                }
                throw ex;
            }
        }
Ejemplo n.º 4
0
        public void Call<T>(string command, Responder<T> responder, params object[] arguments)
        {
            try
            {
                TypeHelper._Init();

                Uri uri = new Uri(_gatewayUrl);
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
                request.ContentType = ContentType.AMF;
                request.Method = "POST";
            #if !(SILVERLIGHT)
                request.CookieContainer = _netConnection.CookieContainer;
            #endif
                AMFMessage amfMessage = new AMFMessage((ushort)_netConnection.ObjectEncoding);
                AMFBody amfBody = new AMFBody(command, responder.GetHashCode().ToString(), arguments);
                amfMessage.AddBody(amfBody);
                foreach (KeyValuePair<string, AMFHeader> entry in _netConnection.Headers)
                {
                    amfMessage.AddHeader(entry.Value);
                }
                AmfRequestData amfRequestData = new AmfRequestData(request, amfMessage, null, null, responder);
                request.BeginGetRequestStream(BeginRequestFlashCall, amfRequestData);
            }
            catch (Exception ex)
            {
                _netConnection.RaiseNetStatus(ex);
            }
        }
Ejemplo n.º 5
0
 public RequestData(HttpWebRequest request, AMFMessage amfMessage, PendingCall call, IPendingServiceCallback callback)
 {
     this._call       = call;
     this._request    = request;
     this._amfMessage = amfMessage;
     this._callback   = callback;
 }
Ejemplo n.º 6
0
 /// <summary>
 /// This method supports the Fluorine infrastructure and is not intended to be used directly from your code.
 /// </summary>
 /// <param name="amfMessage"></param>
 public void WriteMessage(AMFMessage amfMessage)
 {
     try {
         WriteShort(amfMessage.Version);
         var headerCount = amfMessage.HeaderCount;
         WriteShort(headerCount);
         for (var i = 0; i < headerCount; i++) {
             WriteHeader(amfMessage.GetHeaderAt(i), ObjectEncoding.AMF0);
         }
         var bodyCount = amfMessage.BodyCount;
         WriteShort(bodyCount);
         for (var i = 0; i < bodyCount; i++) {
             var responseBody = amfMessage.GetBodyAt(i) as ResponseBody;
             if (responseBody != null && !responseBody.IgnoreResults) {
                 responseBody.WriteBody(amfMessage.ObjectEncoding, this);
             } else {
                 var amfBody = amfMessage.GetBodyAt(i);
                 ValidationUtils.ObjectNotNull(amfBody, "amfBody");
                 amfBody.WriteBody(amfMessage.ObjectEncoding, this);
             }
         }
     } catch (Exception exception) {
         if (Log.IsFatalEnabled)
             Log.Fatal(String.Format(Resources.Amf_SerializationFail), exception);
         throw;
     }
 }
Ejemplo n.º 7
0
 public void Call(string command, IPendingServiceCallback callback, params object[] arguments)
 {
     try
     {
         TypeHelper._Init();
         Uri            requestUri = new Uri(this._gatewayUrl);
         HttpWebRequest request    = (HttpWebRequest)WebRequest.Create(requestUri);
         request.ContentType     = "application/x-amf";
         request.Method          = "POST";
         request.CookieContainer = this._netConnection.CookieContainer;
         AMFMessage amfMessage = new AMFMessage((ushort)this._netConnection.ObjectEncoding);
         AMFBody    body       = new AMFBody(command, callback.GetHashCode().ToString(), arguments);
         amfMessage.AddBody(body);
         foreach (KeyValuePair <string, AMFHeader> pair in this._netConnection.Headers)
         {
             amfMessage.AddHeader(pair.Value);
         }
         PendingCall call  = new PendingCall(command, arguments);
         RequestData state = new RequestData(request, amfMessage, call, callback);
         request.BeginGetRequestStream(new AsyncCallback(this.BeginRequestFlashCall), state);
     }
     catch (Exception exception)
     {
         this._netConnection.RaiseNetStatus(exception);
     }
 }
Ejemplo n.º 8
0
            /// <summary>
            /// One of the two main entry points into the encoder. Called by WCF to write a message of less than a specified size to a byte array buffer at the specified offset.
            /// </summary>
            /// <param name="message">The <see cref="T:System.ServiceModel.Channels.Message"/> to write to the message buffer.</param>
            /// <param name="maxMessageSize">The maximum message size that can be written.</param>
            /// <param name="bufferManager">The <see cref="T:System.ServiceModel.Channels.BufferManager"/> that manages the buffer to which the message is written.</param>
            /// <param name="messageOffset">The offset of the segment that begins from the start of the byte array that provides the buffer.</param>
            /// <returns>
            /// A <see cref="T:System.ArraySegment`1"/> of type byte that provides the buffer to which the message is serialized.
            /// </returns>
            public override ArraySegment <byte> WriteMessage(Message message, int maxMessageSize, BufferManager bufferManager, int messageOffset)
            {
                MemoryStream  memoryStream = new MemoryStream();
                AMFMessage    amfMessage   = message.Properties["amf"] as AMFMessage;
                AMFSerializer serializer   = new AMFSerializer(memoryStream);

                serializer.WriteMessage(amfMessage);
                serializer.Flush();
                // To avoid a buffer copy, we grab a reference to the stream's internal buffer.
                // The byte[] we receive may contain extra nulls after the actual data, due to the
                // buffer management mechanisms of the MemoryStream. Thus, to obtain the message's
                // length, we need to examine memoryStream.Position rather than messageBytes.Length.
                byte[] messageBytes  = memoryStream.GetBuffer();
                int    messageLength = (int)memoryStream.Position;

                memoryStream.Close();

                int totalLength = messageLength + messageOffset;

                byte[] finalBuffer = bufferManager.TakeBuffer(totalLength);
                Array.Copy(messageBytes, 0, finalBuffer, messageOffset, messageLength);

                ArraySegment <byte> byteArray = new ArraySegment <byte>(finalBuffer, messageOffset, messageLength);

                return(byteArray);
            }
Ejemplo n.º 9
0
        public void SpecialConstructorInitializesProperties()
        {
            AMFMessage message = new AMFMessage(123, new AMFHeader[] { new AMFHeader() }, new AMFBody[] { new AMFBody() });

            Assert.AreEqual(123, message.Version);
            Assert.AreEqual(1, message.Bodies.Count);
            Assert.AreEqual(1, message.Headers.Count);
        }
Ejemplo n.º 10
0
 public AmfRequestData(HttpWebRequest request, AMFMessage amfMessage, PendingCall call, IPendingServiceCallback callback, object responder)
 {
     _call = call;
     _responder = responder;
     _request = request;
     _amfMessage = amfMessage;
     _callback = callback;
 }
Ejemplo n.º 11
0
        public override void Invoke(AMFContext context)
        {
            AMFMessage aMFMessage = context.AMFMessage;

            if (aMFMessage.GetHeader("DescribeService") != null)
            {
                aMFMessage.GetBodyAt(0).IsDescribeService = true;
            }
        }
Ejemplo n.º 12
0
            /// <summary>
            /// One of the two main entry points into the encoder. Called by WCF to decode a buffered byte array into a message.
            /// </summary>
            /// <param name="buffer">A <see cref="T:System.ArraySegment`1"/> of type <see cref="T:System.Byte"/> that provides the buffer from which the message is deserialized.</param>
            /// <param name="bufferManager">The <see cref="T:System.ServiceModel.Channels.BufferManager"/> that manages the buffer from which the message is deserialized.</param>
            /// <param name="contentType">The Multipurpose Internet Mail Extensions (MIME) message-level content-type.</param>
            /// <returns>
            /// The <see cref="T:System.ServiceModel.Channels.Message"/> that is read from the stream specified.
            /// </returns>
            public override Message ReadMessage(ArraySegment <byte> buffer, BufferManager bufferManager, string contentType)
            {
                MemoryStream    memoryStream    = new MemoryStream(buffer.Array, buffer.Offset, buffer.Count - buffer.Offset);
                AMFDeserializer amfDeserializer = new AMFDeserializer(memoryStream);
                AMFMessage      amfMessage      = amfDeserializer.ReadAMFMessage();
                Message         returnMessage   = Message.CreateMessage(MessageVersion.None, null);

                returnMessage.Properties.Add("amf", amfMessage);
                return(returnMessage);
            }
Ejemplo n.º 13
0
        public override void Invoke(AMFContext context)
        {
            AMFMessage amfMessage = context.AMFMessage;
            AMFHeader  amfHeader  = amfMessage.GetHeader(AMFHeader.ServiceBrowserHeader);

            if (amfHeader != null)
            {
                AMFBody amfBody = amfMessage.GetBodyAt(0);
                amfBody.IsDescribeService = true;
            }
        }
Ejemplo n.º 14
0
        public override void Invoke(AMFContext context)
        {
            AMFMessage amfMessage = context.AMFMessage;
            AMFHeader  amfHeader  = amfMessage.GetHeader(AMFHeader.DebugHeader);

            if (amfHeader != null)
            {
                //The value of the header
                ASObject asObject = amfHeader.Content as ASObject;
                //["error"]: {true}
                //["trace"]: {true}
                //["httpheaders"]: {false}
                //["coldfusion"]: {true}
                //["amf"]: {false}
                //["m_debug"]: {true}
                //["amfheaders"]: {false}
                //["recordset"]: {true}

                AMFBody      amfBody    = amfMessage.GetBodyAt(amfMessage.BodyCount - 1);      //last body
                ResponseBody amfBodyOut = new ResponseBody();
                amfBodyOut.Target   = amfBody.Response + AMFBody.OnDebugEvents;
                amfBodyOut.Response = null;
                amfBodyOut.IsDebug  = true;

                ArrayList headerResults = new ArrayList();
                ArrayList result        = new ArrayList();
                headerResults.Add(result);


                if ((bool)asObject["httpheaders"] == true)
                {
                    //If the client wants http headers
                    result.Add(new HttpHeader( ));
                }
                if ((bool)asObject["amfheaders"] == true)
                {
                    result.Add(new AMFRequestHeaders(amfMessage));
                }

                ArrayList traceStack = NetDebug.GetTraceStack();
                if ((bool)asObject["trace"] == true && traceStack != null && traceStack.Count > 0)
                {
                    ArrayList tmp = new ArrayList(traceStack);
                    result.Add(new TraceHeader(tmp));
                    NetDebug.Clear();
                }

                //http://osflash.org/amf/envelopes/remoting/debuginfo

                amfBodyOut.Content = headerResults;
                context.MessageOutput.AddBody(amfBodyOut);
            }
            NetDebug.Clear();
        }
Ejemplo n.º 15
0
        /// <summary>
        /// 序列化
        /// </summary>
        /// <param name="uncodedMessage"></param>
        /// <returns></returns>
        public byte[] GetAmfBinaryMessageAsBinary(string uncodedMessage)
        {
            AMFMessage message = JsonConvert.DeserializeObject <AMFMessage>(uncodedMessage, new AMFMessageConverter());

//             AMFMessage message = JsonConvert.DeserializeObject<AMFMessage>(uncodedMessage,new JsonSerializerSettings()
//             {
//                 MissingMemberHandling = MissingMemberHandling.Error
//             });
            byte[] bytes = this.LoadAmfMessageIntoBinMessage(message);
            return(bytes);
        }
Ejemplo n.º 16
0
		public AMFRequestHeaders(AMFMessage amfMessage)
		{
			this["EventType"] = "AmfHeaders";
			Hashtable hashtable = new Hashtable();
			for(int i = 0; i < amfMessage.HeaderCount; i++)
			{
				AMFHeader amfHeader = amfMessage.GetHeaderAt(i);
				if( amfHeader != null && amfHeader.Name != null )
					hashtable[amfHeader.Name] = amfHeader.Content;
			}
			this["AmfHeaders"] = hashtable;
		}
            //One of the two main entry points into the encoder. Called by WCF to encode a Message into a buffered byte array.
            public override ArraySegment <byte> WriteMessage(Message message, int maxMessageSize, BufferManager bufferManager, int messageOffset)
            {
                MemoryStream  memoryStream = new MemoryStream();
                AMFMessage    amfMessage   = message.Properties["amf"] as AMFMessage;
                AMFSerializer serializer   = new AMFSerializer(memoryStream);

                serializer.WriteMessage(amfMessage);
                serializer.Flush();
                byte[] buffer = memoryStream.ToArray();
                ArraySegment <byte> byteArray = new ArraySegment <byte>(buffer);

                return(byteArray);
            }
Ejemplo n.º 18
0
        public byte[] LoadAmfMessageIntoBinMessage(AMFMessage message)
        {
            byte[] buffer = null;
            MemoryStream stream = new MemoryStream();

            AMFSerializer amfSerializers = new AMFSerializer(stream);
            amfSerializers.WriteMessage(message);
            amfSerializers.Flush();
            buffer = new byte[amfSerializers.BaseStream.Length];
            stream.Position = 0;
            stream.Read(buffer, 0, buffer.Length);

            return buffer;
        }
Ejemplo n.º 19
0
        /// <summary>
        /// Сериализует объект в буффер AMF.
        /// </summary>
        /// <param name="sourceObject">Исходный объект.</param>
        /// <param name="version">Версия AMF.</param>
        /// <returns></returns>
        public static byte[] SerializeToAmf(this object sourceObject, ushort version)
        {
            using (MemoryStream memoryStream = new MemoryStream())                                           // Открываем поток для записи данных в буфер.
                using (AMFSerializer amfSerializer = new AMFSerializer(memoryStream))                        // Инициализируем сериализатор для AMF.
                {
                    AMFMessage amfMessage = new AMFMessage(version);                                         // Создаём сообщение для передачи серверу с заданным номером версии AMF.
                    AMFBody    amfBody    = new AMFBody(AMFBody.OnResult, null, GenerateType(sourceObject)); // Создаём тело для сообщения AMF.

                    amfMessage.AddBody(amfBody);                                                             // Добавляем body для сообщения AMF.
                    amfSerializer.WriteMessage(amfMessage);                                                  // Сериализуем сообщение.

                    return(memoryStream.ToArray());                                                          // Преобразовывает поток памяти в буфер и возвращает.
                }
        }
Ejemplo n.º 20
0
 public void Call(string endpoint, string destination, string source, string operation, IPendingServiceCallback callback, params object[] arguments)
 {
     if (this._netConnection.ObjectEncoding == ObjectEncoding.AMF0)
     {
         throw new NotSupportedException("AMF0 not supported for Flex RPC");
     }
     try
     {
         TypeHelper._Init();
         Uri            requestUri = new Uri(this._gatewayUrl);
         HttpWebRequest request    = (HttpWebRequest)WebRequest.Create(requestUri);
         request.ContentType     = "application/x-amf";
         request.Method          = "POST";
         request.CookieContainer = this._netConnection.CookieContainer;
         AMFMessage      amfMessage = new AMFMessage((ushort)this._netConnection.ObjectEncoding);
         RemotingMessage message2   = new RemotingMessage {
             clientId    = Guid.NewGuid().ToString("D"),
             destination = destination,
             messageId   = Guid.NewGuid().ToString("D"),
             timestamp   = 0L,
             timeToLive  = 0L
         };
         message2.SetHeader("DSEndpoint", endpoint);
         if (this._netConnection.ClientId == null)
         {
             message2.SetHeader("DSId", "nil");
         }
         else
         {
             message2.SetHeader("DSId", this._netConnection.ClientId);
         }
         message2.source    = source;
         message2.operation = operation;
         message2.body      = arguments;
         foreach (KeyValuePair <string, AMFHeader> pair in this._netConnection.Headers)
         {
             amfMessage.AddHeader(pair.Value);
         }
         AMFBody body = new AMFBody(null, null, new object[] { message2 });
         amfMessage.AddBody(body);
         PendingCall call  = new PendingCall(source, operation, arguments);
         RequestData state = new RequestData(request, amfMessage, call, callback);
         request.BeginGetRequestStream(new AsyncCallback(this.BeginRequestFlexCall), state);
     }
     catch (Exception exception)
     {
         this._netConnection.RaiseNetStatus(exception);
     }
 }
Ejemplo n.º 21
0
        private AMFMessage ReadMessage(JsonReader reader, Type objectType, object existingValue,
                                       JsonSerializer serializer)
        {
            if (reader.TokenType != JsonToken.StartObject)
            {
                throw new JsonReaderException("AMFMessage must be a JSON Object");
            }

            AMFMessage message = new AMFMessage();

            for (reader.Read(); reader.TokenType != JsonToken.EndObject; reader.Read())
            {
                if (reader.TokenType != JsonToken.PropertyName)
                {
                    throw new JsonReaderException("JSON format error, JSON Object must have property");
                }

                string propertyName = (string)reader.Value;
                switch (propertyName)
                {
                case "Version":
                    reader.Read();
                    if (reader.TokenType != JsonToken.Integer)
                    {
                        throw new JsonReaderException("AMFMessage 'Version' must be JSON Number");
                    }
                    message = new AMFMessage(Convert.ToUInt16(reader.Value));
                    break;

                case "Bodies":
                    reader.Read();
                    if (reader.TokenType != JsonToken.StartArray)
                    {
                        throw new JsonReaderException("AMFMessage 'Bodies' must be JSON Array");
                    }
                    for (reader.Read(); reader.TokenType != JsonToken.EndArray; reader.Read())
                    {
                        AMFBody body = serializer.Deserialize <AMFBody>(reader);
                        message.AddBody(body);
                    }
                    break;

                default:
                    throw new NotSupportedException("AMFMessage dont support property " + propertyName + ", please report this");
                    break;
                }
            }
            return(message);
        }
Ejemplo n.º 22
0
        public AMFRequestHeaders(AMFMessage amfMessage)
        {
            this["EventType"] = "AmfHeaders";
            Hashtable hashtable = new Hashtable();

            for (int i = 0; i < amfMessage.HeaderCount; i++)
            {
                AMFHeader headerAt = amfMessage.GetHeaderAt(i);
                if ((headerAt != null) && (headerAt.Name != null))
                {
                    hashtable[headerAt.Name] = headerAt.Content;
                }
            }
            this["AmfHeaders"] = hashtable;
        }
Ejemplo n.º 23
0
        public AMFRequestHeaders(AMFMessage amfMessage)
        {
            this["EventType"] = "AmfHeaders";
            Hashtable hashtable = new Hashtable();

            for (int i = 0; i < amfMessage.HeaderCount; i++)
            {
                AMFHeader amfHeader = amfMessage.GetHeaderAt(i);
                if (amfHeader != null && amfHeader.Name != null)
                {
                    hashtable[amfHeader.Name] = amfHeader.Content;
                }
            }
            this["AmfHeaders"] = hashtable;
        }
Ejemplo n.º 24
0
        public byte[] LoadAmfMessageIntoBinMessage(AMFMessage message)
        {
            byte[]       buffer = null;
            MemoryStream stream = new MemoryStream();

            AMFSerializer amfSerializers = new AMFSerializer(stream);

            amfSerializers.WriteMessage(message);
            amfSerializers.Flush();
            buffer          = new byte[amfSerializers.BaseStream.Length];
            stream.Position = 0;
            stream.Read(buffer, 0, buffer.Length);

            return(buffer);
        }
Ejemplo n.º 25
0
        public void Call(string endpoint, string destination, string source, string operation, IPendingServiceCallback callback, params object[] arguments)
        {
            if (_netConnection.ObjectEncoding == ObjectEncoding.AMF0)
            {
                throw new NotSupportedException("AMF0 not supported for Flex RPC");
            }
            try
            {
                TypeHelper._Init();

                Uri            uri     = new Uri(_gatewayUrl);
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
                request.ContentType = ContentType.AMF;
                request.Method      = "POST";
#if !(SILVERLIGHT)
                request.CookieContainer = _netConnection.CookieContainer;
#endif
                AMFMessage amfMessage = new AMFMessage((ushort)_netConnection.ObjectEncoding);

                RemotingMessage remotingMessage = new RemotingMessage();
                remotingMessage.clientId    = Guid.NewGuid().ToString("D");
                remotingMessage.destination = destination;
                remotingMessage.messageId   = Guid.NewGuid().ToString("D");
                remotingMessage.timestamp   = 0;
                remotingMessage.timeToLive  = 0;
                remotingMessage.SetHeader(MessageBase.EndpointHeader, endpoint);
                remotingMessage.SetHeader(MessageBase.FlexClientIdHeader, _netConnection.ClientId ?? "nil");
                //Service stuff
                remotingMessage.source    = source;
                remotingMessage.operation = operation;
                remotingMessage.body      = arguments;

                foreach (KeyValuePair <string, AMFHeader> entry in _netConnection.Headers)
                {
                    amfMessage.AddHeader(entry.Value);
                }
                AMFBody amfBody = new AMFBody(null, null, new object[] { remotingMessage });
                amfMessage.AddBody(amfBody);

                PendingCall    call           = new PendingCall(source, operation, arguments);
                AmfRequestData amfRequestData = new AmfRequestData(request, amfMessage, call, callback, null);
                request.BeginGetRequestStream(BeginRequestFlexCall, amfRequestData);
            }
            catch (Exception ex)
            {
                _netConnection.RaiseNetStatus(ex);
            }
        }
Ejemplo n.º 26
0
        public void CanGetAndSetProperties()
        {
            AMFMessage message = new AMFMessage();

            Assert.AreEqual(0, message.Version);
            message.Version = 123;
            Assert.AreEqual(123, message.Version);

            Assert.AreEqual(0, message.Bodies.Count);
            message.Bodies.Add(new AMFBody());
            Assert.AreEqual(1, message.Bodies.Count);

            Assert.AreEqual(0, message.Headers.Count);
            message.Headers.Add(new AMFHeader());
            Assert.AreEqual(1, message.Headers.Count);
        }
Ejemplo n.º 27
0
        private void parse(string amf, string name)
        {
            byte[] bbb = StrToToHexByte(amf);

            AMFDeserializer ad      = new AMFDeserializer(new MemoryStream(bbb));
            AMFMessage      message = ad.ReadAMFMessage();

            string json = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(message);

            //Write that JSON to txt file
            File.WriteAllText(@"z:\temp\hotel\" + name + @".json", json);

            foreach (var body in message.Bodies)
            {
                object[]        content = body.Content as object[];
                RemotingMessage rm      = content[0] as RemotingMessage;

                rm.messageId = Guid.NewGuid().ToString("D");

                object[] bodys = rm.body as object[];
                ASObject ab    = bodys[2] as ASObject;

                ASObject masterBase = ab["masterBase"] as ASObject;
                masterBase["dep"]        = DateTime.Now;
                masterBase["arr"]        = DateTime.Now;
                masterBase["rsvMan"]     = "马一一";
                masterBase["cutoffDate"] = DateTime.Now;

                ASObject masterGuest = ab["masterGuest"] as ASObject;
                masterGuest["name"]  = "马一一";
                masterGuest["name2"] = "Ma Yi Yi";
                masterGuest["sex"]   = "1";

                ArrayCollection rsvSrcList = ab["rsvSrcList"] as ArrayCollection;
                ASObject        rsvObject  = rsvSrcList[0] as ASObject;
                rsvObject["arrDate"]    = DateTime.Now;
                rsvObject["depDate"]    = DateTime.Now;
                rsvObject["rsvArrDate"] = DateTime.Now;
                rsvObject["rsvDepDate"] = DateTime.Now;
                rsvObject["negoRate"]   = 268;
                rsvObject["oldRate"]    = 268;
                rsvObject["realRate"]   = 268;
                rsvObject["rackRate"]   = 268;
            }
        }
Ejemplo n.º 28
0
        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);
        }
Ejemplo n.º 29
0
        /// <summary>
        /// 获取当前的村委会清单
        /// </summary>
        /// <param name="cookie"></param>
        /// <param name="responseNo"></param>
        /// <returns></returns>
        public DataSet GetSysCommittee(string cookie, string responseNo)
        {
            DataSet dtUploadSetRow = new DataSet();

            ManagerBase mb = new ManagerBase(SendType.Query);

            byte[] byteSend = GetNode(responseNo);

            string sendHeader = CommonExtensions.GetSendHeader(cookie, byteSend.Length).ToString();

            mb.SendMessage(cookie, byteSend, sendHeader);

            AMFDeserializer ad          = new AMFDeserializer(new MemoryStream(mb.socketReceiveData));
            AMFMessage      timeMessage = ad.ReadAMFMessage();

            mb.socketReceiveData = null;

            if (timeMessage.BodyCount == 0 || timeMessage.Bodies.FirstOrDefault().Content is FluorineFx.Messaging.Messages.ErrorMessage)
            {
                CommonExtensions.WriteLog("不存在");

                return(dtUploadSetRow);
            }

            var content = (AcknowledgeMessage)timeMessage.Bodies.FirstOrDefault().Content;

            // node 字符串

            /*
             * <node id='3064' name='中亚南路街道办事处' level='4' levelCN='乡镇' code='650104014' isLoad='true' isBranch='true'>
             *  <node id='3718' name='团结新村社区居委会' level='5' levelCN='村' code='650104014007' isLoad='false' ></node>
             *  <node id='3721' name='铁路花园社区居委会' level='5' levelCN='村' code='650104014010' isLoad='false' ></node>
             * </node>
             */
            var strNodes = content.body.ToString();


            using (StringReader xmlSR = new StringReader(strNodes))
            {
                dtUploadSetRow.ReadXml(xmlSR);
            }

            return(dtUploadSetRow);
        }
Ejemplo n.º 30
0
 /// <summary>
 /// This method supports the Fluorine infrastructure and is not intended to be used directly from your code.
 /// </summary>
 /// <returns></returns>
 public AMFMessage ReadAMFMessage()
 {
     // Version stored in the first two bytes.
     var version = ReadUInt16();
     var message = new AMFMessage(version);
     // Read header count.
     int headerCount = ReadUInt16();
     for (var i = 0; i < headerCount; i++) {
         message.AddHeader(ReadHeader());
     }
     // Read header count.
     int bodyCount = ReadUInt16();
     for (var i = 0; i < bodyCount; i++) {
         var amfBody = ReadBody();
         if (amfBody != null) //not failed
             message.AddBody(amfBody);
     }
     return message;
 }
Ejemplo n.º 31
0
        public override void Invoke(AMFContext context)
        {
            AMFDeserializer deserializer = new AMFDeserializer(context.InputStream)
            {
                UseLegacyCollection = this._useLegacyCollection
            };
            AMFMessage message = deserializer.ReadAMFMessage();

            context.AMFMessage    = message;
            context.MessageOutput = new MessageOutput(message.Version);
            if (deserializer.FailedAMFBodies.Length > 0)
            {
                AMFBody[] failedAMFBodies = deserializer.FailedAMFBodies;
                for (int i = 0; i < failedAMFBodies.Length; i++)
                {
                    context.MessageOutput.AddBody(failedAMFBodies[i]);
                }
            }
        }
Ejemplo n.º 32
0
        public override Task Invoke(AMFContext context)
        {
            AMFDeserializer deserializer = new AMFDeserializer(context.InputStream);

            deserializer.UseLegacyCollection = _useLegacyCollection;
            AMFMessage amfMessage = deserializer.ReadAMFMessage();

            context.AMFMessage    = amfMessage;
            context.MessageOutput = new MessageOutput(amfMessage.Version);
            if (deserializer.FailedAMFBodies.Length > 0)
            {
                AMFBody[] failedAMFBodies = deserializer.FailedAMFBodies;
                //Write out failed AMFBodies
                for (int i = 0; i < failedAMFBodies.Length; i++)
                {
                    context.MessageOutput.AddBody(failedAMFBodies[i]);
                }
            }
            return(Task.FromResult <object>(null));
        }
Ejemplo n.º 33
0
        private async void sendBtn_Click(object sender, EventArgs e)
        {
            object[]   arguments = { Convert.ToInt32(textBox1.Text) };
            AMFMessage _amf      = new AMFMessage(3);

            _amf.AddHeader(new AMFHeader("id", false, Hash.createChecksum(arguments)));
            _amf.AddHeader(new AMFHeader("needClassName", false, true));
            _amf.AddBody(new AMFBody("MovieStarPlanet.WebService.UserSession.AMFUserSessionService.GetActorNameFromId", "/1", arguments));
            MemoryStream  mStream   = new MemoryStream();
            AMFSerializer serialize = new AMFSerializer(mStream);

            serialize.WriteMessage(_amf);
            HttpClient client = new HttpClient();

            byte[] AMFBytes = Encoding.Default.GetBytes(Encoding.Default.GetString(mStream.ToArray()));

            ///Set referer to send AMF without 404 error
            Uri referer = new Uri("https://assets.mspcdns.com/msp/91.0.2/Main_20200728_110605.swf");

            client.DefaultRequestHeaders.Referrer = referer;

            try
            {
                string gateway = "https://ws-" + comboBox1.Text + ".mspapis.com/msp/91.0.6/Gateway.aspx?method=MovieStarPlanet.WebService.UserSession.AMFUserSessionService.GetActorNameFromId";
                var    AMFHttpClientByteArray = new ByteArrayContent(AMFBytes);
                AMFHttpClientByteArray.Headers.ContentType = new MediaTypeHeaderValue("application/x-amf");

                var response = await client.PostAsync(gateway, AMFHttpClientByteArray);

                //Response
                string responseString = response.Content.ReadAsStringAsync().Result;
                string final          = JsonConvert.SerializeObject(responseString);
                MessageBox.Show(final);
            }

            catch (WebException exception)
            {
                MessageBox.Show("Error!" + exception);
            }
        }
Ejemplo n.º 34
0
        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());
        }
Ejemplo n.º 35
0
        private AMFMessage ReadMessage(JsonReader reader, Type objectType, object existingValue,
            JsonSerializer serializer)
        {
            if (reader.TokenType != JsonToken.StartObject)
                throw new JsonReaderException("AMFMessage must be a JSON Object");

            AMFMessage message = new AMFMessage();

            for (reader.Read(); reader.TokenType != JsonToken.EndObject; reader.Read())
            {
                if (reader.TokenType != JsonToken.PropertyName)
                    throw new JsonReaderException("JSON format error, JSON Object must have property");

                string propertyName = (string)reader.Value;
                switch (propertyName)
                {
                    case "Version":
                        reader.Read();
                        if (reader.TokenType != JsonToken.Integer)
                            throw new JsonReaderException("AMFMessage 'Version' must be JSON Number");
                        message = new AMFMessage(Convert.ToUInt16(reader.Value));
                        break;
                    case "Bodies":
                        reader.Read();
                        if (reader.TokenType != JsonToken.StartArray)
                            throw new JsonReaderException("AMFMessage 'Bodies' must be JSON Array");
                        for (reader.Read(); reader.TokenType != JsonToken.EndArray; reader.Read())
                        {
                            AMFBody body = serializer.Deserialize<AMFBody>(reader);
                            message.AddBody(body);
                        }
                        break;
                    default:
                        throw new NotSupportedException("AMFMessage dont support property " + propertyName + ", please report this");
                        break;
                }
            }
            return message;
        }
Ejemplo n.º 36
0
        public void WriteMessage(AMFMessage amfMessage)
		{
			try
			{
				base.WriteShort(amfMessage.Version);
				int headerCount = amfMessage.HeaderCount;
				base.WriteShort(headerCount);
				for(int i = 0; i < headerCount; i++)
				{
					this.WriteHeader(amfMessage.GetHeaderAt(i), ObjectEncoding.AMF0);
				}
				int bodyCount = amfMessage.BodyCount;
				base.WriteShort(bodyCount);
				for(int i = 0; i < bodyCount; i++)
				{
					ResponseBody responseBody = amfMessage.GetBodyAt(i) as ResponseBody;
                    if (responseBody != null && !responseBody.IgnoreResults)
                    {
                        //Try to catch serialization errors
                        if (this.BaseStream.CanSeek)
                        {
                            long position = this.BaseStream.Position;

                            try
                            {
                                responseBody.WriteBody(amfMessage.ObjectEncoding, this);
                            }
                            catch (Exception exception)
                            {
                                this.BaseStream.Seek(position, SeekOrigin.Begin);
                                //this.BaseStream.Position = position;

#if !SILVERLIGHT
                                if (log.IsFatalEnabled)
                                    log.Fatal(__Res.GetString(__Res.Amf_SerializationFail), exception);
#endif

                                ErrorResponseBody errorResponseBody;
                                if (responseBody.RequestBody.IsEmptyTarget)
                                {
                                    object content = responseBody.RequestBody.Content;
                                    if (content is IList)
                                        content = (content as IList)[0];
                                    IMessage message = content as IMessage;
                                    MessageException messageException = new MessageException(exception);
                                    messageException.FaultCode = __Res.GetString(__Res.Amf_SerializationFail);
                                    errorResponseBody = new ErrorResponseBody(responseBody.RequestBody, message, messageException);
                                }
                                else
                                    errorResponseBody = new ErrorResponseBody(responseBody.RequestBody, exception);

                                try
                                {
                                    errorResponseBody.WriteBody(amfMessage.ObjectEncoding, this);
                                }
#if !SILVERLIGHT
                                catch (Exception exception2)
                                {
                                    if (log.IsFatalEnabled)
                                        log.Fatal(__Res.GetString(__Res.Amf_ResponseFail), exception2);
                                    throw;
                                }
#else
                                catch (Exception)
                                {
                                    throw;
                                }
#endif
                            }
                        }
                        else
                            responseBody.WriteBody(amfMessage.ObjectEncoding, this);
                    }
                    else
                    {
                        AMFBody amfBody = amfMessage.GetBodyAt(i);
                        FluorineFx.Util.ValidationUtils.ObjectNotNull(amfBody, "amfBody");
                        amfBody.WriteBody(amfMessage.ObjectEncoding, this);
                    }
				}
			}
#if !SILVERLIGHT
			catch(Exception exception)
			{
                if( log.IsFatalEnabled )
                    log.Fatal(__Res.GetString(__Res.Amf_SerializationFail), exception);
				throw;
			}
#else
            catch (Exception)
            {
                throw;
            }
#endif
        }
Ejemplo n.º 37
0
        private AMFMessage LoadBinMessageIntoAmfMessage(byte[] encodedMessage)
        {
            AMFMessage message = null;
            byte[] buffer = encodedMessage;
            MemoryStream stream = new MemoryStream(buffer);
            try
            {
                message = new AMFDeserializer(stream).ReadAMFMessage();
            }
            catch (DecoderFallbackException)
            {
                stream.Position = 0;
                object content = new AMFReader(stream) { FaultTolerancy = true }.ReadAMF3Data();
                message = new AMFMessage(3);
                message.AddBody(new AMFBody(string.Empty, string.Empty, content));
            }

            return message;
        }
        object ProcessMessage(AMFMessage amfMessage)
        {
            // Apply AMF-based operation selector
            /*
            Dictionary<string, string> operationNameDictionary = new Dictionary<string, string>();
            foreach (OperationDescription operation in _endpoint.Contract.Operations)
            {
                try
                {
                    operationNameDictionary.Add(operation.Name.ToLower(), operation.Name);
                }
                catch (ArgumentException)
                {
                    throw new Exception(String.Format("The specified contract cannot be used with case insensitive URI dispatch because there is more than one operation named {0}", operation.Name));
                }
            }
            */

            //SessionMode, CallbackContract, ProtectionLevel

            AMFMessage output = new AMFMessage(amfMessage.Version);
            for (int i = 0; i < amfMessage.BodyCount; i++)
            {
                AMFBody amfBody = amfMessage.GetBodyAt(i);
                object content = amfBody.Content;
                if (content is IList)
                    content = (content as IList)[0];
                IMessage message = content as IMessage;
                if (message != null)
                {
                    //WCF should not assign client id for Flex...
                    if (message.clientId == null)
                        message.clientId = Guid.NewGuid().ToString("D");

                    //IMessage resultMessage = _endpoint.ServiceMessage(message);
                    IMessage responseMessage = null;
                    CommandMessage commandMessage = message as CommandMessage;
                    if (commandMessage != null && commandMessage.operation == CommandMessage.ClientPingOperation)
                    {
                        responseMessage = new AcknowledgeMessage();
                        responseMessage.body = true;
                    }
                    else
                    {
                        RemotingMessage remotingMessage = message as RemotingMessage;
                        string operation = remotingMessage.operation;
                        //TODO: you could use an alias for a contract to expose a different name to the clients in the metadata using the Name property of the ServiceContract attribute
                        string source = remotingMessage.source;
                        Type serviceType = TypeHelper.Locate(source);
                        Type contractInterface = serviceType.GetInterface(_endpoint.Contract.ContractType.FullName);
                        //WCF also lets you apply the ServiceContract attribute directly on the service class. Avoid using it.
                        //ServiceContractAttribute serviceContractAttribute = ReflectionUtils.GetAttribute(typeof(ServiceContractAttribute), type, true) as ServiceContractAttribute;
                        if (contractInterface != null)
                        {
                            object instance = Activator.CreateInstance(serviceType);
                            IList parameterList = remotingMessage.body as IList;
                            MethodInfo mi = MethodHandler.GetMethod(contractInterface, operation, parameterList, false, false);
                            //MethodInfo mi = MethodHandler.GetMethod(serviceType, operation, parameterList, false, false);
                            if (mi != null)
                            {
                                //TODO OperationContract attribute to alias it to a different publicly exposed name
                                OperationContractAttribute operationContractAttribute = ReflectionUtils.GetAttribute(typeof(OperationContractAttribute), mi, true) as OperationContractAttribute;
                                if (operationContractAttribute != null)
                                {
                                    //mi = MethodHandler.GetMethod(serviceType, operation, parameterList, false, false);
                                    ParameterInfo[] parameterInfos = mi.GetParameters();
                                    object[] args = new object[parameterInfos.Length];
                                    parameterList.CopyTo(args, 0);
                                    TypeHelper.NarrowValues(args, parameterInfos);
                                    object result = mi.Invoke(instance, args);
                                    if (!(result is IMessage))
                                    {
                                        responseMessage = new AcknowledgeMessage();
                                        responseMessage.body = result;
                                    }
                                    else
                                        responseMessage = result as IMessage;
                                }
                                else
                                    responseMessage = ErrorMessage.GetErrorMessage(remotingMessage, new SecurityException("Method in not part of an service contract"));
                            }
                            else
                                responseMessage = ErrorMessage.GetErrorMessage(remotingMessage, new SecurityException("Method in not part of an service contract"));
                        }
                        else
                            responseMessage = ErrorMessage.GetErrorMessage(remotingMessage, new SecurityException(String.Format("The specified contract {0} cannot be used with the source named {1} and operation named {2}", _endpoint.Contract.ContractType.Name, source, operation)));
                    }

                    if (responseMessage is AsyncMessage)
                    {
                        ((AsyncMessage)responseMessage).correlationId = message.messageId;
                    }
                    responseMessage.destination = message.destination;
                    responseMessage.clientId = message.clientId;

                    ResponseBody responseBody = new ResponseBody(amfBody, responseMessage);
                    output.AddBody(responseBody);
                }
            }
            return output;
        }