[Curl] Reimplement CurlDownload with CurlRequest
[WebKit-https.git] / Source / WebCore / platform / network / curl / CurlDownload.h
1 /*
2  * Copyright (C) 2013 Apple Inc.  All rights reserved.
3  * Copyright (C) 2017 Sony Interactive Entertainment Inc.
4  * Copyright (C) 2017 NAVER Corp.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
16  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
19  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
23  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
26  */
27
28 #pragma once
29
30 #if USE(CURL)
31
32 #include "CurlRequest.h"
33 #include "CurlRequestDelegate.h"
34 #include "ResourceRequest.h"
35 #include "ResourceResponse.h"
36
37 namespace WebCore {
38
39 class CurlRequest;
40 class ResourceHandle;
41
42 class CurlDownloadListener {
43 public:
44     virtual void didReceiveResponse(const ResourceResponse&) { }
45     virtual void didReceiveDataOfLength(int) { }
46     virtual void didFinish() { }
47     virtual void didFail() { }
48 };
49
50 class CurlDownload : public ThreadSafeRefCounted<CurlDownload>, public CurlRequestDelegate {
51 public:
52     CurlDownload() = default;
53     ~CurlDownload();
54
55     void init(CurlDownloadListener&, const URL&);
56     void init(CurlDownloadListener&, ResourceHandle*, const ResourceRequest&, const ResourceResponse&);
57
58     void setListener(CurlDownloadListener* listener) { m_listener = listener; }
59
60     bool start();
61     bool cancel();
62
63     bool deletesFileUponFailure() const { return m_deletesFileUponFailure; }
64     void setDeletesFileUponFailure(bool deletesFileUponFailure) { m_deletesFileUponFailure = deletesFileUponFailure; }
65
66     void setDestination(const String& destination) { m_destination = destination; }
67
68 private:
69     Ref<CurlRequest> createCurlRequest(ResourceRequest&);
70     void curlDidReceiveResponse(const CurlResponse&) override;
71     void curlDidReceiveBuffer(Ref<SharedBuffer>&&) override;
72     void curlDidComplete() override;
73     void curlDidFailWithError(const ResourceError&) override;
74
75     bool shouldRedirectAsGET(const ResourceRequest&, bool crossOrigin);
76     void willSendRequest();
77
78     CurlDownloadListener* m_listener { nullptr };
79     bool m_isCancelled { false };
80
81     ResourceRequest m_request;
82     ResourceResponse m_response;
83     bool m_deletesFileUponFailure { false };
84     String m_destination;
85     unsigned m_redirectCount { 0 };
86     RefPtr<CurlRequest> m_curlRequest;
87 };
88
89 } // namespace WebCore
90
91 #endif