KVIrc 5.2.4
Developer APIs
KviHttpRequest.h
Go to the documentation of this file.
1#ifndef _KviHttpRequest_h_
2#define _KviHttpRequest_h_
3//=============================================================================
4//
5// File : KviHttpRequest.h
6// Creation date : Sat Aug 17 13:43:31 2002 GMT by Szymon Stefanek
7//
8// This file is part of the KVIrc IRC client distribution
9// Copyright (C) 2002-2010 Szymon Stefanek (pragma at kvirc dot net)
10//
11// This program is FREE software. You can redistribute it and/or
12// modify it under the terms of the GNU General Public License
13// as published by the Free Software Foundation; either version 2
14// of the License, or (at your option) any later version.
15//
16// This program is distributed in the HOPE that it will be USEFUL,
17// but WITHOUT ANY WARRANTY; without even the implied warranty of
18// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
19// See the GNU General Public License for more details.
20//
21// You should have received a copy of the GNU General Public License
22// along with this program. If not, write to the Free Software Foundation,
23// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
24//
25//=============================================================================
26
27#include "kvi_settings.h"
28#include "kvi_inttypes.h"
29
30#ifdef Status
31#undef Status
32#endif // otherwise QTextStream freaks out
33
34#include <QTextStream> // with automoc we need this to be included before the other files
35
36#include "KviHeapObject.h"
37#include "KviPointerHashTable.h"
38#include "KviUrl.h"
39
40#include <QAbstractSocket>
41#include <QObject>
42
43class KviCString;
44class KviDnsResolver;
45class KviDataBuffer;
46
47//
48// This class implements a HTTP protocol client.
49// It's able to send GET, POST and HEAD requests,
50// download stuff to a file or to a qt SLOT().
51//
52
53// FIXME: Document and hide internals.
54
56
57class KVILIB_API KviHttpRequest : public QObject, public KviHeapObject
58{
59 Q_OBJECT
60public:
62 {
63 HeadersOnly, // Download headers only (HEAD request)
64 WholeFile, // Emit the data as whole file (binaryData() is emitted)
65 Blocks, // Emit the data as blocks (binaryData() is emitted)
66 Lines, // Emit the data as ASCII text lines (the client must take care of decoding the data)
67 StoreToFile // Store the data to a file
68 };
69
71 {
72 Overwrite, // Overwrite existing file
73 RenameIncoming, // Automatically rename the incoming file
74 RenameExisting, // Automatically rename the existing file
75 Resume // Attempt to resume the file (get partial content)
76 };
77
78public:
80
82
83protected:
84 // data
85 KviUrl m_url; // the url requested by the user
86 QString m_szFileName;
90 unsigned int m_uMaxContentLength;
91 unsigned int m_uContentOffset;
92 QString m_szPostData;
95 // status
97 unsigned int m_uTotalSize;
98 unsigned int m_uReceivedSize;
99 // internal status
100 KviUrl m_connectionUrl; // the actual url used in the connection (may change upon redirect)
105 bool m_bIgnoreRemainingData; // used in chunked transfer after the last chunk has been seen
106 unsigned int m_uConnectionTimeout; // in seconds, 60 secs by default
107 unsigned int m_uRedirectCount;
108
109private:
111
112public:
113 bool followRedirects() const
114 {
115 return m_bFollowRedirects;
116 }
117
118 void setFollowRedirects(bool bFollow)
119 {
120 m_bFollowRedirects = bFollow;
121 }
122
123 void setMaximumRedirectCount(unsigned int uCount)
124 {
125 m_uMaximumRedirectCount = uCount;
126 }
127
128 void setConnectionTimeout(unsigned int uConnectionTimeout)
129 {
130 m_uConnectionTimeout = uConnectionTimeout;
131 if(m_uConnectionTimeout < 5)
132 m_uConnectionTimeout = 5; // keep it sane
133 }
134
135 const KviUrl & url() { return m_url; };
136 ProcessingType processingType() { return m_eProcessingType; };
137 ExistingFileAction existingFileAction() { return m_eExistingFileAction; };
138 const QString & fileName() { return m_szFileName; };
139 void * privateData() { return m_pPrivateData; };
140 unsigned int maxContentLength() { return m_uMaxContentLength; };
141 unsigned int contentOffset() { return m_uContentOffset; };
142 unsigned int totalSize() { return m_uTotalSize; };
143 unsigned int receivedSize() { return m_uReceivedSize; };
144
145 void reset();
146
147 void setPostData(const QString & szPostData) { m_szPostData = szPostData; };
148 void setUrl(const KviUrl & u)
149 {
150 m_url = u;
151 m_connectionUrl = u;
152 };
153 void setProcessingType(ProcessingType t) { m_eProcessingType = t; };
154 void setExistingFileAction(ExistingFileAction a) { m_eExistingFileAction = a; };
155 void setFileName(const QString & szFileName) { m_szFileName = szFileName; };
156 void setPrivateData(void * ptr) { m_pPrivateData = ptr; };
157 void setMaxContentLength(int uMaxContentLength) { m_uMaxContentLength = uMaxContentLength; }; //0 means unlimited
158 // this will work regardless of ExistingFileAction : even if the file doesn't exist
159 void setContentOffset(int uContentOffset) { m_uContentOffset = uContentOffset; };
160
161 bool start();
162
163 // this is a shortcut for reset()+setUrl()+setProcessingType()+setFileName()+start()
164 bool get(const KviUrl & u, ProcessingType p = WholeFile, const QString & szFileName = QString());
165
166 const QString & lastError() { return m_szLastError; };
167
168 void abort();
169signals:
170 void resolvingHost(const QString & hostname);
171 void contactingHost(const QString & ipandport);
173 void receivedResponse(const QString & response);
174
175 void terminated(bool bSuccess);
176
177 void status(const QString & message);
178 void data(const KviCString & data);
179 void binaryData(const KviDataBuffer & data);
181 void requestSent(const QStringList & request);
182
183private:
184 void closeSocket();
185 bool doConnect();
186
187 void processData(KviDataBuffer * data);
188 bool processHeader(KviCString & szHeader);
189 bool openFile();
190 void emitLines(KviDataBuffer * pDataBuffer);
191
192 void resetStatus();
193 void resetData();
194 void resetInternalStatus();
195
196private slots:
197 void slotSocketReadDataReady();
198 void slotSocketDisconnected();
199 void slotSocketConnected();
200 void slotSocketError(QAbstractSocket::SocketError socketError);
201 void slotConnectionTimedOut();
202 void slotSocketHostResolved();
203};
204
205#endif //_KviHttpRequest_h_
Heap Object.
Pointer Hash Table.
Definition KviCString.h:102
Definition KviDataBuffer.h:31
The KviDnsResolver class.
Definition KviDnsResolver.h:90
Definition KviHeapObject.h:119
Definition KviHttpRequest.cpp:49
Definition KviHttpRequest.h:58
unsigned int m_uConnectionTimeout
Definition KviHttpRequest.h:106
const QString & fileName()
Definition KviHttpRequest.h:138
QString m_szFileName
Definition KviHttpRequest.h:86
ExistingFileAction m_eExistingFileAction
Definition KviHttpRequest.h:88
KviHttpRequestPrivate * m_p
Definition KviHttpRequest.h:110
void setPrivateData(void *ptr)
Definition KviHttpRequest.h:156
void setConnectionTimeout(unsigned int uConnectionTimeout)
Definition KviHttpRequest.h:128
ProcessingType processingType()
Definition KviHttpRequest.h:136
void setExistingFileAction(ExistingFileAction a)
Definition KviHttpRequest.h:154
const QString & lastError()
Definition KviHttpRequest.h:166
ExistingFileAction
Definition KviHttpRequest.h:71
@ RenameExisting
Definition KviHttpRequest.h:74
@ Overwrite
Definition KviHttpRequest.h:72
@ RenameIncoming
Definition KviHttpRequest.h:73
void setProcessingType(ProcessingType t)
Definition KviHttpRequest.h:153
unsigned int totalSize()
Definition KviHttpRequest.h:142
unsigned int maxContentLength()
Definition KviHttpRequest.h:140
unsigned int m_uReceivedSize
Definition KviHttpRequest.h:98
bool m_bIgnoreRemainingData
Definition KviHttpRequest.h:105
void resolvingHost(const QString &hostname)
unsigned int m_uMaxContentLength
Definition KviHttpRequest.h:90
void setPostData(const QString &szPostData)
Definition KviHttpRequest.h:147
KviUrl m_connectionUrl
Definition KviHttpRequest.h:100
unsigned int m_uTotalSize
Definition KviHttpRequest.h:97
bool m_bGzip
Definition KviHttpRequest.h:103
void * privateData()
Definition KviHttpRequest.h:139
void connectionEstablished()
QString m_szPostData
Definition KviHttpRequest.h:92
unsigned int m_uRemainingChunkSize
Definition KviHttpRequest.h:104
ProcessingType m_eProcessingType
Definition KviHttpRequest.h:87
void contactingHost(const QString &ipandport)
bool m_bFollowRedirects
Definition KviHttpRequest.h:93
void setFollowRedirects(bool bFollow)
Definition KviHttpRequest.h:118
void status(const QString &message)
ExistingFileAction existingFileAction()
Definition KviHttpRequest.h:137
ProcessingType
Definition KviHttpRequest.h:62
@ HeadersOnly
Definition KviHttpRequest.h:63
@ Lines
Definition KviHttpRequest.h:66
@ WholeFile
Definition KviHttpRequest.h:64
@ Blocks
Definition KviHttpRequest.h:65
unsigned int contentOffset()
Definition KviHttpRequest.h:141
unsigned int m_uMaximumRedirectCount
Definition KviHttpRequest.h:94
bool followRedirects() const
Definition KviHttpRequest.h:113
void setMaxContentLength(int uMaxContentLength)
Definition KviHttpRequest.h:157
void setFileName(const QString &szFileName)
Definition KviHttpRequest.h:155
QString m_szLastError
Definition KviHttpRequest.h:96
const KviUrl & url()
Definition KviHttpRequest.h:135
void setContentOffset(int uContentOffset)
Definition KviHttpRequest.h:159
void setUrl(const KviUrl &u)
Definition KviHttpRequest.h:148
void data(const KviCString &data)
void setMaximumRedirectCount(unsigned int uCount)
Definition KviHttpRequest.h:123
bool m_bHeaderProcessed
Definition KviHttpRequest.h:101
bool m_bChunkedTransferEncoding
Definition KviHttpRequest.h:102
void binaryData(const KviDataBuffer &data)
void terminated(bool bSuccess)
KviUrl m_url
Definition KviHttpRequest.h:85
void header(KviPointerHashTable< const char *, KviCString > *hdr)
void receivedResponse(const QString &response)
unsigned int m_uContentOffset
Definition KviHttpRequest.h:91
unsigned int m_uRedirectCount
Definition KviHttpRequest.h:107
void * m_pPrivateData
Definition KviHttpRequest.h:89
unsigned int receivedSize()
Definition KviHttpRequest.h:143
void requestSent(const QStringList &request)
A fast pointer hash table implementation.
Definition KviPointerHashTable.h:450
Definition KviUrl.h:33
#define t
Definition detector.cpp:85
#define u
Definition detector.cpp:86
#define a
Definition detector.cpp:92
#define p
Definition detector.cpp:81
This file contains compile time settings.
#define KVILIB_API
Definition kvi_settings.h:124