/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtWebEngine module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 3 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL3 included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 3 requirements
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 2.0 or (at your option) the GNU General
** Public license version 3 or any later version approved by the KDE Free
** Qt Foundation. The licenses are as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
** https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/

#include "qwebengineurlrequestjob.h"

#include "net/url_request_custom_job_proxy.h"
#include "net/url_request_custom_job_delegate.h"

using QtWebEngineCore::URLRequestCustomJobDelegate;

QT_BEGIN_NAMESPACE

/*!
    \class QWebEngineUrlRequestJob
    \brief The QWebEngineUrlRequestJob class represents a custom URL request.
    \since 5.6

    A QWebEngineUrlRequestJob is given to QWebEngineUrlSchemeHandler::requestStarted() and must
    be handled by the derived implementations of the class. The job can be handled by calling
    either reply(), redirect(), or fail().

    The class is owned by the web engine and does not need to be deleted. However, the web engine
    may delete the job when it is no longer needed, and therefore the signal QObject::destroyed()
    must be monitored if a pointer to the object is stored.

    \inmodule QtWebEngineCore
*/

/*!
    \enum QWebEngineUrlRequestJob::Error

    This enum type holds the type of the error that occurred:

    \value  NoError
            The request was successful.
    \value  UrlNotFound
            The requested URL was not found.
    \value  UrlInvalid
            The requested URL is invalid.
    \value  RequestAborted
            The request was canceled.
    \value  RequestDenied
            The request was denied.
    \value  RequestFailed
            The request failed.
*/

/*!
    \internal
 */
QWebEngineUrlRequestJob::QWebEngineUrlRequestJob(URLRequestCustomJobDelegate *p)
    : QObject(p) // owned by the jobdelegate and deleted when the job is done
    , d_ptr(p)
{}

/*!
    \internal
 */
QWebEngineUrlRequestJob::~QWebEngineUrlRequestJob()
{
}

/*!
    Returns the requested URL.
*/
QUrl QWebEngineUrlRequestJob::requestUrl() const
{
    return d_ptr->url();
}

/*!
    Returns the HTTP method of the request (for example, GET or POST).
*/
QByteArray QWebEngineUrlRequestJob::requestMethod() const
{
    return d_ptr->method();
}

/*!
    \since 5.11
    Returns the serialized origin of the content that initiated the request.

    Generally, the origin consists of a scheme, hostname, and port. For example,
    \c "http://localhost:8080" would be a valid origin. The port is omitted if
    it is the scheme's default port (80 for \c http, 443 for \c https). The
    hostname is omitted for non-network schemes such as \c file and \c qrc.

    However, there is also the special value \c "null" representing a unique
    origin. It is, for example, the origin of a sandboxed iframe. The purpose of
    this special origin is to be always different from all other origins in the
    same-origin check. In other words, content with a unique origin should never
    have privileged access to any other content.

    Finally, if the request was not initiated by web content, the function will
    return an empty QUrl. This happens, for example, when you call \l
    QWebEnginePage::setUrl().

    This value can be used for implementing secure cross-origin checks.
*/
QUrl QWebEngineUrlRequestJob::initiator() const
{
    return d_ptr->initiator();
}

/*!
    \since 5.13
    Returns any HTTP headers added to the request.
*/
QMap<QByteArray, QByteArray> QWebEngineUrlRequestJob::requestHeaders() const
{
    return d_ptr->requestHeaders();
}

/*!
    Replies to the request with \a device and the MIME type \a contentType.

    The user has to be aware that \a device will be used on another thread
    until the job is deleted. In case simultaneous access from the main thread
    is desired, the user is reponsible for making access to \a device thread-safe
    for example by using QMutex. Note that the \a device object is not owned by
    the web engine. Therefore, the signal QObject::destroyed() of
    QWebEngineUrlRequestJob must be monitored.

    The device should remain available at least as long as the job exists.
    When calling this method with a newly constructed device, one solution is to
    make the device as a child of the job or delete itself when job is deleted,
    like this:
    \code
    connect(job, &QObject::destroyed, device, &QObject::deleteLater);
    \endcode
 */
void QWebEngineUrlRequestJob::reply(const QByteArray &contentType, QIODevice *device)
{
    d_ptr->reply(contentType, device);
}

/*!
    Fails the request with the error \a r.

    \sa Error
 */
void QWebEngineUrlRequestJob::fail(Error r)
{
    d_ptr->fail((URLRequestCustomJobDelegate::Error)r);
}

/*!
    Redirects the request to \a url.
 */
void QWebEngineUrlRequestJob::redirect(const QUrl &url)
{
    d_ptr->redirect(url);
}

QT_END_NAMESPACE
