blob: 3eccb1a42b779f080581402722752d1ab584f724 [file] [log] [blame]
/*
* Copyright (C) 2009, 2010, 2011, 2012, 2013 Research In Motion Limited. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef NetworkJob_h
#define NetworkJob_h
#include "AuthenticationChallengeManager.h"
#include "DeferredData.h"
#include "FrameDestructionObserver.h"
#include "ResourceHandle.h"
#include "ResourceResponse.h"
#include "Timer.h"
#include <network/FilterStream.h>
#include <wtf/OwnPtr.h>
#include <wtf/RefPtr.h>
#include <wtf/Vector.h>
#include <wtf/text/WTFString.h>
namespace BlackBerry {
namespace Platform {
class NetworkRequest;
class NetworkStreamFactory;
}
}
namespace WebCore {
class Credential;
class Frame;
class KURL;
class ProtectionSpace;
class ResourceRequest;
class NetworkJob : public AuthenticationChallengeClient, public BlackBerry::Platform::FilterStream, public FrameDestructionObserver {
public:
NetworkJob();
~NetworkJob();
void initialize(int playerId,
const String& pageGroupName,
const KURL&,
const BlackBerry::Platform::NetworkRequest&,
PassRefPtr<ResourceHandle>,
BlackBerry::Platform::NetworkStreamFactory*,
Frame*,
int deferLoadingCount,
int redirectCount);
PassRefPtr<ResourceHandle> handle() const { return m_handle; }
#ifndef NDEBUG
bool isRunning() const { return m_isRunning; }
#endif
bool isCancelled() const { return m_cancelled; }
int cancelJob();
bool isDeferringLoading() const { return m_deferLoadingCount > 0; }
void updateDeferLoadingCount(int delta);
virtual void notifyStatusReceived(int status, const BlackBerry::Platform::String& message);
void handleNotifyStatusReceived(int status, const String& message);
virtual void notifyHeadersReceived(const BlackBerry::Platform::NetworkRequest::HeaderList& headers);
virtual void notifyMultipartHeaderReceived(const char* key, const char* value);
virtual void notifyAuthReceived(BlackBerry::Platform::NetworkRequest::AuthType,
BlackBerry::Platform::NetworkRequest::AuthProtocol,
BlackBerry::Platform::NetworkRequest::AuthScheme,
const char* realm,
AuthResult);
// notifyStringHeaderReceived exists only to resolve ambiguity between char* and String parameters
void notifyStringHeaderReceived(const String& key, const String& value);
void handleNotifyHeaderReceived(const String& key, const String& value);
void handleNotifyMultipartHeaderReceived(const String& key, const String& value);
void handleSetCookieHeader(const String& value);
void notifyDataReceivedPlain(const char* buf, size_t len);
void handleNotifyDataReceived(const char* buf, size_t len);
virtual void notifyDataSent(unsigned long long bytesSent, unsigned long long totalBytesToBeSent);
void handleNotifyDataSent(unsigned long long bytesSent, unsigned long long totalBytesToBeSent);
virtual void notifyClose(int status);
void handleNotifyClose(int status);
virtual int status() const { return m_extendedStatusCode; }
virtual const BlackBerry::Platform::String mimeType() const;
virtual void notifyChallengeResult(const KURL&, const ProtectionSpace&, AuthenticationChallengeResult, const Credential&);
// Implementation of FrameDestructionObserver pure virtuals.
virtual void frameDestroyed();
virtual void willDetachPage();
private:
bool isClientAvailable() const { return !m_cancelled && m_handle && m_handle->client(); }
virtual void notifyDataReceived(BlackBerry::Platform::NetworkBuffer* buffer)
{
notifyDataReceivedPlain(BlackBerry::Platform::networkBufferData(buffer), BlackBerry::Platform::networkBufferDataLength(buffer));
}
virtual void setWasDiskCached(bool value)
{
m_response.setWasCached(value);
}
bool shouldSendClientData() const;
bool shouldReleaseClientResource();
bool shouldNotifyClientFailed() const;
bool shouldDeferLoading() const
{
return isDeferringLoading() || m_deferredData.hasDeferredData();
}
bool retryAsFTPDirectory();
bool startNewJobWithRequest(ResourceRequest& newRequest, bool increasRedirectCount = false, bool rereadCookies = false);
bool handleRedirect();
// This can cause m_cancelled to be set to true, if it passes up an error to m_handle->client() which causes the job to be cancelled
void sendResponseIfNeeded();
void sendMultipartResponseIfNeeded();
void fireDeleteJobTimer(Timer<NetworkJob>*);
bool handleFTPHeader(const String& header);
// The server needs authentication credentials. Search in the CredentialStorage
// or prompt the user via dialog, then resend the request with the credentials.
enum SendRequestResult {
SendRequestSucceeded,
SendRequestCancelled,
SendRequestWaiting
};
SendRequestResult sendRequestWithCredentials(ProtectionSpaceServerType, ProtectionSpaceAuthenticationScheme, const String& realm, bool requireCredentials = true);
void storeCredentials();
void storeCredentials(AuthenticationChallenge&);
void purgeCredentials();
void purgeCredentials(AuthenticationChallenge&);
bool isError(int statusCode) const
{
return statusCode < 0 || (400 <= statusCode && statusCode < 600);
}
void updateCurrentWebChallenge(const AuthenticationChallenge&, bool allowOverwrite = true);
private:
int m_playerId;
String m_pageGroupName;
RefPtr<ResourceHandle> m_handle;
ResourceResponse m_response;
OwnPtr<ResourceResponse> m_multipartResponse;
Timer<NetworkJob> m_deleteJobTimer;
String m_contentType;
String m_sniffedMimeType;
String m_contentDisposition;
BlackBerry::Platform::NetworkStreamFactory* m_streamFactory;
bool m_isFile;
bool m_isFTP;
bool m_isFTPDir;
#ifndef NDEBUG
bool m_isRunning;
#endif
bool m_cancelled;
bool m_statusReceived;
bool m_dataReceived;
bool m_responseSent;
bool m_callingClient;
bool m_needsRetryAsFTPDirectory;
bool m_isOverrideContentType;
bool m_newJobWithCredentialsStarted;
bool m_isHeadMethod;
// If an HTTP status code is received, m_extendedStatusCode and m_response.httpStatusCode will both be set to it.
// If a platform error code is received, m_extendedStatusCode will be set to it and m_response.httpStatusCode will be set to 404.
int m_extendedStatusCode;
int m_redirectCount;
DeferredData m_deferredData;
int m_deferLoadingCount;
bool m_isAuthenticationChallenging;
};
} // namespace WebCore
#endif // NetworkJob_h