private async Task ProcessRequest(Stream stream)
        {
            using (var textReader = new StreamReader(stream))
            {
                using (var jsonReader = new JsonTextReader(textReader))
                {
                    var requestPayload = Serializer.Deserialize <RequestPayload>(jsonReader);

                    var request = new ReceiveRequest()
                    {
                        Verb    = requestPayload.Verb,
                        Path    = requestPayload.Path,
                        Streams = new List <IContentStream>(),
                    };

                    if (requestPayload.Streams != null)
                    {
                        foreach (var streamDescription in requestPayload.Streams)
                        {
                            if (!Guid.TryParse(streamDescription.Id, out Guid id))
                            {
                                throw new InvalidDataException($"Stream description id '{streamDescription.Id}' is not a Guid");
                            }

                            var streamAssembler = _streamManager.GetPayloadAssembler(id);
                            streamAssembler.ContentType   = streamDescription.ContentType;
                            streamAssembler.ContentLength = streamDescription.Length;

                            request.Streams.Add(new ContentStream(id, streamAssembler)
                            {
                                Length      = streamDescription.Length,
                                ContentType = streamDescription.ContentType,
                            });
                        }
                    }

                    await _onCompleted(this.Id, request).ConfigureAwait(false);
                }
            }
        }