public async Task WriteAsync(string str)
        {
            if (!isHeaderWritten)
            {
                await WriteHeadAsync();
            }

            if (!string.IsNullOrEmpty(str))
            {
                var bytes = Encoding.UTF8.GetBytes(str);
                await ResponseStream.WriteAsync(bytes, 0, bytes.Length);
            }

            await ResponseStream.FlushAsync();
        }
 /// <summary>
 /// Implements the Dispose pattern
 /// </summary>
 /// <param name="disposing">Whether this object is being disposed via a call to Dispose
 /// or garbage collected.</param>
 protected virtual void Dispose(bool disposing)
 {
     if (!this.disposed)
     {
         if (disposing)
         {
             if (this.ResponseStream != null)
             {
                 ResponseStream.Dispose();
                 ResponseStream = null;
             }
         }
         this.disposed = true;
     }
 }
Exemple #3
0
        public void WritePartialTo(IResponse response)
        {
            var contentLength = GetContentLength().GetValueOrDefault(int.MaxValue); //Safe as guarded by IsPartialRequest
            var rangeHeader   = RequestContext.GetHeader(HttpHeaders.Range);

            long rangeStart, rangeEnd;

            rangeHeader.ExtractHttpRanges(contentLength, out rangeStart, out rangeEnd);

            if (rangeEnd > contentLength - 1)
            {
                rangeEnd = contentLength - 1;
            }

            response.AddHttpRangeResponseHeaders(rangeStart, rangeEnd, contentLength);

            var outputStream = response.OutputStream;

            if (FileInfo != null)
            {
                using (var fs = FileInfo.OpenRead())
                {
                    fs.WritePartialTo(outputStream, rangeStart, rangeEnd);
                }
            }
            else if (ResponseStream != null)
            {
                try
                {
                    ResponseStream.WritePartialTo(outputStream, rangeStart, rangeEnd);
                }
                finally
                {
                    DisposeStream();
                }
            }
            else if (ResponseText != null)
            {
                using (var ms = MemoryStreamFactory.GetStream(Encoding.UTF8.GetBytes(ResponseText)))
                {
                    ms.WritePartialTo(outputStream, rangeStart, rangeEnd);
                }
            }
            else
            {
                throw new InvalidOperationException("Neither file, stream nor text were set when attempting to write to the Response Stream.");
            }
        }
Exemple #4
0
        private static string ConvertFile(string downloadUrl, string fromExt, Token token)
        {
            Global.Logger.Debug("GoogleDriveApp: convert file");

            if (string.IsNullOrEmpty(downloadUrl))
            {
                Global.Logger.Error("GoogleDriveApp: downloadUrl is null");
                throw new Exception("downloadUrl is null");
            }

            var request = (HttpWebRequest)WebRequest.Create(downloadUrl);

            request.Method = "GET";
            request.Headers.Add("Authorization", "Bearer " + token);

            try
            {
                using (var response = request.GetResponse())
                    using (var fileStream = new ResponseStream(response))
                    {
                        Global.Logger.Debug("GoogleDriveApp: GetExternalUri - " + downloadUrl);

                        var key = DocumentServiceConnector.GenerateRevisionId(downloadUrl);
                        downloadUrl = DocumentServiceConnector.GetExternalUri(fileStream, response.ContentType, key);
                    }
            }
            catch (WebException e)
            {
                Global.Logger.Error("GoogleDriveApp: Error GetExternalUri", e);
                request.Abort();
            }

            var toExt = FileUtility.GetInternalExtension(fromExt);

            try
            {
                Global.Logger.Debug("GoogleDriveApp: GetConvertedUri- " + downloadUrl);

                var key = DocumentServiceConnector.GenerateRevisionId(downloadUrl);
                DocumentServiceConnector.GetConvertedUri(downloadUrl, fromExt, toExt, key, false, out downloadUrl);
            }
            catch (Exception e)
            {
                Global.Logger.Error("GoogleDriveApp: Error GetConvertedUri", e);
            }

            return(downloadUrl);
        }
        private static string CreateFile(string contentUrl, string fileName, string folderId, Token token)
        {
            if (string.IsNullOrEmpty(contentUrl))
            {
                Global.Logger.Error("GoogleDriveApp: downloadUrl is null");
                throw new Exception("downloadUrl is null");
            }
            Global.Logger.Debug("GoogleDriveApp: create from - " + contentUrl);

            var request = (HttpWebRequest)WebRequest.Create(contentUrl);

            using (var content = new ResponseStream(request.GetResponse()))
            {
                return(CreateFile(content, fileName, folderId, token));
            }
        }
Exemple #6
0
 public static void Write(this NetworkStream stream, ResponseStream data)
 {
     byte[] buffer = new byte[10000];
     try
     {
         while (!data.End && stream.CanWrite)
         {
             var len = data.GetChunk(buffer);
             stream.Write(buffer, 0, len);
         }
         stream.Flush();
     }
     catch (Exception ex)
     {
         ConsoleUtils.WriteLn(ex);
     }
 }
Exemple #7
0
        public void Dispose()
        {
            if (ProxyRequest != null)
            {
                ProxyRequest.Abort();
            }

            if (ResponseStream != null)
            {
                ResponseStream.Dispose();
            }

            if (ServerResponse != null)
            {
                ServerResponse.Close();
            }
        }
Exemple #8
0
 public void CloseResponseStream()
 {
     if (ResponseStream != null)
     {
         try
         {
             ResponseStream.Close();
         }
         // ReSharper disable once EmptyGeneralCatchClause
         catch
         {
         }
         finally
         {
             ResponseStream = null;
         }
     }
 }
Exemple #9
0
        /// <summary>
        /// Returns streams associated with account.
        /// </summary>
        /// <param name="restApi">Server address</param>
        /// <param name="apiToken">API token for account</param>
        /// <returns>List of tuple containing the name and the streamID of each stream</returns>
        public static async Task <List <Tuple <string, string> > > GetStreams(string restApi, string apiToken)
        {
            SpeckleApiClient myClient = new SpeckleApiClient()
            {
                BaseUrl = restApi, AuthToken = apiToken
            };

            ResponseStream response = await myClient.StreamsGetAllAsync("fields=name,streamId");

            List <Tuple <string, string> > ret = new List <Tuple <string, string> >();

            foreach (SpeckleStream s in response.Resources)
            {
                ret.Add(new Tuple <string, string>(s.Name, s.StreamId));
            }

            return(ret);
        }
 private void CloseResponseStream()
 {
     if (ResponseStream != null)
     {
         try
         {
             ResponseStream.Close();
         }
         catch
         {
             // ignored
         }
         finally
         {
             ResponseStream = null;
         }
     }
 }
        protected override void Complete(Exception e = null)
        {
            ResponseStream?.Close();

            if (e != null)
            {
                try
                {
                    File.Delete(Filename);
                }
                catch (Exception eOther)
                {
                    e = new AggregateException(e, eOther);
                }
            }

            base.Complete(e);
        }
Exemple #12
0
 internal bool ResponsePage(ref AutoCSer.Memory.Pointer buffer, ref AutoCSer.Memory.Pointer encodeBuffer)
 {
     if (ResponseStream == null)
     {
         ResponseStream = new UnmanagedStream(default(AutoCSer.Memory.Pointer));
     }
     buffer = UnmanagedPool.Default.GetPointer();
     ResponseStream.Reset(ref buffer);
     using (ResponseStream)
     {
         if (EncodeStream == null)
         {
             EncodeStream = new UnmanagedStream(default(AutoCSer.Memory.Pointer));
         }
         encodeBuffer = UnmanagedPool.Default.GetPointer();
         EncodeStream.Reset(ref encodeBuffer);
         using (EncodeStream)
         {
             Response bodyResponse = new Response {
                 Stream = ResponseStream, EncodeStream = EncodeStream, Encoding = DomainServer.ResponseEncoding
             };
             if (IsAwaitMethod)
             {
                 pageAsync(bodyResponse);
                 AsyncWaitHandle.Wait();
                 if (asyncReturn)
                 {
                     asyncReturn = false;
                     HttpResponse.SetBody(ResponseStream);
                     return(true);
                 }
             }
             else
             {
                 if (page(ref bodyResponse))
                 {
                     HttpResponse.SetBody(ResponseStream);
                     return(true);
                 }
             }
         }
     }
     return(false);
 }
Exemple #13
0
        private bool disposedValue = false; // 중복 호출을 검색하려면

        protected virtual void Dispose(bool disposing)
        {
            if (!disposedValue)
            {
                if (disposing)
                {
                    // TODO: 관리되는 상태(관리되는 개체)를 삭제합니다.
                    ResponseStream?.Dispose();
                }

                // TODO: 관리되지 않는 리소스(관리되지 않는 개체)를 해제하고 아래의 종료자를 재정의합니다.
                // TODO: 큰 필드를 null로 설정합니다.

                this.Name     = null;
                this.FileName = null;

                disposedValue = true;
            }
        }
        //-------------------------------------------------------------------------------------------------------------------------
        private async Task ProcessResponse()
        {
            CurrentUri       = HttpWebResponse.ResponseUri;
            ResponseEncoding = (HttpWebResponse.CharacterSet == "") ? Encoding.UTF8 : Encoding.GetEncoding(HttpWebResponse.CharacterSet);

            if (ResponseStream != null)
            {
                ResponseStream.Dispose();
            }
            if (PageSourceCache != String.Empty)
            {
                PageSourceCache = String.Empty;
            }

            ResponseStream = new MemoryStream();
            await HttpWebResponse.GetResponseStream().CopyToAsync(ResponseStream);

            ResponseStream.Position = 0;
        }
Exemple #15
0
        private void SaveThumbnail(IFileDao <T> fileDao, File <T> file, string thumbnailUrl)
        {
            logger.DebugFormat("SaveThumbnail: FileId: {0}. ThumbnailUrl {1}.", file.ID, thumbnailUrl);

            var req = (HttpWebRequest)WebRequest.Create(thumbnailUrl);

            //HACK: http://ubuntuforums.org/showthread.php?t=1841740
            if (WorkContext.IsMono && ServicePointManager.ServerCertificateValidationCallback == null)
            {
                ServicePointManager.ServerCertificateValidationCallback += (s, c, n, p) => true;
            }

            using (var stream = new ResponseStream(req.GetResponse()))
            {
                Crop(fileDao, file, stream);
            }

            logger.DebugFormat("SaveThumbnail: FileId: {0}. Successfully saved.", file.ID);
        }
Exemple #16
0
        public void Dispose()
        {
            if (OriginalResponse != null)
            {
                OriginalResponse.Dispose();
                OriginalResponse = null;
            }

            if (ResponseStream != null)
            {
                ResponseStream.Dispose();
                ResponseStream = null;

                /*if (streamKey != null)
                 * {
                 *  streamCache.ClearAsync(streamKey, StreamType.File).Wait();
                 * }*/
            }
        }
Exemple #17
0
 internal bool ResponsePage(ref byte *buffer, ref byte *encodeBuffer)
 {
     if (ResponseStream == null)
     {
         ResponseStream = new UnmanagedStream(null, 0);
     }
     ResponseStream.Reset(buffer = AutoCSer.UnmanagedPool.Default.Get(), AutoCSer.UnmanagedPool.DefaultSize);
     using (ResponseStream)
     {
         if (EncodeStream == null)
         {
             EncodeStream = new UnmanagedStream(null, 0);
         }
         EncodeStream.Reset(encodeBuffer = AutoCSer.UnmanagedPool.Default.Get(), AutoCSer.UnmanagedPool.DefaultSize);
         using (EncodeStream)
         {
             Response bodyResponse = new Response {
                 Stream = ResponseStream, EncodeStream = EncodeStream, Encoding = DomainServer.ResponseEncoding
             };
             if (IsAwaitMethod)
             {
                 pageAsync(bodyResponse);
                 AsyncWaitHandle.Wait();
                 if (asyncReturn)
                 {
                     asyncReturn = false;
                     HttpResponse.SetBody(ResponseStream);
                     return(true);
                 }
             }
             else
             {
                 if (page(ref bodyResponse))
                 {
                     HttpResponse.SetBody(ResponseStream);
                     return(true);
                 }
             }
         }
     }
     return(false);
 }
Exemple #18
0
        public IPC()
        {
            Task.Run(async() =>
            {
                await foreach (var m in responseChannel.Reader.ReadAllAsync())
                {
                    // Serialize the write
                    await(ResponseStream?.WriteAsync(m) ?? Task.CompletedTask);
                }
            }, cts.Token);

            Task.Run(async() =>
            {
                await foreach (var m in browserResponseChannel.Reader.ReadAllAsync())
                {
                    // Serialize the write
                    await(BrowserResponseStream?.WriteAsync(m) ?? Task.CompletedTask);
                }
            }, cts.Token);
        }
        private void ReadCallback(IAsyncResult ar)
        {
            try
            {
                var bytesRead = webResponseStream.EndRead(ar);
                if (bytesRead <= 0)
                {
                    ResponseStream.Position = 0;
                    EndRequest();
                    return;
                }

                ResponseStream.Write(readBuffer, 0, bytesRead);
                webResponseStream.BeginRead(readBuffer, 0, readBuffer.Length, ReadCallback, null);
            }
            catch (Exception ex)
            {
                SetException(ex);
            }
        }
 public void Close()
 {
     if (WebResponse != null)
     {
         CloseFile(WebResponse.LastModified);
     }
     else
     {
         CloseFile();
     }
     if (ResponseStream != null)
     {
         ResponseStream.Close();
         ResponseStream = null;
     }
     if (WebResponse != null)
     {
         WebResponse.Close();
         WebResponse = null;
     }
 }
Exemple #21
0
        /// <summary>
        /// Closes this request.
        /// </summary>
        public void Close()
        {
            WriteResponse(new byte[0]);
            var record = Record.CreateEndRequest(RequestId);

            record.Send(ResponseStream);

            if (ManagingApp != null)
            {
                ManagingApp.RequestClosed(this);
                if (!KeepAlive)
                {
                    ManagingApp.ConnectionClosed(ResponseStream as FCGIStream);
                }
            }

            if (!KeepAlive)
            {
                ResponseStream.Close();
            }
        }
        private static void StoringFileAfterError(string fileId, string userId, string downloadUri, string downloadType)
        {
            if (string.IsNullOrEmpty(downloadUri))
            {
                return;
            }

            try
            {
                if (string.IsNullOrEmpty(downloadType))
                {
                    downloadType = FileUtility.GetFileExtension(downloadUri).Trim('.');
                }
                var fileName = Global.ReplaceInvalidCharsAndTruncate(fileId + "." + downloadType);
                var path     = string.Format(@"save_crash\{0}\{1}_{2}",
                                             DateTime.UtcNow.ToString("yyyy_MM_dd"),
                                             userId,
                                             fileName);

                var store = Global.GetStore();
                var req   = (HttpWebRequest)WebRequest.Create(downloadUri);

                // hack. http://ubuntuforums.org/showthread.php?t=1841740
                if (WorkContext.IsMono)
                {
                    ServicePointManager.ServerCertificateValidationCallback += (s, ce, ca, p) => true;
                }

                using (var fileStream = new ResponseStream(req.GetResponse()))
                {
                    store.Save(FileConstant.StorageDomainTmp, path, fileStream);
                }
                Global.Logger.DebugFormat("DocService storing to {0}", path);
            }
            catch (Exception ex)
            {
                Global.Logger.Error("DocService Error on save file to temp store", ex);
            }
        }
Exemple #23
0
        internal void Complete()
        {
            try
            {
                if (ResponseStream != null)
                {
                    ResponseStream.Close();
                    ResponseStream = null;
                }
                if (ResponseBufferedStream != null)
                {
                    ResponseBufferedStream.Position = 0;
                }
            }
            catch (Exception ex)
            {
                if (Exception == null)
                {
                    Exception = ex;
                }
            }
            IsCompleted = true;
            try
            {
                if (manualResetEvent != null)
                {
                    manualResetEvent.Set();
                }
            }
            catch (Exception ex)
            {
                if (Exception == null)
                {
                    Exception = ex;
                }
            }

            userCallback?.Invoke(this);
        }
Exemple #24
0
        private async Task Subscribe()
        {
            try {
                while (await _call !.ResponseStream.MoveNext().ConfigureAwait(false) &&
                       !_disposed.IsCancellationRequested)
                {
                    var current = _call !.ResponseStream.Current;
                    switch (current.ContentCase)
                    {
                    case ReadResp.ContentOneofCase.Event:
                        try {
                            await _eventAppeared(this, ConvertToResolvedEvent(current),
                                                 current.Event.CountCase switch {
                                ReadResp.Types.ReadEvent.CountOneofCase.RetryCount => current.Event.RetryCount,
                                _ => default
                            }, _disposed.Token).ConfigureAwait(false);

                            if (_autoAck)
                            {
                                await AckInternal(Uuid.FromDto(current.Event.Link?.Id ?? current.Event.Event.Id))
                                .ConfigureAwait(false);
                            }
                        } catch (Exception ex) when(ex is ObjectDisposedException ||
                                                    ex is OperationCanceledException)
                        {
                            SubscriptionDropped(SubscriptionDroppedReason.Disposed);
                            return;
                        } catch (Exception ex) {
                            try {
                                SubscriptionDropped(SubscriptionDroppedReason.SubscriberError, ex);
                            } finally {
                                _disposed.Cancel();
                            }

                            return;
                        }

                        break;
                    }
Exemple #25
0
        /// Close a stream. In fact it just does a Dispose().
        /// If either ResponseStream or WebResponse are open, then close these also.
        public void Dispose()
        {
            if (Reader != null)
            {
                Reader.Dispose();
                Reader = null;
            }

            if (ResponseStream != null)
            {
                ResponseStream.Close();
                ResponseStream.Dispose();
                ResponseStream = null;
            }

            if (WebResponse != null)
            {
                WebResponse.Close();
                WebResponse.Dispose();
                WebResponse = null;
            }
        }
Exemple #26
0
        private static void SaveHistory(File file, string changes, string differenceUrl)
        {
            if (file == null)
            {
                return;
            }
            if (file.ProviderEntry)
            {
                return;
            }
            if (string.IsNullOrEmpty(changes) || string.IsNullOrEmpty(differenceUrl))
            {
                return;
            }

            try
            {
                using (var fileDao = Global.DaoFactory.GetFileDao())
                {
                    var req = (HttpWebRequest)WebRequest.Create(differenceUrl);

                    // hack. http://ubuntuforums.org/showthread.php?t=1841740
                    if (WorkContext.IsMono)
                    {
                        ServicePointManager.ServerCertificateValidationCallback += (s, ce, ca, p) => true;
                    }

                    using (var differenceStream = new ResponseStream(req.GetResponse()))
                    {
                        fileDao.SaveEditHistory(file, changes, differenceStream);
                    }
                }
            }
            catch (Exception ex)
            {
                Global.Logger.Error("DocService save history error", ex);
            }
        }
Exemple #27
0
        private static void StoringFileAfterError(string fileId, string userId, string downloadUri)
        {
            try
            {
                var fileName = fileId + FileUtility.GetFileExtension(downloadUri);
                var path     = string.Format(@"save_crash\{0}\{1}_{2}",
                                             DateTime.UtcNow.ToString("yyyy_MM_dd"),
                                             userId,
                                             fileName);

                var store = Global.GetStore();
                var req   = (HttpWebRequest)WebRequest.Create(downloadUri);
                using (var fileStream = new ResponseStream(req.GetResponse()))
                {
                    store.Save(FileConstant.StorageDomainTmp, path, fileStream);
                }
                Global.Logger.DebugFormat("DocService storing to {0}", path);
            }
            catch (Exception ex)
            {
                Global.Logger.Error("DocService Error on save file to temp store", ex);
            }
        }
Exemple #28
0
        private static File CreateFileFromUri(Folder folder, string fileUri, string fileTitle)
        {
            if (string.IsNullOrEmpty(fileTitle))
            {
                fileTitle = Path.GetFileName(HttpUtility.UrlDecode(fileUri));
            }

            var file = new File
            {
                Title    = fileTitle,
                FolderID = folder.ID
            };

            var req = (HttpWebRequest)WebRequest.Create(fileUri);

            using (var fileDao = Global.DaoFactory.GetFileDao())
                using (var fileStream = new ResponseStream(req.GetResponse()))
                {
                    file.ContentLength = fileStream.Length;

                    return(fileDao.SaveFile(file, fileStream));
                }
        }
        /// <summary>
        ///   关闭
        /// </summary>
        public void Close()
        {
            if (web_response_ != null)
            {
                CloseFile(web_response_.LastModified);
            }
            else
            {
                CloseFile();
            }

            if (ResponseStream != null)
            {
                ResponseStream.Close();
                ResponseStream = null;
            }

            if (web_response_ != null)
            {
                web_response_.Close();
                web_response_ = null;
            }
        }
Exemple #30
0
 internal void Complete()
 {
     try {
         if (ResponseStream != null)
         {
             ResponseStream.Close();
             ResponseStream = null;
         }
         if (ResponseBufferedStream != null)
         {
             ResponseBufferedStream.Position = 0;
         }
     }
     catch (Exception ex) {
         if (_exception == null)
         {
             _exception = ex;
         }
     }
     _isCompleted = true;
     try {
         if (_manualResetEvent != null)
         {
             _manualResetEvent.Set();
         }
     }
     catch (Exception ex) {
         if (_exception == null)
         {
             _exception = ex;
         }
     }
     if (_userCallback != null)
     {
         _userCallback(this);
     }
 }
Exemple #31
0
        /// <summary>Flush</summary>
        public override void Flush()
        {
            byte[] bb = TempBuffer.GetBuffer();

            if (bb != null && bb.Length > 0)
            {
                // 書き換え処理
                Encoding enc     = Response.ContentEncoding;
                string   content = enc.GetString(bb);

                // JSON形式なので、JsonConvertでaccess_tokenを抜き出す。
                Dictionary <string, object> accessTokenResponse = JsonConvert.DeserializeObject <Dictionary <string, object> >(content);

                // refresh_tokenを削除
                if (accessTokenResponse.ContainsKey(OAuth2AndOIDCConst.RefreshToken))
                {
                    accessTokenResponse.Remove(OAuth2AndOIDCConst.RefreshToken);
                    bb = enc.GetBytes(JsonConvert.SerializeObject(accessTokenResponse));
                }
            }

            ResponseStream.Write(bb, 0, bb.Length);
            ResponseStream.Flush();
        }
        public void SaveFile(string fileId, string downloadUrl)
        {
            Global.Logger.Debug("GoogleDriveApp: save file stream " + fileId + " from - " + downloadUrl);
            fileId = ThirdPartySelector.GetFileId(fileId);

            var token = Token.GetToken(AppAttr);

            var driveFile = GetDriveFile(fileId, token);
            if (driveFile == null)
            {
                Global.Logger.Error("GoogleDriveApp: file is null");
                throw new Exception("File not found");
            }

            var jsonFile = JObject.Parse(driveFile);
            var curExt = GetCorrectExt(jsonFile);
            var newExt = FileUtility.GetFileExtension(downloadUrl);
            if (curExt != newExt)
            {
                try
                {
                    Global.Logger.Debug("GoogleDriveApp: GetConvertedUri from " + newExt + " to " + curExt + " - " + downloadUrl);

                    var key = DocumentServiceConnector.GenerateRevisionId(downloadUrl);
                    DocumentServiceConnector.GetConvertedUri(downloadUrl, newExt, curExt, key, false, out downloadUrl);
                }
                catch (Exception e)
                {
                    Global.Logger.Error("GoogleDriveApp: Error convert", e);
                }
            }

            var downloadRequest = WebRequest.Create(downloadUrl);

            using (var downloadResponse = downloadRequest.GetResponse())
            using (var downloadStream = new ResponseStream(downloadResponse))
            {
                var request = (HttpWebRequest)WebRequest.Create(GoogleUrlUpload + "/{fileId}?uploadType=media".Replace("{fileId}", fileId));
                request.Method = "PUT";
                request.Headers.Add("Authorization", "Bearer " + token);
                request.ContentType = downloadResponse.ContentType;
                request.ContentLength = downloadResponse.ContentLength;

                const int bufferSize = 2048;
                var buffer = new byte[bufferSize];
                int readed;
                while ((readed = downloadStream.Read(buffer, 0, bufferSize)) > 0)
                {
                    request.GetRequestStream().Write(buffer, 0, readed);
                }

                try
                {
                    using (var response = request.GetResponse())
                    using (var stream = response.GetResponseStream())
                    {
                        var result = stream != null ? new StreamReader(stream).ReadToEnd() : null;

                        Global.Logger.Debug("GoogleDriveApp: save file stream response - " + result);
                    }
                }
                catch (WebException e)
                {
                    Global.Logger.Error("GoogleDriveApp: Error save file stream", e);
                    request.Abort();
                    var httpResponse = (HttpWebResponse)e.Response;
                    if (httpResponse.StatusCode == HttpStatusCode.Forbidden)
                    {
                        throw new SecurityException(FilesCommonResource.ErrorMassage_SecurityException, e);
                    }
                    throw;
                }
            }
        }
        internal void SendHeaders(bool closing, MemoryStream ms)
        {
            Encoding encoding = content_encoding;
            if (encoding == null)
                encoding = Encoding.Default;

            if (content_type != null) {
                if (content_encoding != null && content_type.IndexOf ("charset=", StringComparison.Ordinal) == -1) {
                    string enc_name = content_encoding.WebName;
                    headers.SetInternal ("Content-Type", content_type + "; charset=" + enc_name);
                } else {
                    headers.SetInternal ("Content-Type", content_type);
                }
            }

            if (headers ["Server"] == null)
                headers.SetInternal ("Server", "Mono-HTTPAPI/1.0");

            CultureInfo inv = CultureInfo.InvariantCulture;
            if (headers ["Date"] == null)
                headers.SetInternal ("Date", DateTime.UtcNow.ToString ("r", inv));

            if (!chunked) {
                if (!cl_set && closing) {
                    cl_set = true;
                    content_length = 0;
                }

                if (cl_set)
                    headers.SetInternal ("Content-Length", content_length.ToString (inv));
            }

            Version v = context.Request.ProtocolVersion;
            if (!cl_set && !chunked && v >= HttpVersion.Version11)
                chunked = true;

            /* Apache forces closing the connection for these status codes:
             *	HttpStatusCode.BadRequest 				400
             *	HttpStatusCode.RequestTimeout 			408
             *	HttpStatusCode.LengthRequired 			411
             *	HttpStatusCode.RequestEntityTooLarge 	413
             *	HttpStatusCode.RequestUriTooLong 		414
             *	HttpStatusCode.InternalServerError 		500
             *	HttpStatusCode.ServiceUnavailable 		503
             */
            bool conn_close = (status_code == 400 || status_code == 408 || status_code == 411 ||
                    status_code == 413 || status_code == 414 || status_code == 500 ||
                    status_code == 503);

            if (conn_close == false)
                conn_close = !context.Request.KeepAlive;

            // They sent both KeepAlive: true and Connection: close!?
            if (!keep_alive || conn_close) {
                headers.SetInternal ("Connection", "close");
                conn_close = true;
            }

            if (chunked)
                headers.SetInternal ("Transfer-Encoding", "chunked");

            int reuses = context.Connection.Reuses;
            if (reuses >= 100) {
                force_close_chunked = true;
                if (!conn_close) {
                    headers.SetInternal ("Connection", "close");
                    conn_close = true;
                }
            }

            if (!conn_close) {
                headers.SetInternal ("Keep-Alive", String.Format ("timeout=15,max={0}", 100 - reuses));
                if (context.Request.ProtocolVersion <= HttpVersion.Version10)
                    headers.SetInternal ("Connection", "keep-alive");
            }

            if (location != null)
                headers.SetInternal ("Location", location);

            if (cookies != null) {
                foreach (Cookie cookie in cookies)
                    headers.SetInternal ("Set-Cookie", cookie.ToClientString ());
            }

            StreamWriter writer = new StreamWriter (ms, encoding, 256);
            writer.Write ("HTTP/{0} {1} {2}\r\n", version, status_code, status_description);
            string headers_str = headers.ToStringMultiValue ();
            writer.Write (headers_str);
            writer.Flush ();
            int preamble = (encoding.CodePage == 65001) ? 3 : encoding.GetPreamble ().Length;
            if (output_stream == null)
                output_stream = context.Connection.GetResponseStream ();

            /* Assumes that the ms was at position 0 */
            ms.Position = preamble;
            HeadersSent = true;
        }
        private static string ConvertFile(string downloadUrl, string fromExt, Token token)
        {
            Global.Logger.Debug("GoogleDriveApp: convert file");

            if (string.IsNullOrEmpty(downloadUrl))
            {
                Global.Logger.Error("GoogleDriveApp: downloadUrl is null");
                throw new Exception("downloadUrl is null");
            }

            var request = WebRequest.Create(downloadUrl);
            request.Method = "GET";
            request.Headers.Add("Authorization", "Bearer " + token);

            try
            {
                using (var response = request.GetResponse())
                using (var fileStream = new ResponseStream(response))
                {
                    Global.Logger.Debug("GoogleDriveApp: GetExternalUri - " + downloadUrl);

                    var key = DocumentServiceConnector.GenerateRevisionId(downloadUrl);
                    downloadUrl = DocumentServiceConnector.GetExternalUri(fileStream, response.ContentType, key);
                }
            }
            catch (WebException e)
            {
                Global.Logger.Error("GoogleDriveApp: Error GetExternalUri", e);
                request.Abort();
            }

            var toExt = FileUtility.GetInternalExtension(fromExt);
            try
            {
                Global.Logger.Debug("GoogleDriveApp: GetConvertedUri- " + downloadUrl);

                var key = DocumentServiceConnector.GenerateRevisionId(downloadUrl);
                DocumentServiceConnector.GetConvertedUri(downloadUrl, fromExt, toExt, key, false, out downloadUrl);
            }
            catch (Exception e)
            {
                Global.Logger.Error("GoogleDriveApp: Error GetConvertedUri", e);
            }

            return downloadUrl;
        }
            internal RequestState(HttpRequestMessage request, CancellationToken cancellationToken)
            {
                _request = request;
                _responseTcs = new TaskCompletionSource<HttpResponseMessage>();
                _sendingHeaders = () => { };

                if (request.RequestUri.IsDefaultPort)
                {
                    request.Headers.Host = request.RequestUri.Host;
                }
                else
                {
                    request.Headers.Host = request.RequestUri.GetComponents(UriComponents.HostAndPort, UriFormat.UriEscaped);
                }

                OwinContext = new OwinContext();
                OwinContext.Set("owin.Version", "1.0");
                IOwinRequest owinRequest = OwinContext.Request;
                owinRequest.Protocol = "HTTP/" + request.Version.ToString(2);
                owinRequest.Scheme = request.RequestUri.Scheme;
                owinRequest.Method = request.Method.ToString();
                owinRequest.Path = PathString.FromUriComponent(request.RequestUri);
                owinRequest.PathBase = PathString.Empty;
                owinRequest.QueryString = QueryString.FromUriComponent(request.RequestUri);
                owinRequest.CallCancelled = cancellationToken;
                owinRequest.Set<Action<Action<object>, object>>("server.OnSendingHeaders", (callback, state) =>
                {
                    var prior = _sendingHeaders;
                    _sendingHeaders = () =>
                    {
                        prior();
                        callback(state);
                    };
                });

                foreach (var header in request.Headers)
                {
                    owinRequest.Headers.AppendValues(header.Key, header.Value.ToArray());
                }
                HttpContent requestContent = request.Content;
                if (requestContent != null)
                {
                    foreach (var header in request.Content.Headers)
                    {
                        owinRequest.Headers.AppendValues(header.Key, header.Value.ToArray());
                    }
                }

                _responseStream = new ResponseStream(CompleteResponse);
                OwinContext.Response.Body = _responseStream;
                OwinContext.Response.StatusCode = 200;
            }
        private void PageLoad()
        {
            var editPossible = !RequestEmbedded && !IsMobile;
            var isExtenral = false;

            File file;
            var fileUri = string.Empty;
            if (!ItsTry)
            {
                try
                {
                    if (string.IsNullOrEmpty(RequestFileUrl))
                    {
                        _fileNew = (Request["new"] ?? "") == "true";

                        var app = ThirdPartySelector.GetAppByFileId(RequestFileId);
                        if (app == null)
                        {
                            var ver = string.IsNullOrEmpty(Request[FilesLinkUtility.Version]) ? -1 : Convert.ToInt32(Request[FilesLinkUtility.Version]);

                            file = DocumentServiceHelper.GetParams(RequestFileId, ver, RequestShareLinkKey, _fileNew, editPossible, !RequestView, out _docParams);

                            _fileNew = _fileNew && file.Version == 1 && file.ConvertedType != null && file.CreateOn == file.ModifiedOn;
                        }
                        else
                        {
                            isExtenral = true;

                            bool editable;
                            ThirdPartyApp = true;
                            file = app.GetFile(RequestFileId, out editable);
                            file = DocumentServiceHelper.GetParams(file, true, true, true, editable, editable, editable, out _docParams);

                            _docParams.FileUri = app.GetFileStreamUrl(file);
                            _docParams.FolderUrl = string.Empty;
                        }
                    }
                    else
                    {
                        isExtenral = true;

                        fileUri = RequestFileUrl;
                        var fileTitle = Request[FilesLinkUtility.FileTitle];
                        if (string.IsNullOrEmpty(fileTitle))
                            fileTitle = Path.GetFileName(HttpUtility.UrlDecode(fileUri)) ?? "";

                        if (CoreContext.Configuration.Standalone)
                        {
                            try
                            {
                                var webRequest = WebRequest.Create(RequestFileUrl);
                                using (var response = webRequest.GetResponse())
                                using (var responseStream = new ResponseStream(response))
                                {
                                    var externalFileKey = DocumentServiceConnector.GenerateRevisionId(RequestFileUrl);
                                    fileUri = DocumentServiceConnector.GetExternalUri(responseStream, MimeMapping.GetMimeMapping(fileTitle), externalFileKey);
                                }
                            }
                            catch (Exception error)
                            {
                                Global.Logger.Error("Cannot receive external url for \"" + RequestFileUrl + "\"", error);
                            }
                        }

                        file = new File
                            {
                                ID = RequestFileUrl,
                                Title = Global.ReplaceInvalidCharsAndTruncate(fileTitle)
                            };

                        file = DocumentServiceHelper.GetParams(file, true, true, true, false, false, false, out _docParams);
                        _docParams.CanEdit = editPossible && !CoreContext.Configuration.Standalone;
                        _editByUrl = true;

                        _docParams.FileUri = fileUri;
                    }
                }
                catch (Exception ex)
                {
                    _errorMessage = ex.Message;
                    return;
                }
            }
            else
            {
                FileType tryType;
                try
                {
                    tryType = (FileType)Enum.Parse(typeof(FileType), Request[FilesLinkUtility.TryParam]);
                }
                catch
                {
                    tryType = FileType.Document;
                }

                var path = "demo";
                if (!IsMobile)
                {
                    path = FileConstant.NewDocPath + CultureInfo.CurrentUICulture.TwoLetterISOLanguageName + "/";
                    if (!Global.GetStoreTemplate().IsDirectory(path))
                        path = FileConstant.NewDocPath + "default/";

                    path += "new";
                }

                path += FileUtility.InternalExtension[tryType];

                var store = Global.GetStoreTemplate();
                fileUri = store.GetUri("", path).ToString();

                var fileTitle = "Demo" + FileUtility.InternalExtension[tryType];
                file = new File
                    {
                        ID = Guid.NewGuid(),
                        Title = Global.ReplaceInvalidCharsAndTruncate(fileTitle)
                    };

                file = DocumentServiceHelper.GetParams(file, true, true, true, editPossible, editPossible, true, out _docParams);

                _docParams.FileUri = CommonLinkUtility.GetFullAbsolutePath(fileUri);
                _editByUrl = true;
                _docParams.Lang = CultureInfo.CurrentUICulture.Name;
            }

            if (_docParams.ModeWrite && FileConverter.MustConvert(file))
            {
                try
                {
                    file = FileConverter.ExecDuplicate(file, RequestShareLinkKey);
                }
                catch (Exception e)
                {
                    _docParams = null;
                    _errorMessage = e.Message;
                    return;
                }

                var comment = "#message/" + HttpUtility.UrlEncode(FilesCommonResource.CopyForEdit);

                Response.Redirect(FilesLinkUtility.GetFileWebEditorUrl(file.ID) + comment);
                return;
            }

            Title = HeaderStringHelper.GetPageTitle(file.Title);

            _newScheme = FileUtility.ExtsNewService.Contains(FileUtility.GetFileExtension(file.Title));
            if (_newScheme)
            {
                DocServiceApiUrl = FilesLinkUtility.DocServiceApiUrlNew;
            }

            if (string.IsNullOrEmpty(_docParams.FolderUrl))
            {
                _docParams.FolderUrl = Request[FilesLinkUtility.FolderUrl] ?? "";
            }
            if (MobileDetector.IsRequestMatchesMobile(true))
            {
                _docParams.FolderUrl = string.Empty;
            }

            if (RequestEmbedded)
            {
                _docParams.Type = DocumentServiceParams.EditorType.Embedded;

                var shareLinkParam = "&" + FilesLinkUtility.DocShareKey + "=" + RequestShareLinkKey;
                _docParams.ViewerUrl = CommonLinkUtility.GetFullAbsolutePath(FilesLinkUtility.FilesBaseAbsolutePath + FilesLinkUtility.EditorPage + "?" + FilesLinkUtility.Action + "=view" + shareLinkParam);
                _docParams.DownloadUrl = CommonLinkUtility.GetFullAbsolutePath(FilesLinkUtility.FileHandlerPath + "?" + FilesLinkUtility.Action + "=download" + shareLinkParam);
                _docParams.EmbeddedUrl = CommonLinkUtility.GetFullAbsolutePath(FilesLinkUtility.FilesBaseAbsolutePath + FilesLinkUtility.EditorPage + "?" + FilesLinkUtility.Action + "=embedded" + shareLinkParam);
            }
            else
            {
                _docParams.Type = IsMobile ? DocumentServiceParams.EditorType.Mobile : DocumentServiceParams.EditorType.Desktop;

                if (FileSharing.CanSetAccess(file))
                {
                    _docParams.SharingSettingsUrl = CommonLinkUtility.GetFullAbsolutePath(Share.Location + "?" + FilesLinkUtility.FileId + "=" + file.ID);
                }
            }

            if (!isExtenral)
            {
                _docKeyForTrack = DocumentServiceHelper.GetDocKey(file.ID, -1, DateTime.MinValue);

                if (!ItsTry)
                    FileMarker.RemoveMarkAsNew(file);
            }

            if (_docParams.ModeWrite)
            {
                _tabId = FileTracker.Add(file.ID, _fileNew);
                _fixedVersion = FileTracker.FixedVersion(file.ID);

                if (ItsTry)
                {
                    AppendAuthControl();
                }
            }
            else
            {
                _docParams.LinkToEdit = _editByUrl
                                            ? CommonLinkUtility.GetFullAbsolutePath(FilesLinkUtility.GetFileWebEditorExternalUrl(fileUri, file.Title))
                                            : FileConverter.MustConvert(_docParams.File) || _newScheme
                                                  ? CommonLinkUtility.GetFullAbsolutePath(FilesLinkUtility.GetFileWebEditorUrl(file.ID))
                                                  : string.Empty;
            }

            if (CoreContext.Configuration.Personal && IsMobile)
            {
                _docParams.CanEdit = false;
            }
        }
        private static void SaveHistory(File file, string changes, string differenceUrl)
        {
            if (file == null) return;
            if (file.ProviderEntry) return;
            if (string.IsNullOrEmpty(changes) || string.IsNullOrEmpty(differenceUrl)) return;

            try
            {
                using (var fileDao = Global.DaoFactory.GetFileDao())
                {
                    var req = (HttpWebRequest) WebRequest.Create(differenceUrl);

                    // hack. http://ubuntuforums.org/showthread.php?t=1841740
                    if (WorkContext.IsMono)
                    {
                        ServicePointManager.ServerCertificateValidationCallback += (s, ce, ca, p) => true;
                    }

                    using (var differenceStream = new ResponseStream(req.GetResponse()))
                    {
                        fileDao.SaveEditHistory(file, changes, differenceStream);
                    }
                }
            }
            catch (Exception ex)
            {
                Global.Logger.Error("DocService save history error", ex);
            }
        }
        private static void StoringFileAfterError(string fileId, string userId, string downloadUri)
        {
            try
            {
                var fileName = Global.ReplaceInvalidCharsAndTruncate(fileId + FileUtility.GetFileExtension(downloadUri));
                var path = string.Format(@"save_crash\{0}\{1}_{2}",
                                         DateTime.UtcNow.ToString("yyyy_MM_dd"),
                                         userId,
                                         fileName);

                var store = Global.GetStore();
                var req = (HttpWebRequest) WebRequest.Create(downloadUri);

                // hack. http://ubuntuforums.org/showthread.php?t=1841740
                if (WorkContext.IsMono)
                {
                    ServicePointManager.ServerCertificateValidationCallback += (s, ce, ca, p) => true;
                }

                using (var fileStream = new ResponseStream(req.GetResponse()))
                {
                    store.Save(FileConstant.StorageDomainTmp, path, fileStream);
                }
                Global.Logger.DebugFormat("DocService storing to {0}", path);
            }
            catch (Exception ex)
            {
                Global.Logger.Error("DocService Error on save file to temp store", ex);
            }
        }
        private void PageLoad()
        {
            var editPossible = !RequestEmbedded && !IsMobile;
            var isExtenral = false;

            File file;
            var fileUri = string.Empty;
            if (!ItsTry)
            {
                try
                {
                    if (string.IsNullOrEmpty(RequestFileUrl))
                    {
                        _fileNew = !string.IsNullOrEmpty(Request[UrlConstant.New]) && Request[UrlConstant.New] == "true";

                        var ver = string.IsNullOrEmpty(Request[CommonLinkUtility.Version]) ? -1 : Convert.ToInt32(Request[CommonLinkUtility.Version]);

                        file = DocumentServiceHelper.GetParams(RequestFileId, ver, RequestShareLinkKey, _fileNew, editPossible, !RequestView, out _docParams);

                        _fileNew = file.Version == 1 && file.ConvertedType != null && _fileNew && file.CreateOn == file.ModifiedOn;
                    }
                    else
                    {
                        isExtenral = true;

                        fileUri = RequestFileUrl;
                        var fileTitle = Request[CommonLinkUtility.FileTitle];
                        if (string.IsNullOrEmpty(fileTitle))
                            fileTitle = Path.GetFileName(HttpUtility.UrlDecode(fileUri)) ?? "";

                        if (CoreContext.Configuration.Standalone)
                        {
                            try
                            {
                                var webRequest = WebRequest.Create(RequestFileUrl);
                                using (var response = webRequest.GetResponse())
                                using (var responseStream = new ResponseStream(response))
                                {
                                    fileUri = DocumentServiceConnector.GetExternalUri(responseStream, MimeMapping.GetMimeMapping(fileTitle), "new");
                                }
                            }
                            catch (Exception error)
                            {
                                Global.Logger.Error("Cannot receive external url for \"" + RequestFileUrl + "\"", error);
                            }
                        }

                        file = new File
                            {
                                ID = fileUri.GetHashCode(),
                                Title = Global.ReplaceInvalidCharsAndTruncate(fileTitle)
                            };

                        file = DocumentServiceHelper.GetParams(file, true, true, true, false, false, false, out _docParams);
                        _docParams.CanEdit = editPossible && !CoreContext.Configuration.Standalone;
                        _editByUrl = true;

                        _docParams.FileUri = fileUri;
                    }
                }
                catch (Exception ex)
                {
                    _errorMessage = ex.Message;
                    return;
                }
            }
            else
            {
                FileType tryType;
                try
                {
                    tryType = (FileType)Enum.Parse(typeof(FileType), Request[CommonLinkUtility.TryParam]);
                }
                catch
                {
                    tryType = FileType.Document;
                }

                var fileTitle = "Demo";
                fileTitle += FileUtility.InternalExtension[tryType];

                var relativeUri = string.Format(CommonLinkUtility.FileHandlerPath + UrlConstant.ParamsDemo, tryType);
                fileUri = new Uri(Request.Url, relativeUri).ToString();

                file = new File
                    {
                        ID = Guid.NewGuid(),
                        Title = Global.ReplaceInvalidCharsAndTruncate(fileTitle)
                    };

                file = DocumentServiceHelper.GetParams(file, true, true, true, editPossible, editPossible, true, out _docParams);

                _docParams.FileUri = fileUri;
                _editByUrl = true;
            }

            if (_docParams.ModeWrite && FileConverter.MustConvert(file))
            {
                try
                {
                    file = FileConverter.ExecDuplicate(file, RequestShareLinkKey);
                }
                catch (Exception e)
                {
                    _docParams = null;
                    _errorMessage = e.Message;
                    return;
                }

                var comment = "#message/" + HttpUtility.UrlEncode(FilesCommonResource.CopyForEdit);

                Response.Redirect(CommonLinkUtility.GetFileWebEditorUrl(file.ID) + comment);
                return;
            }

            Title = HeaderStringHelper.GetPageTitle(file.Title);

            if (string.IsNullOrEmpty(_docParams.FolderUrl))
            {
                _docParams.FolderUrl = Request[CommonLinkUtility.FolderUrl] ?? "";
            }
            if (MobileDetector.IsRequestMatchesMobile(Context.Request.UserAgent, true))
            {
                _docParams.FolderUrl = string.Empty;
            }

            if (RequestEmbedded)
            {
                _docParams.Type = DocumentServiceParams.EditorType.Embedded;

                var shareLinkParam = "&" + CommonLinkUtility.DocShareKey + "=" + RequestShareLinkKey;
                _docParams.ViewerUrl = CommonLinkUtility.GetFullAbsolutePath(CommonLinkUtility.FilesBaseAbsolutePath + CommonLinkUtility.EditorPage + "?" + CommonLinkUtility.Action + "=view" + shareLinkParam);
                _docParams.DownloadUrl = CommonLinkUtility.GetFullAbsolutePath(CommonLinkUtility.FileHandlerPath + "?" + CommonLinkUtility.Action + "=download" + shareLinkParam);
                _docParams.EmbeddedUrl = CommonLinkUtility.GetFullAbsolutePath(CommonLinkUtility.FilesBaseAbsolutePath + CommonLinkUtility.EditorPage + "?" + CommonLinkUtility.Action + "=embedded" + shareLinkParam);
            }
            else
            {
                _docParams.Type = IsMobile ? DocumentServiceParams.EditorType.Mobile : DocumentServiceParams.EditorType.Desktop;

                if (FileSharing.CanSetAccess(file))
                {
                    _docParams.SharingSettingsUrl = CommonLinkUtility.GetFullAbsolutePath(CommonLinkUtility.FilesBaseAbsolutePath + "share.aspx" + "?" + CommonLinkUtility.FileId + "=" + file.ID + "&" + CommonLinkUtility.FileTitle + "=" + HttpUtility.UrlEncode(file.Title));
                }
            }

            if (!isExtenral)
            {
                _docKeyForTrack = DocumentServiceHelper.GetDocKey(file.ID, -1, DateTime.MinValue);

                if (!ItsTry)
                    FileMarker.RemoveMarkAsNew(file);
            }

            if (_docParams.ModeWrite)
            {
                _tabId = FileLocker.Add(file.ID, _fileNew);
                _lockVersion = FileLocker.LockVersion(file.ID);

                if (ItsTry)
                {
                    AppendAuthControl();
                }
            }
            else
            {
                _docParams.LinkToEdit = _editByUrl
                                            ? CommonLinkUtility.GetFullAbsolutePath(string.Format(CommonLinkUtility.FileWebEditorExternalUrlString, HttpUtility.UrlEncode(fileUri), file.Title))
                                            : FileConverter.MustConvert(_docParams.File)
                                                  ? CommonLinkUtility.GetFullAbsolutePath(CommonLinkUtility.GetFileWebEditorUrl(file.ID))
                                                  : string.Empty;
            }

            if (CoreContext.Configuration.YourDocsDemo && IsMobile)
            {
                _docParams.CanEdit = false;
            }
        }
        internal void Close(bool force_close)
        {
            if (sock != null) {
                Stream st = GetResponseStream ();
                st.Close ();
                o_stream = null;
            }

            if (sock != null) {
                force_close |= !context.Request.KeepAlive;
                if (!force_close)
                    force_close = (context.Response.Headers ["connection"] == "close");
                /*
                if (!force_close) {
            //					bool conn_close = (status_code == 400 || status_code == 408 || status_code == 411 ||
            //							status_code == 413 || status_code == 414 || status_code == 500 ||
            //							status_code == 503);

                    force_close |= (context.Request.ProtocolVersion <= HttpVersion.Version10);
                }
                */

                if (!force_close && context.Request.FlushInput ()) {
                    if (chunked && context.Response.ForceCloseChunked == false) {
                        // Don't close. Keep working.
                        reuses++;
                        Unbind ();
                        Init ();
                        BeginReadRequest ();
                        return;
                    }

                    reuses++;
                    Unbind ();
                    Init ();
                    BeginReadRequest ();
                    return;
                }

                Socket s = sock;
                sock = null;
                try {
                    if (s != null)
                        s.Shutdown (SocketShutdown.Both);
                } catch {
                } finally {
                    if (s != null)
                        s.Close ();
                }
                Unbind ();
                RemoveConnection ();
                return;
            }
        }
 public ResponseStream GetResponseStream()
 {
     // TODO: can we get this stream before reading the input?
     if (o_stream == null) {
         HttpListener listener = context.Listener;
         bool ign = (listener == null) ? true : listener.IgnoreWriteExceptions;
         o_stream = new ResponseStream (stream, context.Response, ign);
     }
     return o_stream;
 }
        private static void StreamFile(HttpContext context)
        {
            try
            {
                var fileId = context.Request[FilesLinkUtility.FileId];
                var auth = context.Request[FilesLinkUtility.AuthKey];
                var userId = context.Request[CommonLinkUtility.ParamName_UserUserID];

                Global.Logger.Debug("GoogleDriveApp: get file stream " + fileId);

                int validateTimespan;
                int.TryParse(WebConfigurationManager.AppSettings["files.stream-url-minute"], out validateTimespan);
                if (validateTimespan <= 0) validateTimespan = 5;

                var validateResult = EmailValidationKeyProvider.ValidateEmailKey(fileId + userId, auth, TimeSpan.FromMinutes(validateTimespan));
                if (validateResult != EmailValidationKeyProvider.ValidationResult.Ok)
                {
                    var exc = new HttpException((int)HttpStatusCode.Forbidden, FilesCommonResource.ErrorMassage_SecurityException);

                    Global.Logger.Error(string.Format("GoogleDriveApp: validate error {0} {1}: {2}", FilesLinkUtility.AuthKey, validateResult, context.Request.Url), exc);

                    throw exc;
                }

                var token = Token.GetToken(AppAttr, userId);
                var driveFile = GetDriveFile(fileId, token);

                var jsonFile = JObject.Parse(driveFile);

                var downloadUrl = jsonFile.Value<string>("downloadUrl");
                var contentLength = jsonFile.Value<string>("fileSize");

                if (string.IsNullOrEmpty(downloadUrl))
                {
                    Global.Logger.Error("GoogleDriveApp: downloadUrl is null");
                    throw new Exception("downloadUrl is null");
                }

                Global.Logger.Debug("GoogleDriveApp: get file stream  downloadUrl - " + downloadUrl);

                var request = WebRequest.Create(downloadUrl);
                request.Method = "GET";
                request.Headers.Add("Authorization", "Bearer " + token);

                using (var response = request.GetResponse())
                using (var stream = new ResponseStream(response))
                {
                    stream.StreamCopyTo(context.Response.OutputStream);

                    Global.Logger.Debug("GoogleDriveApp: get file stream  contentLength - " + contentLength);
                    context.Response.AddHeader("Content-Length", contentLength);
                }
            }
            catch (Exception ex)
            {
                context.Response.StatusCode = (int)HttpStatusCode.BadRequest;
                context.Response.Write(ex.Message);
                Global.Logger.Error("GoogleDriveApp: Error request " + context.Request.Url, ex);
            }
            try
            {
                context.Response.Flush();
                context.Response.End();
            }
            catch (HttpException)
            {
            }
        }
        private static string CreateFile(string contentUrl, string fileName, string folderId, Token token)
        {
            if (string.IsNullOrEmpty(contentUrl))
            {
                Global.Logger.Error("GoogleDriveApp: downloadUrl is null");
                throw new Exception("downloadUrl is null");
            }
            Global.Logger.Debug("GoogleDriveApp: create from - " + contentUrl);

            var request = WebRequest.Create(contentUrl);

            using (var response = request.GetResponse())
            using (var content = new ResponseStream(response))
            {
                return CreateFile(content, fileName, folderId, token);
            }
        }
 private void init ()
 {
   _context = new HttpListenerContext (this);
   _inputState = InputState.RequestLine;
   _inputStream = null;
   _lineState = LineState.None;
   _outputStream = null;
   _position = 0;
   _prefix = null;
   _requestBuffer = new MemoryStream ();
 }
        private static string CreateConvertedFile(string driveFile, Token token)
        {
            var jsonFile = JObject.Parse(driveFile);
            var fileName = GetCorrectTitle(jsonFile);
            fileName = FileUtility.ReplaceFileExtension(fileName, FileUtility.GetInternalExtension(fileName));

            var folderId = (string)jsonFile.SelectToken("parents[0].id");

            Global.Logger.Info("GoogleDriveApp: create copy - " + fileName);

            var mimeType = (jsonFile.Value<string>("mimeType") ?? "").ToLower();
            FileType fileType;
            if (GoogleMimeTypes.TryGetValue(mimeType, out fileType))
            {
                var links = jsonFile["exportLinks"];
                if (links == null)
                {
                    Global.Logger.Error("GoogleDriveApp: exportLinks is null");
                    throw new Exception("exportLinks is null");
                }

                var internalExt = FileUtility.InternalExtension[fileType];
                var requiredMimeType = MimeMapping.GetMimeMapping(internalExt);

                var exportLinks = links.ToObject<Dictionary<string, string>>();
                var downloadUrl = exportLinks[requiredMimeType] ?? "";

                if (string.IsNullOrEmpty(downloadUrl))
                {
                    Global.Logger.Error("GoogleDriveApp: exportLinks without requested mime - " + links);
                    throw new Exception("exportLinks without requested mime");
                }


                var request = WebRequest.Create(downloadUrl);
                request.Method = "GET";
                request.Headers.Add("Authorization", "Bearer " + token);

                Global.Logger.Debug("GoogleDriveApp: download exportLink - " + downloadUrl);
                try
                {
                    using (var response = request.GetResponse())
                    using (var fileStream = new ResponseStream(response))
                    {
                        driveFile = CreateFile(fileStream, fileName, folderId, token);
                    }
                }
                catch (WebException e)
                {
                    Global.Logger.Error("GoogleDriveApp: Error download exportLink", e);
                    request.Abort();

                    var httpResponse = (HttpWebResponse)e.Response;
                    if (httpResponse.StatusCode == HttpStatusCode.Unauthorized && fileType == FileType.Spreadsheet)
                    {
                        throw new SecurityException(FilesCommonResource.AppDriveSpreadsheetException, e);
                    }
                }
            }
            else
            {
                var downloadUrl = jsonFile.Value<string>("downloadUrl");

                var ext = GetCorrectExt(jsonFile);
                var convertedUrl = ConvertFile(downloadUrl, ext, token);

                driveFile = CreateFile(convertedUrl, fileName, folderId, token);
            }

            jsonFile = JObject.Parse(driveFile);
            return jsonFile.Value<string>("id");
        }
        private static File CreateFileFromUri(Folder folder, string fileUri, string fileTitle)
        {
            if (string.IsNullOrEmpty(fileTitle))
                fileTitle = Path.GetFileName(HttpUtility.UrlDecode(fileUri));

            var file = new File
                {
                    Title = fileTitle,
                    FolderID = folder.ID
                };

            var req = (HttpWebRequest)WebRequest.Create(fileUri);

            using (var fileDao = Global.DaoFactory.GetFileDao())
            using (var fileStream = new ResponseStream(req.GetResponse()))
            {
                file.ContentLength = fileStream.Length;

                return fileDao.SaveFile(file, fileStream);
            }
        }
Exemple #47
0
            internal RequestState(HttpRequestMessage request, PathString pathBase)
            {
                _request = request;
                _responseTcs = new TaskCompletionSource<HttpResponseMessage>();
                _requestAbortedSource = new CancellationTokenSource();
                _pipelineFinished = false;

                if (request.RequestUri.IsDefaultPort)
                {
                    request.Headers.Host = request.RequestUri.Host;
                }
                else
                {
                    request.Headers.Host = request.RequestUri.GetComponents(UriComponents.HostAndPort, UriFormat.UriEscaped);
                }

                HttpContext = new DefaultHttpContext();
                HttpContext.Features.Set<IHttpRequestFeature>(new RequestFeature());
                _responseFeature = new ResponseFeature();
                HttpContext.Features.Set<IHttpResponseFeature>(_responseFeature);
                var serverRequest = HttpContext.Request;
                serverRequest.Protocol = "HTTP/" + request.Version.ToString(2);
                serverRequest.Scheme = request.RequestUri.Scheme;
                serverRequest.Method = request.Method.ToString();

                var fullPath = PathString.FromUriComponent(request.RequestUri);
                PathString remainder;
                if (fullPath.StartsWithSegments(pathBase, out remainder))
                {
                    serverRequest.PathBase = pathBase;
                    serverRequest.Path = remainder;
                }
                else
                {
                    serverRequest.PathBase = PathString.Empty;
                    serverRequest.Path = fullPath;
                }

                serverRequest.QueryString = QueryString.FromUriComponent(request.RequestUri);

                foreach (var header in request.Headers)
                {
                    serverRequest.Headers.Append(header.Key, header.Value.ToArray());
                }
                var requestContent = request.Content;
                if (requestContent != null)
                {
                    foreach (var header in request.Content.Headers)
                    {
                        serverRequest.Headers.Append(header.Key, header.Value.ToArray());
                    }
                }

                _responseStream = new ResponseStream(ReturnResponseMessage, AbortRequest);
                HttpContext.Response.Body = _responseStream;
                HttpContext.Response.StatusCode = 200;
                HttpContext.RequestAborted = _requestAbortedSource.Token;
            }
Exemple #48
0
        void Init()
        {
            context_bound = false;

            i_stream      = null;

            o_stream      = null;

            prefix        = null;

            chunked       = false;

            ms            = new MemoryStream();

            position      = 0;

            input_state   = InputState.RequestLine;

            line_state    = LineState.None;

            context       = new HttpListenerContext(this);
        }
		public override void setResponseStream (ResponseStream __p1) {
			_facesContex.setResponseStream (__p1);
		}
 private void Init()
 {
     _chunked = false;
     _context = new HttpListenerContext (this);
     _contextWasBound = false;
     _inputState = InputState.RequestLine;
     _inputStream = null;
     _lineState = LineState.None;
     _outputStream = null;
     _position = 0;
     _prefix = null;
     _requestBuffer = new MemoryStream ();
     _timeout = 90000; // 90k ms for first request, 15k ms from then on.
 }
        private void PageLoad()
        {
            var editPossible = !RequestEmbedded;
            var isExtenral = false;

            File file;
            var fileUri = string.Empty;

            try
            {
                if (string.IsNullOrEmpty(RequestFileUrl))
                {
                    _fileNew = (Request["new"] ?? "") == "true";

                    var app = ThirdPartySelector.GetAppByFileId(RequestFileId);
                    if (app == null)
                    {
                        var ver = string.IsNullOrEmpty(Request[FilesLinkUtility.Version]) ? -1 : Convert.ToInt32(Request[FilesLinkUtility.Version]);

                        file = DocumentServiceHelper.GetParams(RequestFileId, ver, RequestShareLinkKey, _fileNew, editPossible, !RequestView, out _docParams);

                        _fileNew = _fileNew && file.Version == 1 && file.ConvertedType != null && file.CreateOn == file.ModifiedOn;
                    }
                    else
                    {
                        isExtenral = true;

                        bool editable;
                        _thirdPartyApp = true;
                        file = app.GetFile(RequestFileId, out editable);
                        file = DocumentServiceHelper.GetParams(file, true, true, true, editable, editable, editable, out _docParams);

                        _docParams.FileUri = app.GetFileStreamUrl(file);
                        _docParams.FolderUrl = string.Empty;
                    }
                }
                else
                {
                    isExtenral = true;

                    fileUri = RequestFileUrl;
                    var fileTitle = Request[FilesLinkUtility.FileTitle];
                    if (string.IsNullOrEmpty(fileTitle))
                        fileTitle = Path.GetFileName(HttpUtility.UrlDecode(fileUri)) ?? "";

                    if (CoreContext.Configuration.Standalone)
                    {
                        try
                        {
                            var webRequest = WebRequest.Create(RequestFileUrl);
                            using (var response = webRequest.GetResponse())
                            using (var responseStream = new ResponseStream(response))
                            {
                                var externalFileKey = DocumentServiceConnector.GenerateRevisionId(RequestFileUrl);
                                fileUri = DocumentServiceConnector.GetExternalUri(responseStream, MimeMapping.GetMimeMapping(fileTitle), externalFileKey);
                            }
                        }
                        catch (Exception error)
                        {
                            Global.Logger.Error("Cannot receive external url for \"" + RequestFileUrl + "\"", error);
                        }
                    }

                    file = new File
                        {
                            ID = RequestFileUrl,
                            Title = Global.ReplaceInvalidCharsAndTruncate(fileTitle)
                        };

                    file = DocumentServiceHelper.GetParams(file, true, true, true, false, false, false, out _docParams);
                    _docParams.CanEdit = editPossible && !CoreContext.Configuration.Standalone;
                    _editByUrl = true;

                    _docParams.FileUri = fileUri;
                }
            }
            catch (Exception ex)
            {
                _errorMessage = ex.Message;
                return;
            }

            if (_docParams.ModeWrite && FileConverter.MustConvert(file))
            {
                try
                {
                    file = FileConverter.ExecDuplicate(file, RequestShareLinkKey);
                }
                catch (Exception e)
                {
                    _docParams = null;
                    _errorMessage = e.Message;
                    return;
                }

                var comment = "#message/" + HttpUtility.UrlEncode(FilesCommonResource.CopyForEdit);

                Response.Redirect(FilesLinkUtility.GetFileWebEditorUrl(file.ID) + comment);
                return;
            }

            Title = file.Title;

            if (string.IsNullOrEmpty(_docParams.FolderUrl))
            {
                _docParams.FolderUrl = Request[FilesLinkUtility.FolderUrl] ?? "";
            }
            if (MobileDetector.IsRequestMatchesMobile(true))
            {
                _docParams.FolderUrl = string.Empty;
            }

            if (RequestEmbedded)
            {
                _docParams.Type = DocumentServiceParams.EditorType.Embedded;

                var shareLinkParam = "&" + FilesLinkUtility.DocShareKey + "=" + RequestShareLinkKey;
                _docParams.ViewerUrl = CommonLinkUtility.GetFullAbsolutePath(FilesLinkUtility.FilesBaseAbsolutePath + FilesLinkUtility.EditorPage + "?" + FilesLinkUtility.Action + "=view" + shareLinkParam);
                _docParams.DownloadUrl = CommonLinkUtility.GetFullAbsolutePath(FilesLinkUtility.FileHandlerPath + "?" + FilesLinkUtility.Action + "=download" + shareLinkParam);
                _docParams.EmbeddedUrl = CommonLinkUtility.GetFullAbsolutePath(FilesLinkUtility.FilesBaseAbsolutePath + FilesLinkUtility.EditorPage + "?" + FilesLinkUtility.Action + "=embedded" + shareLinkParam);
            }
            else
            {
                _docParams.Type = IsMobile ? DocumentServiceParams.EditorType.Mobile : DocumentServiceParams.EditorType.Desktop;

                if (FileSharing.CanSetAccess(file))
                {
                    _docParams.SharingSettingsUrl = CommonLinkUtility.GetFullAbsolutePath(Share.Location + "?" + FilesLinkUtility.FileId + "=" + file.ID);
                }
            }

            if (!isExtenral)
            {
                _docKeyForTrack = DocumentServiceHelper.GetDocKey(file.ID, -1, DateTime.MinValue);

                FileMarker.RemoveMarkAsNew(file);
            }

            if (_docParams.ModeWrite)
            {
                _tabId = FileTracker.Add(file.ID, _fileNew);
                _fixedVersion = FileTracker.FixedVersion(file.ID);
                _docParams.FileChoiceUrl = CommonLinkUtility.GetFullAbsolutePath(FileChoice.Location) + "?" + FileChoice.DocumentTypeParam + "=" + FilterType.SpreadsheetsOnly;
            }
            else
            {
                _docParams.LinkToEdit = _editByUrl
                                            ? CommonLinkUtility.GetFullAbsolutePath(FilesLinkUtility.GetFileWebEditorExternalUrl(fileUri, file.Title))
                                            : CommonLinkUtility.GetFullAbsolutePath(FilesLinkUtility.GetFileWebEditorUrl(file.ID));

                if (FileConverter.MustConvert(_docParams.File)) _editByUrl = true;
            }
        }
        private static void StoringFileAfterError(string fileId, string userId, string downloadUri)
        {
            try
            {
                var fileName = fileId + FileUtility.GetFileExtension(downloadUri);
                var path = string.Format(@"save_crash\{0}\{1}_{2}",
                                         DateTime.UtcNow.ToString("yyyy_MM_dd"),
                                         userId,
                                         fileName);

                var store = Global.GetStore();
                var req = (HttpWebRequest)WebRequest.Create(downloadUri);
                using (var fileStream = new ResponseStream(req.GetResponse()))
                {
                    store.Save(FileConstant.StorageDomainTmp, path, fileStream);
                }
                Global.Logger.DebugFormat("DocService storing to {0}", path);
            }
            catch (Exception ex)
            {
                Global.Logger.Error("DocService Error on save file to temp store", ex);
            }
        }
Exemple #53
0
 public Response(CancellationToken clientToken, Action flush)
 {
     _clientToken = clientToken;
     _stream = new ResponseStream();
     _flush = flush;
 }
        internal void Close(bool force)
        {
            if (_socket != null) {
                if (_outputStream != null) {
                    _outputStream.Close ();
                    _outputStream = null;
                }

                force |= !_context.Request.KeepAlive;
                if (!force)
                    force = _context.Response.Headers ["Connection"] == "close";

                if (!force && _context.Request.FlushInput ()) {
                    if (_chunked && !_context.Response.ForceCloseChunked) {
                        // Don't close. Keep working.
                        _reuses++;
                        Unbind ();
                        Init ();
                        BeginReadRequest ();

                        return;
                    }

            //					_reuses++;
            //					Unbind ();
            //					Init ();
            //					BeginReadRequest ();
            //
            //					return;
                }

                var socket = _socket;
                _socket = null;
                try {
                    if (socket != null)
                        socket.Shutdown (SocketShutdown.Both);
                } catch {
                } finally {
                    if (socket != null)
                        socket.Close ();
                }

                Unbind ();
                RemoveConnection ();

                return;
            }
        }
    private void disposeStream ()
    {
      if (_stream == null)
        return;

      _inputStream = null;
      _outputStream = null;

      _stream.Dispose ();
      _stream = null;
    }
    internal void Close (bool force)
    {
      if (_socket != null) {
        if (_outputStream != null) {
          _outputStream.Close ();
          _outputStream = null;
        }

        var req = _context.Request;
        var res = _context.Response;
        force |= !req.KeepAlive;
        if (!force)
          force = res.Headers ["Connection"] == "close";

        if (!force &&
            req.FlushInput () &&
            (!_chunked || (_chunked && !res.ForceCloseChunked))) {
          // Don't close. Keep working.
          _reuses++;
          unbind ();
          init ();
          BeginReadRequest ();

          return;
        }

        var socket = _socket;
        _socket = null;
        try {
          socket.Shutdown (SocketShutdown.Both);
        }
        catch {
        }
        finally {
          if (socket != null)
            socket.Close ();
        }

        unbind ();
        removeConnection ();

        return;
      }
    }
    public ResponseStream GetResponseStream ()
    {
      // TODO: Can we get this stream before reading the input?

      if (_outputStream != null || _socket == null)
        return _outputStream;

      lock (_sync) {
        if (_socket == null)
          return _outputStream;

        var lsnr = _context.Listener;
        var ignore = lsnr != null ? lsnr.IgnoreWriteExceptions : true;
        _outputStream = new ResponseStream (_stream, _context.Response, ignore);

        return _outputStream;
      }
    }
		internal void SendHeaders (bool closing, MemoryStream ms)
		{
			//TODO: When do we send KeepAlive?
			Encoding encoding = content_encoding;
			if (encoding == null)
				encoding = Encoding.Default;

			if (content_type != null) {
				if (content_encoding != null && content_type.IndexOf ("charset=") == -1) {
					string enc_name = content_encoding.WebName;
					headers.SetInternal ("Content-Type", content_type + "; charset=" + enc_name);
				} else {
					headers.SetInternal ("Content-Type", content_type);
				}
			}

			if (headers ["Server"] == null)
				headers.SetInternal ("Server", "Mono-HTTPAPI/1.0");

			CultureInfo inv = CultureInfo.InvariantCulture;
			if (headers ["Date"] == null)
				headers.SetInternal ("Date", DateTime.UtcNow.ToString ("r", inv));

			if (!chunked) {
				if (!cl_set && closing) {
					cl_set = true;
					content_length = 0;
				}

				if (cl_set)
					headers.SetInternal ("Content-Length", content_length.ToString (inv));
			}

			Version v = context.Request.ProtocolVersion;
			if (!cl_set && !chunked && v >= HttpVersion.Version11)
				chunked = true;
				
			/* Apache forces closing the connection for these status codes:
			 *	HttpStatusCode.BadRequest 		400
			 *	HttpStatusCode.RequestTimeout 		408
			 *	HttpStatusCode.LengthRequired 		411
			 *	HttpStatusCode.RequestEntityTooLarge 	413
			 *	HttpStatusCode.RequestUriTooLong 	414
			 *	HttpStatusCode.InternalServerError 	500
			 *	HttpStatusCode.ServiceUnavailable 	503
			 */
			bool conn_close = (status_code == 400 || status_code == 408 || status_code == 411 ||
					status_code == 413 || status_code == 414 || status_code == 500 ||
					status_code == 503);

			if (conn_close == false) {
				conn_close = (context.Request.Headers ["connection"] == "close");
				conn_close |= (v <= HttpVersion.Version10);
			}

			// They sent both KeepAlive: true and Connection: close!?
			if (!keep_alive || conn_close)
				headers.SetInternal ("Connection", "close");

			if (chunked)
				headers.SetInternal ("Transfer-Encoding", "chunked");

			int chunked_uses = context.Connection.ChunkedUses;
			if (chunked_uses >= 100) {
				force_close_chunked = true;
				if (!conn_close)
					headers.SetInternal ("Connection", "close");
			}

			if (location != null)
				headers.SetInternal ("Location", location);

			if (cookies != null) {
				bool firstDone = false;
				StringBuilder cookieSB = new StringBuilder ();
				foreach (Cookie cookie in cookies) {
					if (firstDone)
						cookieSB.Append (",");
					firstDone = true;
					cookieSB.Append (MonoHttp.Utility.ToClientString (cookie));
				}
				headers.SetInternal("Set-Cookie2", cookieSB.ToString ());
			}

			StreamWriter writer = new StreamWriter (ms, encoding);
			writer.Write ("HTTP/{0} {1} {2}\r\n", version, status_code, status_description);
			string headers_str = headers.ToString ();
			writer.Write (headers_str);
			writer.Flush ();
			int preamble = encoding.GetPreamble ().Length;
			if (output_stream == null)
				output_stream = context.Connection.GetResponseStream ();

			/* Assumes that the ms was at position 0 */
			ms.Position = preamble;
			HeadersSent = true;
		}
 void Init()
 {
     context_bound = false;
     i_stream      = null;
     o_stream      = null;
     prefix        = null;
     chunked       = false;
     ms            = new MemoryStream ();
     position      = 0;
     input_state   = InputState.RequestLine;
     line_state    = LineState.None;
     context       = new HttpListenerContext (this);
     s_timeout     = 90000; // 90k ms for first request, 15k ms from then on
 }
        public ResponseStream GetResponseStream()
        {
            // TODO: Can we get this stream before reading the input?
            if (_outputStream == null) {
                var listener = _context.Listener;
                var ignore = listener == null ? true : listener.IgnoreWriteExceptions;
                _outputStream = new ResponseStream (_stream, _context.Response, ignore);
            }

            return _outputStream;
        }