KIOSlave
http.cpp
Go to the documentation of this file.
89 // KDE5 TODO (QT5) : use QString::htmlEscape or whatever https://qt.gitorious.org/qt/qtbase/merge_requests/56
207 static bool isPotentialSpoofingAttack(const HTTPProtocol::HTTPRequest& request, const KConfigGroup* config)
209 // kDebug(7113) << request.url << "response code: " << request.responseCode << "previous response code:" << request.prevResponseCode;
224 return ((userName.isEmpty() || userName != request.url.user()) && request.responseCode != 401 && request.prevResponseCode != 401);
227 // for a given response code, conclude if the response is going to/likely to have a response body
353 /************************************************************************************************************************/
434 /************************************** HTTPProtocol **********************************************/
537 (isEncryptedHttpVariety(m_protocol) || metaData(QLatin1String("ssl_was_in_use")) != QLatin1String("TRUE") ) )
777 entry.insert( KIO::UDSEntry::UDS_ACCESS, S_IRUSR | S_IRGRP | S_IROTH ); // readable by everybody
905 if ( !stat && thisURL.path(KUrl::AddTrailingSlash).length() == url.path(KUrl::AddTrailingSlash).length() )
991 kDebug(7113) << "Got status code" << code << "(this may mean that some properties are unavailable)";
1024 entry.insert( KIO::UDSEntry::UDS_CREATION_TIME, parseDateTime( property.text(), property.attribute(QLatin1String("dt")) ) );
1073 entry.insert( KIO::UDSEntry::UDS_MODIFICATION_TIME, parseDateTime( property.text(), property.attribute(QLatin1String("dt")) ) );
1211 response += QLatin1String(" <") + metaData( QLatin1String("davLockURL") + countStr ) + QLatin1Char('>');
1227 response += QLatin1Char('<') + metaData( QLatin1String("davLockToken") + countStr ) + QLatin1Char('>');
1508 QDomElement lockInfo = lockReq.createElementNS( QLatin1String("DAV:"), QLatin1String("lockinfo") );
1541 QDomElement prop = multiResponse.documentElement().namedItem( QLatin1String("prop") ).toElement();
1546 davParseActiveLocks( lockdiscovery.elementsByTagName( QLatin1String("activelock") ), lockCount );
1669 QDomElement multistatus = multiResponse.documentElement().namedItem( QLatin1String("multistatus") ).toElement();
1707 errorString = i18nc( "%1: request type", "Access was denied while attempting to %1.", action );
1747 errorString = i18nc( "%1: request type", "Unable to %1 because the resource is locked.", action );
1757 errorString = i18nc( "%1: request type", "Unable to %1 because the destination server refuses "
1839 *errorString = i18nc( "%1: request type", "Access was denied while attempting to %1.", action );
1853 *errorString = i18nc( "%1: request type", "Unable to %1 because the resource is locked.", action );
1859 *errorString = i18nc( "%1: request type", "Unable to %1 because the destination server refuses "
2208 connectError = connectToHost(m_request.url.host(), m_request.url.port(defaultPort()), &errorString);
2214 connectError = connectToHost(m_request.url.host(), m_request.url.port(defaultPort()), &errorString);
2216 kDebug(7113) << "Connected DIRECT: host=" << m_request.url.host() << "port=" << m_request.url.port(defaultPort());
2258 connectError = connectToHost(m_request.url.host(), m_request.url.port(defaultPort()), &errorString);
2494 davHeader = QLatin1String("Lock-token: ") + metaData(QLatin1String("davLockToken")) + QLatin1String("\r\n");
2725 setMetaData(QLatin1String("HTTP-Headers"), m_responseHeaders.join(QString(QLatin1Char('\n'))));
2781 else if (m_mimeType == QLatin1String("audio/x-mp3") || m_mimeType == QLatin1String("audio/x-mpeg") || m_mimeType == QLatin1String("audio/mp3"))
2813 else if ((m_mimeType == QLatin1String("text/plain")) || (m_mimeType == QLatin1String("application/octet-stream"))) {
3081 } else if (m_request.responseCode >= 400 && m_request.responseCode <= 499 && !isAuthenticationRequired(m_request.responseCode)) {
3173 //kDebug(7113) << " -- full response:" << endl << QByteArray(buffer, bufPos).replace("\r", "\\r").replace("\n", "\\n\n");
3466 // TODO cache the proxy auth data (not doing this means a small performance regression for now)
3587 setMetaData(QLatin1String("HTTP-Headers"), m_responseHeaders.join(QString(QLatin1Char('\n'))));
3639 } else if ((encoding == QLatin1String("x-deflate")) || (encoding == QLatin1String("deflate"))) {
3707 if (cacheStr.startsWith("no-cache") || cacheStr.startsWith("no-store")) { // krazy:exclude=strings
3786 if (m_mimeType.startsWith(QLatin1String("text/")) && (m_mimeType != QLatin1String("text/css")) &&
3932 kDebug(7113) << "Connection broken while sending POST content size to" << m_request.url.host();
4294 KMimeType::Ptr mime = KMimeType::findByNameAndContent(m_request.url.fileName(), m_mimeTypeBuffer);
4608 QDBusInterface kcookiejar( QLatin1String("org.kde.kded"), QLatin1String("/modules/kcookiejar"), QLatin1String("org.kde.KCookieServer") );
4616 QDBusInterface kcookiejar( QLatin1String("org.kde.kded"), QLatin1String("/modules/kcookiejar"), QLatin1String("org.kde.KCookieServer") );
4682 };
4721 // If the file is not new headerEnd has already been read from the file and in fact the variable
5023 Q_ASSERT(command.size() == BinaryCacheFileHeader::size + s_hashedUrlNibbles + sizeof(quint32));
5029 QString socketFileName = KStandardDirs::locateLocal("socket", QLatin1String("kio_http_cache_cleaner"));
5092 m_POSTbuf = createPostBufferDeviceFor(qMax(m_iPostDataSize, static_cast<KIO::filesize_t>(data.size())));
5160 const bool useCachedAuth = (m_request.responseCode == 401 || !config()->readEntry("no-preemptive-auth-reuse", false));
5231 void HTTPProtocol::proxyAuthenticationForSocket(const QNetworkProxy &proxy, QAuthenticator *authenticator)
5263 info.comment = i18n("<b>%1</b> at <b>%2</b>", htmlEscape(info.realmValue), m_request.proxyUrl.host());
5297 kDebug(7113) << "realm:" << m_socketProxyAuth->realm() << "user:" << m_socketProxyAuth->user();
AddTrailingSlash
Overwrite
bool readBody(bool dataInternal=false)
This function is our "receive" function.
Definition: http.cpp:4342
void data(const QByteArray &data)
static List split(const KUrl &_url)
void davSetRequest(const QByteArray &requestXML)
Performs a WebDAV stat or list.
Definition: http.cpp:798
void connected()
int connectToHost(const QString &host, quint16 port, QString *errorString=0)
void sendAndKeepMetaData()
ERR_SLAVE_DEFINED
ISODate
ERR_ABORTED
void listEntry(const UDSEntry &_entry, bool ready)
QString cacheFilePathFromUrl(const KUrl &url) const
Definition: http.cpp:4860
virtual void generateResponse(const QString &user, const QString &password)=0
what to do in response to challenge
QString protocol() const
static QIODevice * createPostBufferDeviceFor(KIO::filesize_t size)
Definition: http.cpp:287
#define DEFAULT_HTTPS_PORT
bool handleAuthenticationHeader(const HeaderTokenizer *tokenizer)
Handles HTTP authentication.
Definition: http.cpp:5357
static qint64 parseDateTime(const QString &input, const QString &type)
Definition: http.cpp:307
const char header[]
void cacheFileWritePayload(const QByteArray &d)
Definition: http.cpp:5057
CopyJob * trash(const KUrl &src, JobFlags flags=DefaultFlags)
QString md5()
int timeout
ERR_UNKNOWN_PROXY_HOST
static QByteArray makeCacheCleanerCommand(const HTTPProtocol::CacheTag &cacheTag, CacheCleanerCommandCode cmd)
Definition: http.cpp:4940
static qint64 toTime_t(const QString &value, KDateTime::TimeFormat format)
Definition: http.cpp:301
qulonglong filesize_t
static void skipSpace(const char input[], int *pos, int end)
Definition: parsinghelpers.cpp:32
static QString locateLocal(const char *type, const QString &filename, bool createDir, const KComponentData &cData=KGlobal::mainComponent())
static QMap< QString, QString > contentDispositionParser(const QString &disposition)
Definition: parsinghelpers.cpp:581
void updateCredentials(const HTTPRequest &request)
Definition: http.h:206
ERR_CANNOT_OPEN_FOR_READING
ERR_MALFORMED_URL
static bool isCrossDomainRequest(const QString &fqdn, const QString &originURL)
Definition: http.cpp:150
static int httpPutError(const HTTPProtocol::HTTPRequest &request, QString *errorString)
Definition: http.cpp:1824
static KDateTime fromString(const QString &string, const QString &format, const KTimeZones *zones=0, bool offsetIfAmbiguous=true)
QIODevice * socket() const
bool isUsingSsl() const
QString i18nc(const char *ctxt, const char *text)
bool sendHttpError()
Generate and send error message based on response code.
Definition: http.cpp:1887
UDS_GUESSED_MIME_TYPE
LeaveTrailingSlash
#define DEFAULT_MAX_CACHE_AGE
#define DEFAULT_PARTIAL_CHARSET_HEADER
ssize_t write(const void *buf, size_t nbytes)
A thin wrapper around TCPSlaveBase::write() that will retry writing as long as no error occurs.
Definition: http.cpp:2035
virtual void copy(const KUrl &src, const KUrl &dest, int _permissions, KIO::JobFlags flags)
Definition: http.cpp:1366
RFCDate
QString pass() const
void copyPut(const KUrl &src, const KUrl &dest, KIO::JobFlags flags)
Handles file -> webdav put requests.
Definition: http.cpp:5522
void written(KIO::filesize_t _bytes)
QString password
#define DEFAULT_CACHE_CONTROL
bool proceedUntilResponseHeader()
Ensure we are connected, send our query, and get the response header.
Definition: http.cpp:696
QString digestInfo
HTTPProtocol(const QByteArray &protocol, const QByteArray &pool, const QByteArray &app)
Definition: http.cpp:437
void setSocketOption(QAbstractSocket::SocketOption options, const QVariant &value)
static QByteArray bestOffer(const QList< QByteArray > &offers)
Choose the best authentication mechanism from the offered ones.
Definition: httpauthentication.cpp:227
QString convertSize(KIO::filesize_t size)
void slaveStatus(const QString &host, bool connected)
bool hasRef() const
static Ptr findByUrl(const KUrl &url, mode_t mode=0, bool is_local_file=false, bool fast_mode=false, int *accuracy=0)
ERR_UNSUPPORTED_PROTOCOL
UDS_FILE_TYPE
static bool consume(const char input[], int *pos, int end, const char *term)
Definition: http.cpp:2880
void setCacheabilityMetadata(bool cachingAllowed)
Definition: http.cpp:3836
static int httpGenericError(const HTTPProtocol::HTTPRequest &request, QString *errorString)
Definition: http.cpp:1782
int readData(QByteArray &buffer)
static QDebug kDebug(bool cond, int area=KDE_DEFAULT_DEBUG_AREA)
bool allowTransferCompression
Definition: http.h:173
QTime time() const
UDS_NAME
void davParseActiveLocks(const QDomNodeList &activeLocks, uint &lockCount)
Definition: http.cpp:1146
ERR_COULD_NOT_CONNECT
void sendCacheCleanerCommand(const QByteArray &command)
Definition: http.cpp:5020
void parseContentDisposition(const QString &disposition)
Definition: http.cpp:3609
void sendMetaData()
AvoidEmptyPath
static QString protocolForProxyType(QNetworkProxy::ProxyType type)
Definition: http.cpp:5212
QString fileName(const DirectoryOptions &options=IgnoreTrailingSlash) const
bool isValid() const
QString stringValue(uint field) const
void insert(uint field, const QString &value)
bool retrieveAllData()
Returns true on successful retrieval of all content data.
Definition: http.cpp:5109
void addCookies(const QString &url, const QByteArray &cookieHeader)
Send a cookie to the cookiejar.
Definition: http.cpp:4605
ERR_ACCESS_DENIED
KLocale * locale()
QString toLocalFile(AdjustPathOption trailing=LeaveTrailingSlash) const
void saveProxyAuthenticationForSocket()
Definition: http.cpp:5290
void adjustPath(AdjustPathOption trailing)
void proceedUntilResponseContent(bool dataInternal=false)
Do everything proceedUntilResponseHeader does, and also get the response body.
Definition: http.cpp:673
TimeFormat
virtual void setHost(const QString &host, quint16 port, const QString &user, const QString &pass)
Definition: http.cpp:618
CC_Verify
CopyJob * link(const KUrl &src, const KUrl &destDir, JobFlags flags=DefaultFlags)
QDateTime dateTime() const
ERR_SERVER_TIMEOUT
void initFrom(const HTTPRequest &request)
Definition: http.h:197
bool isLocalFile() const
#define DEFAULT_HTTP_PORT
QString number(KIO::filesize_t size)
void setBlocking(bool b)
bool hasHost() const
QByteArray cacheFileReadPayload(int maxLength)
Definition: http.cpp:5044
QString commentLabel
bool sendQuery()
This function is responsible for opening up the connection to the remote HTTP server and sending the ...
Definition: http.cpp:2377
static int startServiceByDesktopPath(const QString &_name, const QString &URL, QString *error=0, QString *serviceName=0, int *pid=0, const QByteArray &startup_id=QByteArray(), bool noWait=false)
QString url(AdjustPathOption trailing=LeaveTrailingSlash) const
bool davStatDestination()
Stats a remote DAV file and returns true if it exists.
Definition: http.cpp:5556
#define DEFAULT_MAX_CACHE_SIZE
Definition: http.h:57
#define DEFAULT_RESPONSE_TIMEOUT
QString realmValue
bool waitForResponse(int t)
static bool isEncryptedHttpVariety(const QByteArray &p)
Definition: http.cpp:272
ERR_UPGRADE_REQUIRED
void davGeneric(const KUrl &url, KIO::HTTP_METHOD method, qint64 size=-1)
Definition: http.cpp:939
void disconnectFromHost()
Definition: parsinghelpers.h:40
QString path(AdjustPathOption trailing=LeaveTrailingSlash) const
void output(QList< Action > actions, QHash< QString, QString > domain)
UDS_SIZE
ERR_INTERNAL_SERVER
static bool isPotentialSpoofingAttack(const HTTPProtocol::HTTPRequest &request, const KConfigGroup *config)
Definition: http.cpp:207
bool satisfyRequestFromCache(bool *cacheHasPage)
Return true if the request is already "done", false otherwise.
Definition: http.cpp:2295
void davParsePropstats(const QDomNodeList &propstats, KIO::UDSEntry &entry)
Definition: http.cpp:967
KUrl url
enum HTTPProtocol::HTTPRequest::@0 cookieMode
void finished()
void redirection(const KUrl &_url)
bool sendErrorPageNotification()
Call SlaveBase::errorPage() and remember that we've called it.
Definition: http.cpp:1918
void dispatchLoop()
ERR_USER_CANCELED
void cacheParseResponseHeader(const HeaderTokenizer &tokenizer)
Definition: http.cpp:3647
Definition: parsinghelpers.h:65
QString metaData(const QString &key) const
bool readResponseHeader()
This function will read in the return header from the server.
Definition: http.cpp:2901
void forwardHttpResponseHeader(bool forwardImmediately=true)
Definition: http.cpp:2719
bool startSsl()
KSharedConfigPtr config()
QString i18n(const char *text)
static bool isAuthenticationRequired(int responseCode)
Definition: http.cpp:420
static bool canHaveResponseBody(int responseCode, KIO::HTTP_METHOD method)
Definition: http.cpp:228
bool checkCachedAuthentication(AuthInfo &info)
void clear()
static QDebug kWarning(bool cond, int area=KDE_DEFAULT_DEBUG_AREA)
size_t readBuffered(char *buf, size_t size, bool unlimited=true)
Definition: http.cpp:2075
void addEncoding(const QString &, QStringList &)
Add an encoding on to the appropriate stack this is nececesary because transfer encodings and content...
Definition: http.cpp:3621
int messageBox(const QString &text, MessageBoxType type, const QString &caption=QString(), const QString &buttonYes=i18n("&Yes"), const QString &buttonNo=i18n("&No"), const QString &dontAskAgainName=QString())
QString encodedPathAndQuery(AdjustPathOption trailing=LeaveTrailingSlash, const EncodedPathAndQueryOptions &options=PermitEmptyPath) const
#define DEFAULT_KEEP_ALIVE_TIMEOUT
void dataReq()
QString prompt
WarningYesNo
void proxyAuthenticationForSocket(const QNetworkProxy &, QAuthenticator *)
Definition: http.cpp:5231
void slotInput(const QByteArray &d)
bool cacheFileReadTextHeader1(const KUrl &desiredUrl)
check URL to guard against hash collisions, and load the etag for validation
Definition: http.cpp:4802
bool openPasswordDialog(KIO::AuthInfo &info, const QString &errorMsg=QString())
virtual void fillKioAuthInfo(KIO::AuthInfo *ai) const =0
KIO compatible data to find cached credentials.
bool readDelimitedText(char *buf, int *idx, int end, int numNewlines)
Definition: http.cpp:2109
QString davError(int code=-1, const QString &url=QString())
Definition: http.cpp:1576
const KShortcut & end()
void setQuery(const QString &query)
bool verifyPath
void totalSize(KIO::filesize_t _bytes)
long long numberValue(uint field, long long defaultValue=0) const
QString name() const
QString comment
QString davProcessLocks()
Extracts locks from metadata Returns the appropriate If: header.
Definition: http.cpp:1192
static KAbstractHttpAuthentication * newAuth(const QByteArray &offer, KConfigGroup *config=0)
Returns authentication object instance appropriate for offer.
Definition: httpauthentication.cpp:266
bool isConnected() const
#define DEFAULT_MIME_TYPE
QString authenticationHeader()
create HTTP authentications response(s), if any
Definition: http.cpp:5146
ERR_UNSUPPORTED_ACTION
UDS_MODIFICATION_TIME
virtual void setChallenge(const QByteArray &c, const KUrl &resource, const QByteArray &httpMethod)
initiate authentication with challenge string (from HTTP header)
Definition: httpauthentication.cpp:322
MetaData mIncomingMetaData
void fixupResponseContentEncoding()
fix common content-encoding errors by webservers.
Definition: http.cpp:2834
bool hasMetaData(const QString &key) const
ERR_UNKNOWN_HOST
virtual void special(const QByteArray &data)
Special commands supported by this slave : 1 - HTTP POST 2 - Cache has been updated 3 - SSL Certifica...
Definition: http.cpp:4060
int codeFromResponse(const QString &response)
Returns the error code from a "HTTP/1.1 code Code Name" string.
Definition: http.cpp:960
void cachePostData(const QByteArray &)
Caches the POST data in a temporary buffer.
Definition: http.cpp:5089
void setRef(const QString &fragment)
KConfigGroup * config()
ERR_DOES_NOT_EXIST
void setMetaData(const QString &key, const QString &value)
static Ptr findByNameAndContent(const QString &name, const QByteArray &data, mode_t mode=0, int *accuracy=0)
#define DEFAULT_CACHE_EXPIRE
bool isUtf8(const char *str)
const char * name(StandardAction id)
static QString decode_string(const QString &str)
KGuiItem cont()
void mimeType(const QString &_type)
void setTimeoutSpecialCommand(int timeout, const QByteArray &data=QByteArray())
KAutostart::StartPhase readEntry(const KConfigGroup &group, const char *key, const KAutostart::StartPhase &aDefault)
bool isAutoSsl() const
ERR_DIR_ALREADY_EXIST
ERR_NO_CONTENT
#define DEFAULT_LANGUAGE_HEADER
QString readPathEntry(const char *key, const QString &aDefault) const
static bool nextLine(const char input[], int *pos, int end)
Definition: parsinghelpers.cpp:44
quint16 port() const
void statEntry(const UDSEntry &_entry)
static QString sanitizeCustomHTTPHeader(const QString &_header)
Definition: http.cpp:184
UDS_ACCESS
QString toString(const QString &format) const
KGuiItem ok()
static int httpDelError(const HTTPProtocol::HTTPRequest &request, QString *errorString)
Definition: http.cpp:1797
void setPass(const QString &pass)
bool cacheAuthentication(const AuthInfo &info)
void setProtocol(const QString &proto)
QString ref() const
static bool readLineChecked(QIODevice *dev, QByteArray *line)
Definition: http.cpp:4790
QString username
QString prettyUrl(AdjustPathOption trailing=LeaveTrailingSlash) const
QString user() const
int responseTimeout()
bool keepPassword
QByteArray headerFragment() const
insert this into the next request header after "Authorization: " or "Proxy-Authorization: "
Definition: httpauthentication.h:131
void setUser(const QString &user)
RFCDateDay
void setEncodedPathAndQuery(const QString &_txt)
ERR_CONNECTION_BROKEN
UDS_MIME_TYPE
bool httpShouldCloseConnection()
Check whether to keep or close the connection.
Definition: http.cpp:2163
Definition: http.h:91
ERR_FILE_ALREADY_EXIST
ERR_POST_NO_SIZE
CC_CacheOnly
virtual void rename(const KUrl &src, const KUrl &dest, KIO::JobFlags flags)
Definition: http.cpp:1403
KIO::CacheControl parseCacheControl(const QString &cacheControl)
void addFilter(HTTPFilterBase *filter)
QString readEntry(const char *key, const char *aDefault=0) const
bool isDefault() const
void davLock(const KUrl &url, const QString &scope, const QString &type, const QString &owner)
Definition: http.cpp:1492
void setTime_t(qint64 seconds)
void processedSize(KIO::filesize_t _bytes)
void infoMessage(const QString &msg)
UDS_XML_PROPERTIES
void canResume()
CC_Reload
CC_Refresh
CC_Cache
ERR_OUT_OF_MEMORY
int encodingMib() const
KRemoteEncoding * remoteEncoding()
void setPath(const QString &path)
KDateTime toUtc() const
virtual void put(const KUrl &url, int _mode, KIO::JobFlags flags)
Definition: http.cpp:1337
static bool isCompatibleNextUrl(const KUrl &previous, const KUrl &now)
Definition: http.cpp:2152
UDS_CREATION_TIME
#define DEFAULT_ACCEPT_HEADER
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Thu Aug 27 2020 00:00:00 by doxygen 1.8.20 written by Dimitri van Heesch, © 1997-2006
Documentation copyright © 1996-2020 The KDE developers.
Generated on Thu Aug 27 2020 00:00:00 by doxygen 1.8.20 written by Dimitri van Heesch, © 1997-2006
KDE's Doxygen guidelines are available online.