Ejemplo n.º 1
0
        public virtual Stream ProcessAsynchronously(Stream requestStream)
        {
            DateTime now        = DateTime.Now;
            string   asyncToken = now.Ticks.ToString(CultureInfo.InvariantCulture);

            AsyncTask asyncTask = null;

            if (requestStream == null)
            {
                asyncTask = new AsyncTask(this, this.CreateRequestMessage(null), now.AddSeconds(AsyncTask.DefaultDuration));
            }
            else
            {
                StreamPipe requestPipe = new StreamPipe();
                using (requestPipe.WriteStream)
                {
                    requestStream.CopyTo(requestPipe.WriteStream); // read the input stream to memory
                }

                var requestMessage = this.CreateRequestMessage(requestPipe.ReadStream);
                asyncTask = new AsyncTask(this, requestMessage, now.AddSeconds(AsyncTask.DefaultDuration));
            }
            AsyncTask.AddTask(asyncToken, asyncTask);

            StreamPipe responsePipe    = new StreamPipe();
            var        responseMessage = new ODataResponseMessage(responsePipe.WriteStream, 202); //202 Accepted

            responseMessage.PreferenceAppliedHeader().RespondAsync = true;
            ResponseWriter.WriteAsyncPendingResponse(responseMessage, asyncToken);
            return(responsePipe.ReadStream);
        }
Ejemplo n.º 2
0
                /// <summary>
                /// Метод чтения данных из канала в потоке
                /// </summary>
                /// <param name="data"></param>
                protected override void ThreadRead(object data)
                {
                    int err = 0;

                    while (err < 50)
                    {
                        int errRead = 0;

                        string stat = m_ss.ReadString(out errRead);//Чтение из канала

                        if (errRead > 0)
                        {
                            err++;
                        }
                        else
                        {
                            string[] main_com = stat.Split(';'); //Разбор сообщения
                            string[] message  = new string[0];
                            switch (main_com[0])                 //Переход по основной команде
                            {
                            case "Disconnect":
                                message = main_com[1].Split('=');    //Получаем имя канала от клиента
                                dictServ[message[1]].StartPipe();    //Запускаем канал по имени клиента
                                if (ConnectClient != null)
                                {
                                    ConnectClient(this, new ConnectClientEventArgs(message[1]));
                                }
                                m_ErrServ = true;    //Завершаем цикл и перезапускаем основной канал
                                break;

                            case "Connect":
                                message = main_com[1].Split('=');                          //Получаем имя клиента
                                string new_pipe = message[1] + "_" + (dictServ.Count + 1); //добавляем номер п\п
                                m_ss.WriteString(new_pipe);                                //отправляем клиенту имя канала для работы
                                StreamPipe stream = new StreamPipe(new_pipe);              //Создаём новый канал для клиента
                                dictServ.Add(new_pipe, stream);                            //Добавляем в словарь клиента и поток
                                //Подписываемся на события
                                dictServ[new_pipe].ReadMessage += new ReadMessageEventHandler(readMessage);
                                dictServ[new_pipe].ResServ     += new ResServEventHandler(resServ);
                                break;

                            default:
                                //Не известна команда
                                m_pipeServer.Flush();
                                m_ss.WriteString("Non command");
                                break;
                            }
                            if (m_ErrServ == true)
                            {
                                break;
                            }
                        }
                    }
                    m_ErrServ = true;
                    if (ResServ != null)
                    {
                        ResServ(this, new ResServEventArgs(m_NamePipe));
                    }
                }
Ejemplo n.º 3
0
 public void AddPipe(StreamPipe connection)
 {
     if (this._Connections.Add(connection))
     {
         connection.Start();
     }
     ;
 }
Ejemplo n.º 4
0
 public void RemovePipe(StreamPipe connection)
 {
     if (this._Connections.Remove(connection))
     {
         connection.Stop();
     }
     ;
 }
Ejemplo n.º 5
0
        /// <summary>
        /// Uploads the specified file name.
        /// </summary>
        /// <param name="fileName">Name of the file.</param>
        public void Upload(string fileName)
        {
tryAgain:

            FtpWebResponse response = null;

            try
            {
                Uri url = GetUrl(fileName);
                Console.WriteLine("Upload url: " + url);

                FtpWebRequest request = CreateRequest(url);
                request.Method      = WebRequestMethods.Ftp.UploadFile;
                request.Credentials = new NetworkCredential(user, password);


                using (var requestStream = request.GetRequestStream())
                    using (var fileStream = File.Open(fileName, FileMode.Open))
                    {
                        StreamPipe.Transfer(fileStream, requestStream, bufferSize);
                        response = (FtpWebResponse)request.GetResponse();

                        Console.WriteLine(response.StatusDescription);
                        Console.WriteLine("Upload complete.");
                    }
            }
            catch (UriFormatException ex)
            {
                Console.WriteLine(ex.Message);
            }
            catch (IOException ex)
            {
                Console.WriteLine(ex.Message);
            }
            catch (WebException ex)
            {
                string status = ((FtpWebResponse)ex.Response).StatusDescription;
                if (status.Contains("550"))
                {
                    if (MakeDirectorySafe())
                    {
                        goto tryAgain;
                    }
                }
                else
                {
                    PrintWebException(ex);
                }
            }
            finally
            {
                if (response != null)
                {
                    response.Close();
                }
            }
        }
Ejemplo n.º 6
0
        /// <summary>
        /// Downloads the specified URL.
        /// </summary>
        /// <param name="url">The URL.</param>
        /// <param name="fileName">Name of the file.</param>
        public void Download(string url, string fileName)
        {
            var request = AppCore.GameSettings.ServerSettings.CreateRequest(url);

            using (var response = (HttpWebResponse)request.GetResponse())
                using (var source = response.GetResponseStream())
                    using (var destination = File.OpenWrite(fileName))
                    {
                        StreamPipe.Transfer(source, destination);
                    }
        }
Ejemplo n.º 7
0
        public virtual Stream Process(Stream requestStream)
        {
            RequestHandler handler = this.DispatchHandler();

            if (handler != null)
            {
                return(handler.Process(requestStream));
            }

            StreamPipe pipe = new StreamPipe();

            this.Process(this.CreateRequestMessage(requestStream), this.CreateResponseMessage(pipe.WriteStream));

            return(pipe.ReadStream);
        }
Ejemplo n.º 8
0
        /// <summary>
        /// Downloads the specified file name.
        /// </summary>
        /// <param name="fileName">Name of the file.</param>
        public void Download(string fileName)
        {
            try
            {
                Uri url = GetUrl(fileName);
                Console.WriteLine("Download url: " + url);

                FtpWebRequest request = CreateRequest(url);
                request.Method = WebRequestMethods.Ftp.DownloadFile;
                var downloadResponse = request.GetResponse();

                using (var responseStream = downloadResponse.GetResponseStream())
                    using (var fileStream = File.Create(localdir + fileName))
                    {
                        StreamPipe.Transfer(responseStream, fileStream, bufferSize);
                    }
            }
            catch (Exception ex)
            {
                throw new FtpException("Error download file", ex);
            }
        }
Ejemplo n.º 9
0
        private void AsyncCallback(IAsyncResult ar)
        {
            DownloadRequestCompleteEventArgs arg;
            var downloadRequest = (DownloadRequest)ar.AsyncState;

            try
            {
                using (var response = downloadRequest.Request.EndGetResponse(ar))
                    using (var source = response.GetResponseStream())
                        using (var destination = File.OpenWrite(downloadRequest.FileName))
                        {
                            StreamPipe.Transfer(source, destination);
                        }
                arg = new DownloadRequestCompleteEventArgs(downloadRequest.FileName, true, null);
            }
            catch (Exception ex)
            {
                arg = new DownloadRequestCompleteEventArgs(downloadRequest.FileName, false, ex);
            }
            if (Downloaded != null)
            {
                Downloaded(this, arg);
            }
        }
Ejemplo n.º 10
0
        public virtual Stream ProcessAsynchronously(Stream requestStream)
        {
            DateTime now = DateTime.Now;
            string asyncToken = now.Ticks.ToString(CultureInfo.InvariantCulture);

            AsyncTask asyncTask = null;
            if (requestStream == null)
            {
                asyncTask = new AsyncTask(this, this.CreateRequestMessage(null), now.AddSeconds(AsyncTask.DefaultDuration));
            }
            else
            {
                StreamPipe requestPipe = new StreamPipe();
                using (requestPipe.WriteStream)
                {
                    requestStream.CopyTo(requestPipe.WriteStream); // read the input stream to memory
                }

                var requestMessage = this.CreateRequestMessage(requestPipe.ReadStream);
                asyncTask = new AsyncTask(this, requestMessage, now.AddSeconds(AsyncTask.DefaultDuration));
            }
            AsyncTask.AddTask(asyncToken, asyncTask);

            StreamPipe responsePipe = new StreamPipe();
            var responseMessage = new ODataResponseMessage(responsePipe.WriteStream, 202); //202 Accepted
            responseMessage.PreferenceAppliedHeader().RespondAsync = true;
            ResponseWriter.WriteAsyncPendingResponse(responseMessage, asyncToken);
            return responsePipe.ReadStream;
        }
Ejemplo n.º 11
0
        public virtual Stream Process(Stream requestStream)
        {
            RequestHandler handler = this.DispatchHandler();
            if (handler != null)
            {
                return handler.Process(requestStream);
            }

            StreamPipe pipe = new StreamPipe();
            this.Process(this.CreateRequestMessage(requestStream), this.CreateResponseMessage(pipe.WriteStream));

            return pipe.ReadStream;
        }
        private async Task ConnectAsync(CancellationToken cancellationToken)
        {
            if (IsConnected)
            {
                return;
            }

            LastAction = "Waiting for Connecting lock to be free";
            var wait = _connectSemaphoreSlim.WaitAsync(cancellationToken);

            if (!wait.IsCompletedSuccessfully())
            {
                await wait.ConfigureAwait(false);
            }

            try
            {
                if (IsConnected)
                {
                    return;
                }

                LastAction = "Connecting";
                Interlocked.Increment(ref _reconnectAttempts);

                _socket = new RedisSocket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
                {
                    SendTimeout    = ClientConfig.SendTimeoutMillis,
                    ReceiveTimeout = ClientConfig.ReceiveTimeoutMillis
                };

                OptimiseSocket();

                if (IPAddress.TryParse(ClientConfig.Host, out var ip))
                {
                    await _socket.ConnectAsync(ip, ClientConfig.Port).ConfigureAwait(false);
                }
                else
                {
                    var addresses = await Dns.GetHostAddressesAsync(ClientConfig.Host);

                    await _socket.ConnectAsync(
                        addresses.FirstOrDefault(a => a.AddressFamily == AddressFamily.InterNetwork),
                        ClientConfig.Port).ConfigureAwait(false);
                }


                if (!_socket.Connected)
                {
                    Log.Debug("Socket Connect failed");

                    _socket.Close();
                    _socket = null;
                    return;
                }

                Log.Debug("Socket Connected");

                Stream networkStream = new NetworkStream(_socket);

                var redisPipeOptions = GetPipeOptions();

                if (ClientConfig.Ssl)
                {
                    _sslStream = new SslStream(networkStream,
                                               false,
                                               ClientConfig.CertificateValidationCallback,
                                               ClientConfig.CertificateSelectionCallback,
                                               EncryptionPolicy.RequireEncryption);

                    LastAction = "Authenticating SSL Stream as Client";
                    await _sslStream.AuthenticateAsClientAsync(ClientConfig.Host).ConfigureAwait(false);

                    if (!_sslStream.IsEncrypted)
                    {
                        Dispose();
                        throw new SecurityException($"Could not establish an encrypted connection to Redis - {ClientConfig.Host}");
                    }

                    LastAction = "Creating SSL Stream Pipe";
                    _pipe      = StreamPipe.GetDuplexPipe(_sslStream, redisPipeOptions.SendOptions, redisPipeOptions.ReceiveOptions);
                }
                else
                {
                    LastAction = "Creating Socket Pipe";
                    _pipe      = SocketPipe.GetDuplexPipe(_socket, redisPipeOptions.SendOptions, redisPipeOptions.ReceiveOptions);
                }

                IsConnected = true;

                if (!string.IsNullOrEmpty(ClientConfig.Password))
                {
                    LastAction = "Authorizing";
                    await Authorize(cancellationToken);
                }

                if (ClientConfig.Db != 0)
                {
                    LastAction = "Selecting Database";
                    await SelectDb(cancellationToken);
                }

                if (ClientConfig.ClientName != null)
                {
                    LastAction = "Setting Client Name";
                    await SetClientNameAsync(cancellationToken);
                }
            }
            finally
            {
                _connectSemaphoreSlim.Release();
            }
        }
Ejemplo n.º 13
0
 /// <summary>
 /// Sends the file.
 /// </summary>
 /// <param name="context">The context.</param>
 /// <param name="mode">The mode.</param>
 /// <param name="fileName">Name of the file.</param>
 /// <param name="content">The content.</param>
 /// <param name="mimeType">Type of the MIME.</param>
 public static void SendFile(this HttpContext context, SendMode mode, string fileName, Stream content, string mimeType)
 {
     PrepareResponse(context, mode, fileName, content.Length);
     StreamPipe.Transfer(content, context.Response.OutputStream);
     ResponseEnd(context.Response);
 }
Ejemplo n.º 14
0
            /// <summary>
            /// Метод чтения данных из канала в потоке
            /// </summary>
            /// <param name="data"></param>
            protected override void ThreadRead(object data)
            {
                int err = 0;

                int    errRead = -1;
                string stat    = string.Empty
                , new_pipe     = string.Empty;

                string[] main_com = null //Разбор сообщения
                                         //, message = null
                ;

                while (err < 50)
                {
                    errRead = 0;

                    stat = m_ss.ReadString(out errRead);//Чтение из канала

                    if (errRead > 0)
                    {
                        err++;
                    }
                    else
                    {
                        //main_com = stat.Split(DELIMETER_MESSAGE_COMMAND);//Разбор сообщения
                        main_com = stat.Split(DELIMETER_MESSAGE_KEYVALUEPAIR);         //Разбор сообщения
                        //message = new string[0];
                        if (main_com[0].Equals(COMMAND.Disconnect.ToString()) == true) //Переход по основной команде
                        {
                            //message = main_com[1].Split(DELIMETER_MESSAGE_KEYVALUEPAIR);//Получаем имя канала от клиента
                            //dictServ[message[1]].StartPipe();//Запускаем канал по имени клиента
                            m_dictStreamPipeClient[main_com[1]].StartPipe();//Запускаем канал по имени клиента
                            if (!(ConnectClient == null))
                            {
                                ConnectClient(this, new ConnectionClientEventArgs(main_com[1]));
                            }
                            else
                            {
                                ;
                            }
                            m_ErrServ = ERROR.DISCONNECT;//Завершаем цикл и перезапускаем основной канал
                        }
                        else
                        if (main_com[0].Equals(COMMAND.Connect.ToString()) == true)
                        {
                            //message = main_com[1].Split(DELIMETER_MESSAGE_KEYVALUEPAIR);//Получаем имя клиента
                            new_pipe = main_com[1] + "_" + (m_dictStreamPipeClient.Count + 1); //добавляем номер п\п
                            m_ss.WriteString(new_pipe);                                        //отправляем клиенту имя канала для работы
                            StreamPipe stream = new StreamPipe(new_pipe);                      //Создаём новый канал для клиента
                            m_dictStreamPipeClient.Add(new_pipe, stream);                      //Добавляем в словарь клиента и поток
                            //Подписываемся на события
                            m_dictStreamPipeClient[new_pipe].ReadMessage += new EventHandler(readMessage);
                            m_dictStreamPipeClient[new_pipe].ResServ     += new EventHandler(resServ);
                        }
                        else
                        {
                            //Не известна команда
                            m_pipeServer.Flush();
                            m_ss.WriteString(MESSAGE_UNRECOGNIZED_COMMAND);
                        }

                        if (!(m_ErrServ == ERROR.NO))
                        {
                            break;
                        }
                    }
                }
                m_ErrServ = ERROR.ANY;
                if (!(ResServ == null))
                {
                    ResServ(this, new ResServEventArgs(m_NamePipe));
                }
                else
                {
                    ;
                }
            }