256 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			256 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
///////////////////////////////////////////////////////////////////////////////
 | 
						|
// Name:        wx/private/webrequest.h
 | 
						|
// Purpose:     wxWebRequest implementation classes
 | 
						|
// Author:      Vadim Zeitlin
 | 
						|
// Created:     2020-12-26
 | 
						|
// Copyright:   (c) 2020 Vadim Zeitlin <vadim@wxwidgets.org>
 | 
						|
// Licence:     wxWindows licence
 | 
						|
///////////////////////////////////////////////////////////////////////////////
 | 
						|
 | 
						|
#ifndef _WX_PRIVATE_WEBREQUEST_H_
 | 
						|
#define _WX_PRIVATE_WEBREQUEST_H_
 | 
						|
 | 
						|
#include "wx/ffile.h"
 | 
						|
#include "wx/hashmap.h"
 | 
						|
#include "wx/scopedptr.h"
 | 
						|
 | 
						|
#include "wx/private/refcountermt.h"
 | 
						|
 | 
						|
WX_DECLARE_STRING_HASH_MAP(wxString, wxWebRequestHeaderMap);
 | 
						|
 | 
						|
// Default buffer size when a fixed-size buffer must be used.
 | 
						|
const int wxWEBREQUEST_BUFFER_SIZE = 64 * 1024;
 | 
						|
 | 
						|
// Trace mask used for the messages in wxWebRequest code.
 | 
						|
#define wxTRACE_WEBREQUEST "webrequest"
 | 
						|
 | 
						|
// ----------------------------------------------------------------------------
 | 
						|
// wxWebAuthChallengeImpl
 | 
						|
// ----------------------------------------------------------------------------
 | 
						|
 | 
						|
class wxWebAuthChallengeImpl : public wxRefCounterMT
 | 
						|
{
 | 
						|
public:
 | 
						|
    virtual ~wxWebAuthChallengeImpl() { }
 | 
						|
 | 
						|
    wxWebAuthChallenge::Source GetSource() const { return m_source; }
 | 
						|
 | 
						|
    virtual void SetCredentials(const wxWebCredentials& cred) = 0;
 | 
						|
 | 
						|
protected:
 | 
						|
    explicit wxWebAuthChallengeImpl(wxWebAuthChallenge::Source source)
 | 
						|
        : m_source(source) { }
 | 
						|
 | 
						|
private:
 | 
						|
    const wxWebAuthChallenge::Source m_source;
 | 
						|
 | 
						|
    wxDECLARE_NO_COPY_CLASS(wxWebAuthChallengeImpl);
 | 
						|
};
 | 
						|
 | 
						|
// ----------------------------------------------------------------------------
 | 
						|
// wxWebRequestImpl
 | 
						|
// ----------------------------------------------------------------------------
 | 
						|
 | 
						|
class wxWebRequestImpl : public wxRefCounterMT
 | 
						|
{
 | 
						|
public:
 | 
						|
    virtual ~wxWebRequestImpl() { }
 | 
						|
 | 
						|
    void SetHeader(const wxString& name, const wxString& value)
 | 
						|
    { m_headers[name] = value; }
 | 
						|
 | 
						|
    void SetMethod(const wxString& method) { m_method = method; }
 | 
						|
 | 
						|
    void SetData(const wxString& text, const wxString& contentType, const wxMBConv& conv = wxConvUTF8);
 | 
						|
 | 
						|
    bool SetData(wxScopedPtr<wxInputStream>& dataStream, const wxString& contentType, wxFileOffset dataSize = wxInvalidOffset);
 | 
						|
 | 
						|
    void SetStorage(wxWebRequest::Storage storage) { m_storage = storage; }
 | 
						|
 | 
						|
    wxWebRequest::Storage GetStorage() const { return m_storage; }
 | 
						|
 | 
						|
    // Precondition for this method checked by caller: current state is idle.
 | 
						|
    virtual void Start() = 0;
 | 
						|
 | 
						|
    // Precondition for this method checked by caller: not idle and not already
 | 
						|
    // cancelled.
 | 
						|
    void Cancel();
 | 
						|
 | 
						|
    virtual wxWebResponseImplPtr GetResponse() const = 0;
 | 
						|
 | 
						|
    virtual wxWebAuthChallengeImplPtr GetAuthChallenge() const = 0;
 | 
						|
 | 
						|
    int GetId() const { return m_id; }
 | 
						|
 | 
						|
    wxWebSession& GetSession() const { return m_session; }
 | 
						|
 | 
						|
    wxWebRequest::State GetState() const { return m_state; }
 | 
						|
 | 
						|
    virtual wxFileOffset GetBytesSent() const = 0;
 | 
						|
 | 
						|
    virtual wxFileOffset GetBytesExpectedToSend() const = 0;
 | 
						|
 | 
						|
    virtual wxFileOffset GetBytesReceived() const;
 | 
						|
 | 
						|
    virtual wxFileOffset GetBytesExpectedToReceive() const;
 | 
						|
 | 
						|
    virtual wxWebRequestHandle GetNativeHandle() const = 0;
 | 
						|
 | 
						|
    void DisablePeerVerify(bool disable) { m_peerVerifyDisabled = disable; }
 | 
						|
 | 
						|
    bool IsPeerVerifyDisabled() const { return m_peerVerifyDisabled; }
 | 
						|
 | 
						|
    void SetState(wxWebRequest::State state, const wxString& failMsg = wxString());
 | 
						|
 | 
						|
    void ReportDataReceived(size_t sizeReceived);
 | 
						|
 | 
						|
    wxEvtHandler* GetHandler() const { return m_handler; }
 | 
						|
 | 
						|
    void ProcessStateEvent(wxWebRequest::State state, const wxString& failMsg);
 | 
						|
 | 
						|
protected:
 | 
						|
    wxString m_method;
 | 
						|
    wxWebRequest::Storage m_storage;
 | 
						|
    wxWebRequestHeaderMap m_headers;
 | 
						|
    wxFileOffset m_dataSize;
 | 
						|
    wxScopedPtr<wxInputStream> m_dataStream;
 | 
						|
    bool m_peerVerifyDisabled;
 | 
						|
 | 
						|
    wxWebRequestImpl(wxWebSession& session,
 | 
						|
                     wxWebSessionImpl& sessionImpl,
 | 
						|
                     wxEvtHandler* handler,
 | 
						|
                     int id);
 | 
						|
 | 
						|
    bool WasCancelled() const { return m_cancelled; }
 | 
						|
 | 
						|
    // Call SetState() with either State_Failed or State_Completed appropriate
 | 
						|
    // for the response status.
 | 
						|
    void SetFinalStateFromStatus();
 | 
						|
 | 
						|
private:
 | 
						|
    // Called from public Cancel() at most once per object.
 | 
						|
    virtual void DoCancel() = 0;
 | 
						|
 | 
						|
    wxWebSession& m_session;
 | 
						|
    wxEvtHandler* const m_handler;
 | 
						|
    const int m_id;
 | 
						|
    wxWebRequest::State m_state;
 | 
						|
    wxFileOffset m_bytesReceived;
 | 
						|
    wxCharBuffer m_dataText;
 | 
						|
 | 
						|
    // Initially false, set to true after the first call to Cancel().
 | 
						|
    bool m_cancelled;
 | 
						|
 | 
						|
    wxDECLARE_NO_COPY_CLASS(wxWebRequestImpl);
 | 
						|
};
 | 
						|
 | 
						|
// ----------------------------------------------------------------------------
 | 
						|
// wxWebResponseImpl
 | 
						|
// ----------------------------------------------------------------------------
 | 
						|
 | 
						|
class wxWebResponseImpl : public wxRefCounterMT
 | 
						|
{
 | 
						|
public:
 | 
						|
    virtual ~wxWebResponseImpl();
 | 
						|
 | 
						|
    virtual wxFileOffset GetContentLength() const = 0;
 | 
						|
 | 
						|
    virtual wxString GetURL() const = 0;
 | 
						|
 | 
						|
    virtual wxString GetHeader(const wxString& name) const = 0;
 | 
						|
 | 
						|
    virtual wxString GetMimeType() const;
 | 
						|
 | 
						|
    virtual int GetStatus() const = 0;
 | 
						|
 | 
						|
    virtual wxString GetStatusText() const = 0;
 | 
						|
 | 
						|
    virtual wxInputStream* GetStream() const;
 | 
						|
 | 
						|
    virtual wxString GetSuggestedFileName() const;
 | 
						|
 | 
						|
    wxString AsString() const;
 | 
						|
 | 
						|
    virtual wxString GetDataFile() const;
 | 
						|
 | 
						|
protected:
 | 
						|
    wxWebRequestImpl& m_request;
 | 
						|
    size_t m_readSize;
 | 
						|
 | 
						|
    explicit wxWebResponseImpl(wxWebRequestImpl& request);
 | 
						|
 | 
						|
    // Called from derived class ctor to finish initialization which can't be
 | 
						|
    // performed in ctor itself as it needs to use pure virtual method.
 | 
						|
    void Init();
 | 
						|
 | 
						|
    void* GetDataBuffer(size_t sizeNeeded);
 | 
						|
 | 
						|
    void ReportDataReceived(size_t sizeReceived);
 | 
						|
 | 
						|
private:
 | 
						|
    // Called by wxWebRequestImpl only.
 | 
						|
    friend class wxWebRequestImpl;
 | 
						|
    void Finalize();
 | 
						|
 | 
						|
    wxMemoryBuffer m_readBuffer;
 | 
						|
    mutable wxFFile m_file;
 | 
						|
    mutable wxScopedPtr<wxInputStream> m_stream;
 | 
						|
 | 
						|
    wxDECLARE_NO_COPY_CLASS(wxWebResponseImpl);
 | 
						|
};
 | 
						|
 | 
						|
// ----------------------------------------------------------------------------
 | 
						|
// wxWebSessionFactory
 | 
						|
// ----------------------------------------------------------------------------
 | 
						|
 | 
						|
class wxWebSessionFactory
 | 
						|
{
 | 
						|
public:
 | 
						|
    virtual wxWebSessionImpl* Create() = 0;
 | 
						|
 | 
						|
    virtual ~wxWebSessionFactory() { }
 | 
						|
};
 | 
						|
 | 
						|
// ----------------------------------------------------------------------------
 | 
						|
// wxWebSessionImpl
 | 
						|
// ----------------------------------------------------------------------------
 | 
						|
 | 
						|
class wxWebSessionImpl : public wxRefCounterMT
 | 
						|
{
 | 
						|
public:
 | 
						|
    virtual ~wxWebSessionImpl() { }
 | 
						|
 | 
						|
    virtual wxWebRequestImplPtr
 | 
						|
    CreateRequest(wxWebSession& session,
 | 
						|
                  wxEvtHandler* handler,
 | 
						|
                  const wxString& url,
 | 
						|
                  int id) = 0;
 | 
						|
 | 
						|
    virtual wxVersionInfo GetLibraryVersionInfo() = 0;
 | 
						|
 | 
						|
    void AddCommonHeader(const wxString& name, const wxString& value)
 | 
						|
        { m_headers[name] = value; }
 | 
						|
 | 
						|
    void SetTempDir(const wxString& dir) { m_tempDir = dir; }
 | 
						|
 | 
						|
    wxString GetTempDir() const;
 | 
						|
 | 
						|
    const wxWebRequestHeaderMap& GetHeaders() const { return m_headers; }
 | 
						|
 | 
						|
    virtual wxWebSessionHandle GetNativeHandle() const = 0;
 | 
						|
 | 
						|
protected:
 | 
						|
    wxWebSessionImpl();
 | 
						|
 | 
						|
private:
 | 
						|
    // Make it a friend to allow accessing our m_headers.
 | 
						|
    friend class wxWebRequest;
 | 
						|
 | 
						|
    wxWebRequestHeaderMap m_headers;
 | 
						|
    wxString m_tempDir;
 | 
						|
 | 
						|
    wxDECLARE_NO_COPY_CLASS(wxWebSessionImpl);
 | 
						|
};
 | 
						|
 | 
						|
#endif // _WX_PRIVATE_WEBREQUEST_H_
 |