Example #1
0
        /// <summary>
        /// Reads the response from the socket
        /// </summary>
        /// <param name="socket"></param>
        /// <returns></returns>
        public unsafe bool Read(PooledSocket socket)
        {
            this.StatusCode = -1;

            if (!socket.IsAlive)
            {
                return(false);
            }

            try
            {
                var header = new byte[BinaryResponse.HeaderLength];
                socket.Receive(header, 0, header.Length);

                this.DeserializeHeader(header, out var dataLength, out var extraLength);

                if (dataLength > 0)
                {
                    var data = new byte[dataLength];
                    socket.Receive(data, 0, dataLength);

                    this.Extra = new ArraySegment <byte>(data, 0, extraLength);
                    this.Data  = new ArraySegment <byte>(data, extraLength, data.Length - extraLength);
                }

                return(this.StatusCode == 0);
            }
            catch (Exception ex)
            {
                this._logger.LogError(ex, "Read: Error occurred while reading socket");
                throw;
            }
        }
Example #2
0
        public static GetResponse ReadItem(PooledSocket socket)
        {
            var description = TextSocketHelper.ReadResponse(socket);

            if (String.Compare(description, "END", StringComparison.Ordinal) == 0)
            {
                return(null);
            }

            else if (description.Length < 6 || String.Compare(description, 0, "VALUE ", 0, 6, StringComparison.Ordinal) != 0)
            {
                throw new MemcachedClientException("No VALUE response received.\r\n" + description);
            }

            // response is:
            // VALUE <key> <flags> <bytes> [<cas unique>]
            // 0     1     2       3       4
            //
            // cas only exists in 1.2.4+
            //

            ulong cas   = 0;
            var   parts = description.Split(' ');

            if (parts.Length == 5)
            {
                if (!UInt64.TryParse(parts[4], out cas))
                {
                    throw new MemcachedClientException("Invalid CAS VALUE received.");
                }
            }
            else if (parts.Length < 4)
            {
                throw new MemcachedClientException("Invalid VALUE response received: " + description);
            }

            var flags  = UInt16.Parse(parts[2], CultureInfo.InvariantCulture);
            var length = Int32.Parse(parts[3], CultureInfo.InvariantCulture);

            var allData = new byte[length];
            var eod     = new byte[2];

            socket.Receive(allData, 0, length);
            socket.Receive(eod, 0, 2);             // data is terminated by \r\n

            var result = new GetResponse(parts[1], flags, cas, allData);

            GetHelper.Logger = GetHelper.Logger ?? Caching.Logger.CreateLogger(typeof(GetHelper));
            if (GetHelper.Logger.IsEnabled(LogLevel.Debug))
            {
                GetHelper.Logger.LogDebug("Received value. Data type: {0}, size: {1}.", result.Item.Flags, result.Item.Data.Count);
            }

            return(result);
        }
Example #3
0
        /// <summary>
        /// Reads a line from the socket. A line is terninated by \r\n.
        /// </summary>
        /// <returns></returns>
        static string ReadLine(PooledSocket socket)
        {
            using (var stream = new MemoryStream(50))
            {
                var  gotR = false;
                byte data;

                while (true)
                {
                    data = socket.Receive();

                    if (data == 13)
                    {
                        gotR = true;
                        continue;
                    }

                    if (gotR)
                    {
                        if (data == 10)
                        {
                            break;
                        }

                        stream.WriteByte(13);

                        gotR = false;
                    }

                    stream.WriteByte(data);
                }

                var result = Encoding.ASCII.GetString(stream.ToArray(), 0, (int)stream.Length);

                Logger = Logger ?? Caching.Logger.CreateLogger(typeof(TextSocketHelper));
                if (Logger.IsEnabled(LogLevel.Debug))
                {
                    Logger.LogDebug("ReadLine: " + result);
                }

                return(result);
            }
        }