コード例 #1
0
ファイル: FileChunk.cs プロジェクト: terraslate/ten.bew
        public override async Task Send(HttpClientImpl client, Stream redirectionStream)
        {
            var        context    = client.Context;
            string     cacheName  = (_rawUrl ?? context.Request.RawUrl);
            CacheEntry cacheEntry = Server.Cache.GetCache(cacheName);

            if (redirectionStream == null)
            {
                redirectionStream = client.Context.Response.OutputStream;
            }

            if (cacheEntry != null)
            {
                cacheEntry.TokenSource.Token.WaitHandle.WaitOne();

                for (int i = 0; i < cacheEntry.GetEntry <List <byte[]> >().Count; i++)
                {
                    byte[] byteArray = cacheEntry.GetEntry <List <byte[]> >()[i];
                    await redirectionStream.WriteAsync(byteArray, 0, byteArray.Length);
                }
            }
            else
            {
                string diskName = Server.GetFileName(cacheName);

                if (File.Exists(diskName))
                {
                    bool created = Server.Cache.GetOrCreateCache(cacheName, out cacheEntry, () => { return(new List <byte[]>()); });

                    if (created == false)
                    {
                        bool timeOut = cacheEntry.TokenSource.Token.WaitHandle.WaitOne();

                        for (int i = 0; i < cacheEntry.GetEntry <List <byte[]> >().Count; i++)
                        {
                            byte[] byteArray = cacheEntry.GetEntry <List <byte[]> >()[i];
                            await redirectionStream.WriteAsync(byteArray, 0, byteArray.Length);
                        }
                    }
                    else
                    {
                        try
                        {
                            using (FileStream fs = new FileStream(diskName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                            {
                                byte[] buffer = new byte[1024];
                                int    read   = 0;

                                while ((read = await fs.ReadAsync(buffer, 0, buffer.Length)) != 0)
                                {
                                    byte[] bufferEntry = new byte[read];
                                    Buffer.BlockCopy(buffer, 0, bufferEntry, 0, read);
                                    cacheEntry.GetEntry <List <byte[]> >().Add(bufferEntry);

                                    await redirectionStream.WriteAsync(bufferEntry, 0, bufferEntry.Length);
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            throw ex;
                        }
                        finally
                        {
                            cacheEntry.TokenSource.Cancel();
                        }
                    }
                }
                else
                {
                    byte[] buffer = Server.GetStatusCode(404);
                    await redirectionStream.WriteAsync(buffer, 0, buffer.Length);
                }
            }

            await redirectionStream.FlushAsync();

            if (SendType == SendTypeEnum.CloseStream)
            {
                redirectionStream.Close();
            }
        }