示例#1
0
        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
            }
        }