Gray C++ Libraries  0.0.2
A set of C++ libraries for MSVC, GNU on Windows, WinCE, Linux
cHttpClient.h
Go to the documentation of this file.
1 //
4 //
5 #ifndef _INC_cHttpClient_H
6 #define _INC_cHttpClient_H
7 #ifndef NO_PRAGMA_ONCE
8 #pragma once
9 #endif
10 
11 #include "cHttpHeader.h"
12 #include "../Net/cNetURL.h"
13 #include "../Net/cNetStream.h"
15 #include "GrayCore/include/cFile.h"
18 #include "GrayCore/include/cMime.h"
19 
20 namespace GrayLib
21 {
23 
25  {
28 
29  public:
30  static const StrLen_t k_nLenBoundaryPrefix = 2;
31  static const StrLen_t k_nLenBoundary = (8 + 16);
32 
35 
36  protected:
37  virtual size_t get_BodyLength() const = 0;
38  virtual HRESULT WriteBody(cStreamOutput* pClient, IStreamProgressCallback* pProgress = nullptr) = 0;
39 
40  public:
41  static void GRAYCALL CreateBoundary(OUT char* pszBoundary);
42  static StrLen_t GRAYCALL GetBoundarySize();
43  static HRESULT GRAYCALL WriteBoundary(cStreamOutput* pClient, const char* pszBoundary);
44 
45  cHttpPart(MIME_TYPE eContentType = MIME_TEXT, cStringA sContentDisposition = "")
46  : m_eContentType(eContentType)
47  , m_sContentDisposition(sContentDisposition)
48  {
49  }
50  virtual ~cHttpPart()
51  {
52  }
53 
54  size_t get_PartLength() const;
55  HRESULT WritePart(cStreamOutput* pClient, const char* pszBoundary, IStreamProgressCallback* pProgress = nullptr);
56  };
57 
59  {
62  public:
64 
65  public:
66  cHttpPartStr(MIME_TYPE eContentType = MIME_TEXT, cStringA sContentDisposition = "")
67  : cHttpPart(eContentType, sContentDisposition)
68  {
69  }
70  virtual ~cHttpPartStr()
71  {
72  }
73  virtual size_t get_BodyLength() const
74  {
75  return m_sBody.GetLength();
76  }
77  virtual HRESULT WriteBody(cStreamOutput* pClient, IStreamProgressCallback* pProgress = nullptr)
78  {
79  UNREFERENCED_PARAMETER(pProgress);
80  if (pClient == nullptr)
81  return E_POINTER;
82  return pClient->WriteString(m_sBody);
83  }
84  };
85 
87  {
90  public:
92  public:
93  cHttpPartFile(MIME_TYPE eContentType = MIME_TEXT, cStringA sContentDisposition = "")
94  : cHttpPart(eContentType, sContentDisposition)
95  {
96  }
97  virtual ~cHttpPartFile()
98  {
99  }
100  virtual size_t get_BodyLength() const
101  {
102  return m_File.GetLength();
103  }
104  virtual HRESULT WriteBody(cStreamOutput* pClient, IStreamProgressCallback* pProgress = nullptr)
105  {
106  if (pClient == nullptr)
107  return E_POINTER;
108  return pClient->WriteStream(m_File, UINT_MAX, pProgress);
109  }
110  };
111 
113  {
116 
117  public:
118  static const size_t k_MaxChunkSize = 1024 * 1024;
119 
121 
125 
126 #ifdef USE_ZLIB
129 #endif
130 
131  public:
132  cHttpClientBody(bool bTransferEncodingChunked)
133  : m_bTransferEncodingChunked(bTransferEncodingChunked)
134  , m_bWaitForChunkHeader(bTransferEncodingChunked)
135  , m_TransferChunk(0, 0)
136  {
137  }
138 
139  HRESULT InitContentEncoding(cStringA sContentEncoding, STREAM_POS_t nTotal);
140  };
141 
143  : public IFileCopier
144  , public cHttpCommon
145  {
151 
152  public:
153  const char* const m_pszAgentName;
155 
156  protected:
158 
159  public:
160  cHttpClient(cStream* pStream = nullptr, const char* pszServerURL = nullptr, const char* pszAgentName = GRAY_NAMES);
161  virtual ~cHttpClient();
162 
163  void AttachStream(cStream* pStream)
164  {
165  // redirect to another stream. Maybe for SSL.
166  m_pStream = pStream;
167  }
169  {
170  return m_pStream;
171  }
172 
173  static StrLen_t GRAYCALL Encode_POST(char* pszArgs, StrLen_t nLenMax, const cIniSectionData& args);
174 
175  HRESULT Send_GET(HTTPVERB_TYPE eVerb, cStringA sObject);
176  HRESULT Send_POST(const char* pszReferer, const char* pszArgs, StrLen_t nLenArgs);
177  HRESULT Send_POST(const char* pszReferer, const cIniSectionData& args);
178  HRESULT Send_POST(cHttpPart** ppParts, int iParts, IStreamProgressCallback* pProgress = nullptr);
179 
180  // IFileCopier
181  virtual cStringA get_ConnectName() const override;
182  virtual HRESULT Connect(const FILECHAR_t* pszServerURL) override;
183  virtual HRESULT RequestFile(const FILECHAR_t* pszSrcName, const FILECHAR_t* pszDestPath, IStreamProgressCallback* pProgress, FILE_SIZE_t nOffsetStart, FILE_SIZE_t* pnRequestSizeEst) override;
184  virtual HRESULT SendFile(const FILECHAR_t* pszSrcPath, const FILECHAR_t* pszDestName, IStreamProgressCallback* pProgress, FILE_SIZE_t nOffsetStart, FILE_SIZE_t nSize) override;
185 
186  HRESULT WaitForHeader(OUT cHttpHeaderServer& Head, IStreamProgressCallback* pProgress, TIMESYSD_t timeout = cTimeSys::k_DMAX);
187  HRESULT ReadBodyChunk(cHttpClientBody& body);
188  HRESULT WaitForBody(const cHttpHeader& Head, cStreamOutput* psBody, IStreamProgressCallback* pProgress, OUT FILE_SIZE_t* pnRequestSizeEst);
189  HRESULT WaitForResponse(OUT cHttpHeaderServer& Head, cStreamOutput* psBody, IStreamProgressCallback* pProgress, FILE_SIZE_t* pnRequestSizeEst);
190 
192  };
193 
195  {
199  typedef cHttpClient SUPER_t;
200 
201  public:
203 
204  public:
205  cHttpCopier(const char* pszServerURL = nullptr, const char* pszAgentName = GRAY_NAMES);
206  virtual ~cHttpCopier();
207 
208  virtual HRESULT Connect(const FILECHAR_t* pszServerURL) override;
209  void Close();
210 
211  bool isConnected() const
212  {
213  // ASSUME m_pStream == m_Stream;
214  return m_Stream.isConnected();
215  }
216  };
217 }
218 #endif // _INC_cHttpClient_H
#define GRAYCALL
declare calling convention for static functions so everyone knows the arg passing scheme....
Definition: GrayCore.h:36
#define GRAY_NAMES
Use GRAYNAME for string.
Definition: GrayCore.h:34
#define GRAYLIB_LINK
Definition: GrayLibBase.h:35
#define UNREFERENCED_PARAMETER(P)
< _WIN32 type thing. get rid of stupid warning.
Definition: SysTypes.h:299
INT32 HRESULT
_WIN32 style error codes. INT32
Definition: SysTypes.h:465
Definition: cHttpClient.h:113
cStreamQueue m_DecoderQueue
Must create an intermediate queue for processing chunked data with m_pDecoder.
Definition: cHttpClient.h:127
cStreamProgress m_TransferChunk
Progress of the current m_bTransferEncodingChunked.
Definition: cHttpClient.h:124
bool m_bTransferEncodingChunked
Are we chunk encoding? HTTP_TAG_TransferEncoding.
Definition: cHttpClient.h:122
cNewPtr< cStreamInput > m_pDecoder
Content-Encoding: deflate or gzip.
Definition: cHttpClient.h:128
cHeapBlock m_datablock
Definition: cHttpClient.h:120
cHttpClientBody(bool bTransferEncodingChunked)
Definition: cHttpClient.h:132
bool m_bWaitForChunkHeader
expecting a chunk header next?
Definition: cHttpClient.h:123
Definition: cHttpClient.h:145
cStream * get_Stream() const
Definition: cHttpClient.h:168
cNetURL m_url
The name of the host we are talking to. cNetAddrName -> cNetAddress.
Definition: cHttpClient.h:154
UNITTEST_FRIEND(cHttpClient)
void AttachStream(cStream *pStream)
Definition: cHttpClient.h:163
cStream * m_pStream
the data stream to/from the HTTP server. may be cNetSocket -> cNetStream (or SSL or other)
Definition: cHttpClient.h:157
const char *const m_pszAgentName
Who are we. Who is asking? e.g. I am a browser.
Definition: cHttpClient.h:153
Definition: cHttpClient.h:195
bool isConnected() const
Definition: cHttpClient.h:211
cNetStream m_Stream
cNetStream = a cNetSocket i can Seek() on.
Definition: cHttpClient.h:202
Definition: cHttpHeader.h:160
Definition: cHttpHeader.h:90
Definition: cHttpClient.h:87
virtual size_t get_BodyLength() const
Definition: cHttpClient.h:100
cHttpPartFile(MIME_TYPE eContentType=MIME_TEXT, cStringA sContentDisposition="")
Definition: cHttpClient.h:93
virtual HRESULT WriteBody(cStreamOutput *pClient, IStreamProgressCallback *pProgress=nullptr)
Definition: cHttpClient.h:104
cFile m_File
The local source file for the body data.
Definition: cHttpClient.h:91
virtual ~cHttpPartFile()
Definition: cHttpClient.h:97
Definition: cHttpClient.h:59
virtual ~cHttpPartStr()
Definition: cHttpClient.h:70
virtual size_t get_BodyLength() const
Definition: cHttpClient.h:73
virtual HRESULT WriteBody(cStreamOutput *pClient, IStreamProgressCallback *pProgress=nullptr)
Definition: cHttpClient.h:77
cStringA m_sBody
The body data string.
Definition: cHttpClient.h:63
cHttpPartStr(MIME_TYPE eContentType=MIME_TEXT, cStringA sContentDisposition="")
Definition: cHttpClient.h:66
Definition: cHttpClient.h:25
virtual size_t get_BodyLength() const =0
cHttpPart(MIME_TYPE eContentType=MIME_TEXT, cStringA sContentDisposition="")
Definition: cHttpClient.h:45
virtual ~cHttpPart()
Definition: cHttpClient.h:50
virtual HRESULT WriteBody(cStreamOutput *pClient, IStreamProgressCallback *pProgress=nullptr)=0
MIME_TYPE m_eContentType
HTTP_TAG_ContentType="text/plain" = MIME_TEXT.
Definition: cHttpClient.h:33
cStringA m_sContentDisposition
HTTP_TAG_ContentDisposition = "form-data; name="mdump"; filename="sdfsdf.txt"".
Definition: cHttpClient.h:34
Definition: cNetStream.h:20
bool isConnected() const
Definition: cNetStream.h:55
Definition: cNetURL.h:21
StrLen_t GetLength() const noexcept
Definition: cString.h:183
Definition: cFile.h:137
virtual STREAM_POS_t GetLength() const override
Definition: cFile.h:191
Definition: cHeap.h:156
Definition: cIniSection.h:71
Definition: cNewPtr.h:18
Definition: cStream.h:126
virtual HRESULT WriteString(const char *pszStr)
Definition: cStream.h:212
HRESULT WriteStream(cStreamInput &sInp, STREAM_POS_t nSizeMax=k_FILE_BLOCK_SIZE, IStreamProgressCallback *pProgress=nullptr, TIMESYSD_t nTimeout=0)
Copy cStreamInput to this stream.
Definition: cStream.cpp:34
Definition: cStreamQueue.h:19
Definition: cStream.h:456
static const TIMESYSD_t k_DMAX
Max diff in time.
Definition: cTimeSys.h:102
Definition: cMesh.h:22
HTTPVERB_TYPE
Definition: cHttpCommon.h:36
UNITTEST2_PREDEF(cQuadtree)
MIME_TYPE
Definition: cMime.h:79
int StrLen_t
the length of a string in chars (bytes for UTF8, wchar_t for UNICODE). or offset in characters....
Definition: StrConst.h:32
INT32 TIMESYSD_t
Time delta. signed milli-Seconds Span. cTimeSys::k_DMAX, cTimeSys::k_INF = MAILSLOT_WAIT_FOREVER.
Definition: cTimeSys.h:28
char FILECHAR_t
a UTF8 char in a file name. like TCHAR
Definition: FileName.h:22
ULONG_PTR STREAM_POS_t
NOT same as FILE_SIZE_t in 32 bit. Why not ?
Definition: cOSHandle.h:54
UINT64 FILE_SIZE_t
similar to STREAM_POS_t size_t
Definition: cFileStatus.h:31
Definition: cHttpCommon.h:46
Definition: cFileCopier.h:17
Definition: cStreamProgress.h:168