internal bool Read( RequestMetadata md, ContainerClient client, string objectName, long?indexStart, int?count, out string contentType, out long contentLength, out Stream stream, out ErrorCode error) { error = ErrorCode.None; contentType = null; contentLength = 0; stream = null; if (md == null) { throw new ArgumentNullException(nameof(md)); } if (client == null) { throw new ArgumentNullException(nameof(client)); } if (String.IsNullOrEmpty(objectName)) { throw new ArgumentNullException(nameof(objectName)); } string header = _Header + "Read " + client.Container.UserGUID + "/" + client.Container.Name + "/" + objectName + " "; if (!_Locks.AddReadLock(md)) { _Logging.Warn(header + "unable to add read lock"); return(false); } if (indexStart != null && count != null) { #region Range-Read if (!client.ReadRangeObject(objectName, Convert.ToInt64(indexStart), Convert.ToInt32(count), out contentType, out stream, out error)) { _Logging.Warn(header + "unable to read range: " + error.ToString()); _Locks.RemoveReadLock(md); return(false); } else { _Locks.RemoveReadLock(md); string logData = "Source: " + md.Http.Request.SourceIp + ":" + md.Http.Request.SourcePort + " " + "User: "******" Index: " + indexStart; logData += " Count: " + count; client.AddAuditLogEntry(objectName, AuditLogEntryType.ReadRange, logData, false); contentLength = (long)count; return(true); } #endregion } else { #region Full-Read if (!client.ReadObject(objectName, out contentType, out contentLength, out stream, out error)) { _Logging.Warn(header + "unable to read object: " + error.ToString()); _Locks.RemoveReadLock(md); return(false); } else { _Locks.RemoveReadLock(md); string logData = "Source: " + md.Http.Request.SourceIp + ":" + md.Http.Request.SourcePort + " " + "User: " + md.Params.UserGuid; client.AddAuditLogEntry(objectName, AuditLogEntryType.Read, logData, false); return(true); } #endregion } }