HttpResponseMessage Send(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            HttpResponseMessage response = null;
            Curl.Easy easy = null;

            easy = new Curl.Easy {
                Protocols = Protocols.Http | Protocols.Https,
                Url = request.RequestUri.AbsoluteUri,
                AutoReferer = true,
                FollowLocation = true,
                HttpMethod = request.Method.Method,
                HttpVersion = request.Version,
                HeaderHandler = (kind, name, value) => {
                    switch (kind) {
                    case HeaderKind.Status:
                        response.StatusCode = (HttpStatusCode)easy.ResponseCode;
                        break;
                    case HeaderKind.KeyValue:
                        response.Headers.TryAddWithoutValidation (name, value);
                        response.Content.Headers.TryAddWithoutValidation (name, value);
                        break;
                    }
                }
            };

            var responseStream = new CurlResponseStream (easy);
            cancellationToken.Register (responseStream.Dispose);

            response = new HttpResponseMessage {
                Content = new StreamContent (responseStream)
            };

            return response;
        }
        HttpResponseMessage Send(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            HttpResponseMessage response = null;

            Curl.Easy easy = null;

            easy = new Curl.Easy {
                Protocols      = Protocols.Http | Protocols.Https,
                Url            = request.RequestUri.AbsoluteUri,
                AutoReferer    = true,
                FollowLocation = true,
                HttpMethod     = request.Method.Method,
                HttpVersion    = request.Version,
                HeaderHandler  = (kind, name, value) => {
                    switch (kind)
                    {
                    case HeaderKind.Status:
                        response.StatusCode = (HttpStatusCode)easy.ResponseCode;
                        break;

                    case HeaderKind.KeyValue:
                        response.Headers.TryAddWithoutValidation(name, value);
                        response.Content.Headers.TryAddWithoutValidation(name, value);
                        break;
                    }
                }
            };

            var responseStream = new CurlResponseStream(easy);

            cancellationToken.Register(responseStream.Dispose);

            response = new HttpResponseMessage {
                Content = new StreamContent(responseStream)
            };

            return(response);
        }