/****************************************************************************
**
** Copyright (C) 2020 Mikhail Svetkin <mikhail.svetkin@gmail.com>
** Copyright (C) 2019 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtHttpServer module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:GPL$
** 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 General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 or (at your option) 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.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-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#ifndef QHTTPSERVER_H
#define QHTTPSERVER_H
#include <qabstracthttpserver.h>
#include <qhttpserverrouter.h>
#include <qhttpserverrouterrule.h>
#include <qhttpserverresponse.h>
#include <qhttpserverrouterviewtraits.h>
#include <qhttpserverviewtraits.h>
#include <tuple>
QT_BEGIN_NAMESPACE
class QTcpSocket;
class QHttpServerRequest;
class QHttpServerPrivate;
class Q_HTTPSERVER_EXPORT QHttpServer final : public QAbstractHttpServer
{
Q_OBJECT
Q_DECLARE_PRIVATE(QHttpServer)
template<int I, typename ... Ts>
struct VariadicTypeAt { using Type = typename std::tuple_element<I, std::tuple<Ts...>>::type; };
template<typename ... Ts>
struct VariadicTypeLast {
using Type = typename VariadicTypeAt<sizeof ... (Ts) - 1, Ts...>::Type;
};
template<typename T>
using ResponseType =
typename std::conditional<
std::is_base_of<QHttpServerResponse, T>::value,
T,
QHttpServerResponse
>::type;
public:
explicit QHttpServer(QObject *parent = nullptr);
~QHttpServer();
QHttpServerRouter *router();
template<typename Rule = QHttpServerRouterRule, typename ... Args>
bool route(Args && ... args)
{
using ViewHandler = typename VariadicTypeLast<Args...>::Type;
using ViewTraits = QHttpServerRouterViewTraits<ViewHandler>;
static_assert(ViewTraits::Arguments::StaticAssert,
"ViewHandler arguments are in the wrong order or not supported");
return routeHelper<Rule, ViewHandler, ViewTraits>(
QtPrivate::makeIndexSequence<sizeof ... (Args) - 1>{},
std::forward<Args>(args)...);
}
template<typename ViewHandler>
void afterRequest(ViewHandler &&viewHandler)
{
using ViewTraits = QHttpServerAfterRequestViewTraits<ViewHandler>;
static_assert(ViewTraits::Arguments::StaticAssert,
"ViewHandler arguments are in the wrong order or not supported");
afterRequestHelper<ViewTraits, ViewHandler>(std::move(viewHandler));
}
using AfterRequestHandler =
std::function<QHttpServerResponse(QHttpServerResponse &&response,
const QHttpServerRequest &request)>;
private:
template<typename ViewTraits, typename ViewHandler>
typename std::enable_if<ViewTraits::Arguments::Last::IsRequest::Value &&
ViewTraits::Arguments::Count == 2, void>::type
afterRequestHelper(ViewHandler &&viewHandler) {
auto handler = [viewHandler](QHttpServerResponse &&resp,
const QHttpServerRequest &request) {
return std::move(viewHandler(std::move(resp), request));
};
afterRequestImpl(std::move(handler));
}
template<typename ViewTraits, typename ViewHandler>
typename std::enable_if<ViewTraits::Arguments::Last::IsResponse::Value &&
ViewTraits::Arguments::Count == 1, void>::type
afterRequestHelper(ViewHandler &&viewHandler) {
auto handler = [viewHandler](QHttpServerResponse &&resp,
const QHttpServerRequest &) {
return std::move(viewHandler(std::move(resp)));
};
afterRequestImpl(std::move(handler));
}
template<typename ViewTraits, typename ViewHandler>
typename std::enable_if<ViewTraits::Arguments::Last::IsResponse::Value &&
ViewTraits::Arguments::Count == 2, void>::type
afterRequestHelper(ViewHandler &&viewHandler) {
auto handler = [viewHandler](QHttpServerResponse &&resp,
const QHttpServerRequest &request) {
return std::move(viewHandler(request, std::move(resp)));
};
afterRequestImpl(std::move(handler));
}
void afterRequestImpl(AfterRequestHandler &&afterRequestHandler);
private:
template<typename Rule, typename ViewHandler, typename ViewTraits, int ... I, typename ... Args>
bool routeHelper(QtPrivate::IndexesList<I...>, Args &&... args)
{
return routeImpl<Rule,
ViewHandler,
ViewTraits,
typename VariadicTypeAt<I, Args...>::Type...>(std::forward<Args>(args)...);
}
template<typename Rule, typename ViewHandler, typename ViewTraits, typename ... Args>
bool routeImpl(Args &&...args, ViewHandler &&viewHandler)
{
auto routerHandler = [this, viewHandler] (
const QRegularExpressionMatch &match,
const QHttpServerRequest &request,
QTcpSocket *socket) mutable {
auto boundViewHandler = router()->bindCaptured<ViewHandler, ViewTraits>(
std::move(viewHandler), match);
responseImpl<ViewTraits>(boundViewHandler, request, socket);
};
return router()->addRule<ViewHandler, ViewTraits>(
new Rule(std::forward<Args>(args)..., std::move(routerHandler)));
}
template<typename ViewTraits, typename T>
typename std::enable_if<!ViewTraits::Arguments::Last::IsSpecial::Value, void>::type
responseImpl(T &boundViewHandler,
const QHttpServerRequest &request,
QTcpSocket *socket)
{
ResponseType<typename ViewTraits::ReturnType> response(boundViewHandler());
sendResponse(std::move(response), request, socket);
}
template<typename ViewTraits, typename T>
typename std::enable_if<ViewTraits::Arguments::Last::IsRequest::Value &&
ViewTraits::Arguments::PlaceholdersCount == 1, void>::type
responseImpl(T &boundViewHandler, const QHttpServerRequest &request, QTcpSocket *socket)
{
ResponseType<typename ViewTraits::ReturnType> response(boundViewHandler(request));
sendResponse(std::move(response), request, socket);
}
template<typename ViewTraits, typename T>
typename std::enable_if<ViewTraits::Arguments::Last::IsRequest::Value &&
ViewTraits::Arguments::PlaceholdersCount == 2, void>::type
responseImpl(T &boundViewHandler, const QHttpServerRequest &request, QTcpSocket *socket)
{
boundViewHandler(makeResponder(request, socket), request);
}
template<typename ViewTraits, typename T>
typename std::enable_if<ViewTraits::Arguments::Last::IsResponder::Value &&
ViewTraits::Arguments::PlaceholdersCount == 2, void>::
没有合适的资源?快使用搜索试试~ 我知道了~
build-qthttpserver-Desktop_Qt_5_15_2_MinGW_64_bit-Release.zip
共51个文件
h:23个
pri:8个
cmake:6个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 2 下载量 135 浏览量
2021-04-14
10:22:58
上传
评论
收藏 3.2MB ZIP 举报
温馨提示
使用Qt5.15.2+mingw8_64编译的httpserver模块,此压缩包为安装的目录,包括动态库等,可以直接复制到Qtdir/5.15.2/mingw81_64使用,仅供相关爱好者交流使用,请于下载24小时内删除
资源推荐
资源详情
资源评论
收起资源包目录
build-qthttpserver-Desktop_Qt_5_15_2_MinGW_64_bit-Release.zip (51个子文件)
bin
Qt5HttpServer.dll 306KB
Qt5SslServer.dll 75KB
mkspecs
modules-inst
qt_lib_sslserver.pri 536B
qt_lib_sslserver_private.pri 540B
qt_lib_httpserver_private.pri 588B
qt_lib_httpserver.pri 586B
modules
qt_lib_sslserver.pri 536B
qt_lib_sslserver_private.pri 540B
qt_lib_httpserver_private.pri 588B
qt_lib_httpserver.pri 586B
include
QtHttpServer
qhttpserverrouter_p.h 2KB
qhttpserverrouter.h 6KB
qabstracthttpserver_p.h 2KB
qhttpserverrequest_p.h 4KB
qhttpserverrouterrule_p.h 2KB
qhttpserverrequest.h 3KB
qhttpserverresponse_p.h 2KB
qhttpserverviewtraits_impl.h 6KB
qhttpserverresponder_p.h 2KB
qhttpserver.h 9KB
qabstracthttpserver.h 3KB
qhttpserverliterals_p.h 2KB
qhttpserverviewtraits.h 4KB
qhttpserverresponse.h 4KB
qhttpserverresponder.h 5KB
QtHttpServerDepends 328B
qhttpserver_p.h 2KB
qhttpserverrouterviewtraits.h 6KB
qthttpserverglobal.h 2KB
qhttpserverfutureresponse.h 5KB
qhttpserverrouterrule.h 3KB
QtSslServer
QtSslServerDepends 214B
qsslserver.h 2KB
qtsslserverglobal.h 2KB
qsslserver_p.h 2KB
lib
cmake
Qt5HttpServer
Qt5HttpServerConfig.cmake 10KB
Qt5HttpServerConfigVersion.cmake 299B
ExtraSourceIncludes.cmake 393B
Qt5SslServer
Qt5SslServerConfig.cmake 10KB
Qt5SslServerConfigVersion.cmake 299B
ExtraSourceIncludes.cmake 387B
Qt5SslServer.dll.debug 1.42MB
Qt5HttpServer.dll 306KB
libQt5SslServer.a 13KB
Qt5SslServer.dll 75KB
libQt5HttpServer.a 137KB
Qt5HttpServer.prl 1KB
Qt5HttpServer.dll.debug 10.3MB
pkgconfig
Qt5SslServer.pc 309B
Qt5HttpServer.pc 355B
Qt5SslServer.prl 1KB
共 51 条
- 1
资源评论
- 巾巾凡凡2022-06-13用户下载后在一定时间内未进行评价,系统默认好评。
- jieguli2022-08-25这个资源对我启发很大,受益匪浅,学到了很多,谢谢分享~
꧁白杨树下꧂
- 粉丝: 676
- 资源: 192
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于springboot+vue实现的在线考试系统+源代码+文档
- RTL8723DS 2022 版本 Linux驱动,android驱动 支持4.0-10x
- 要玩NDS的遊戲,必須要先下載三個bios檔案到你的檔案資料夾
- 各类型数据库4月排名,基于排名网站数据爬虫json结果
- 基于springboot+vue实现的在线考试系统+源代码+文档
- 淮北市杜集区人才补贴+生活补贴
- JAVA-JSP技术文档
- 课内实验02-决策表(共享单车月卡).docx
- 基于【React + Node+SpringBoot】疫情数据查看系统的设计与实现【源码+lw+部署+讲解】
- 基于【React + Node】云课堂系统设计与实现【源码+lw+部署+讲解】
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功