예제 #1
0
        public StreamContent(IStreamContent content, CancellationToken cancellationToken)
        {
            this.content           = content;
            this.cancellationToken = cancellationToken;

            Headers.ContentLength = content.Length;
        }
예제 #2
0
 public Request(
     [NotNull] string method,
     [NotNull] Uri url,
     [CanBeNull] IStreamContent content,
     [CanBeNull] Headers headers = default)
     : this(method, url, null, content, null, headers)
 {
 }
        private async Task <HttpActionStatus> SendStreamedBodyAsync(IStreamContent content, WebRequestState state, CancellationToken cancellationToken)
        {
            var bodyStream  = content.Stream;
            var bytesToSend = content.Length ?? long.MaxValue;
            var bytesSent   = 0L;

            using (BufferPool.Default.Rent(Constants.BufferSize, out var buffer))
            {
                while (bytesSent < bytesToSend)
                {
                    var bytesToRead = (int)Math.Min(buffer.Length, bytesToSend - bytesSent);

                    int bytesRead;

                    try
                    {
                        bytesRead = await bodyStream.ReadAsync(buffer, 0, bytesToRead, cancellationToken)
                                    .ConfigureAwait(false);
                    }
                    catch (StreamAlreadyUsedException)
                    {
                        throw;
                    }
                    catch (ContentAlreadyUsedException)
                    {
                        throw;
                    }
                    catch (Exception error)
                    {
                        if (cancellationToken.IsCancellationRequested)
                        {
                            return(HttpActionStatus.RequestCanceled);
                        }

                        LogUserStreamFailure(error);

                        return(HttpActionStatus.UserStreamFailure);
                    }

                    if (bytesRead == 0)
                    {
                        break;
                    }

                    await state.RequestStream.WriteAsync(buffer, 0, bytesRead, cancellationToken).ConfigureAwait(false);

                    bytesSent += bytesRead;
                }
            }

            return(HttpActionStatus.Success);
        }
예제 #4
0
 private Request(
     [NotNull] string method,
     [NotNull] Uri url,
     [CanBeNull] CompositeContent compositeContent,
     [CanBeNull] IStreamContent streamContent,
     [CanBeNull] Content content,
     [CanBeNull] Headers headers)
 {
     Method           = method ?? throw new ArgumentNullException(nameof(method));
     Url              = url ?? throw new ArgumentNullException(nameof(url));
     CompositeContent = compositeContent;
     StreamContent    = streamContent;
     Content          = content;
     Headers          = headers;
 }
예제 #5
0
        /// <summary>
        ///     Parses the content and raises events.
        /// </summary>
        /// <param name="content"> The content. </param>
        private void ParseContent(IStreamContent content)
        {
            if (string.IsNullOrEmpty(content.Content))
            {
                LogTo.Trace("Received Keep-Alive on streaming connection");
                return;
            }

            JsonData parsed = JsonMapper.ToObject(content.Content);
            JsonData temp;

            // Was this a direct message?
            if (parsed.TryGetValue("direct_message", out temp))
            {
                LogTo.Debug("DirectMessage received");
                var handler = DirectMessageReceived;
                handler?.Invoke(this, new DirectMessageStreamEventArgs(content.Content));
            }

            // Was this a tweet?
            else if (parsed.TryGetValue("text", out temp))
            {
                LogTo.Debug("Status recevied");
                var handler = StatusReceived;
                handler?.Invoke(this, new StatusStreamEventArgs(content.Content));
            }

            // Or has something been deleted?
            else if (parsed.TryGetValue("delete", out temp))
            {
                JsonData deleted;
                if (temp.TryGetValue("status", out deleted))
                {
                    LogTo.Debug("Status deletion received");
                    var handler = StatusDeleted;
                    handler?.Invoke(this, new DeleteStreamEventArgs(content.Content));
                }
                else
                {
                    LogTo.Debug("DirectMessage deletion received");
                    var handler = DirectMessageDeleted;
                    handler?.Invoke(this, new DeleteStreamEventArgs(content.Content));
                }
            }

            // Or a different event?
            else if (parsed.TryGetValue("event", out temp))
            {
                HandleEvent(content.Content);
            }

            // Is this the friend list of the user?
            else if (parsed.TryGetValue("friends", out temp))
            {
                LogTo.Debug("Friend list received");
                var handler = FriendsReceived;
                handler?.Invoke(this, new FriendsStreamEventArgs(content.Content));
            }
            else
            {
                LogTo.Debug("Unknown data received");
                LogTo.Debug(content.Content);
                var handler = UnknownDataReceived;
                handler?.Invoke(this, new StreamEventArgs(content.Content));
            }
        }
예제 #6
0
 public Request WithContent([NotNull] IStreamContent content)
 {
     return(new Request(Method, Url, content, content.Length.HasValue ? (Headers ?? Headers.Empty).Set(HeaderNames.ContentLength, content.Length.Value) : Headers));
 }