正在显示
8 个修改的文件
包含
467 行增加
和
466 行删除
... | ... | @@ -47,11 +47,12 @@ bool DmpVectorLayer::writeXml(boost::property_tree::ptree &layerNode) |
47 | 47 | |
48 | 48 | void DmpVectorLayer::setRenderer(DmpFeatureRenderer *renderer) |
49 | 49 | { |
50 | - | |
50 | + | |
51 | 51 | } |
52 | 52 | |
53 | 53 | void DmpVectorLayer::setDataSource(const std::string &dataSource, const std::string &baseName, const std::string &provider, bool loadDefaultStyleFlag) |
54 | 54 | { |
55 | + | |
55 | 56 | DmpWkbTypes::GeometryType geomType = GeometryType(); |
56 | 57 | } |
57 | 58 | ... | ... |
1 | -[Core] | |
2 | -Filter="%Severity% >= debug" | |
3 | - | |
4 | -[Sinks.TextFileSettings] | |
5 | -Destination=TextFile | |
6 | -FileName="dmap_%Y%m%d.log" | |
7 | -AutoFlush=true | |
8 | -Format="[%TimeStamp%] [%Uptime%] [%Scope%] <%Severity%> %Message%" | |
9 | -Asynchronous=false | |
10 | -Append=true | |
1 | +[Core] | |
2 | +Filter="%Severity% >= debug" | |
3 | + | |
4 | +[Sinks.TextFileSettings] | |
5 | +Destination=TextFile | |
6 | +FileName="dmap_%Y%m%d.log" | |
7 | +AutoFlush=true | |
8 | +Format="[%TimeStamp%] [%Uptime%] [%Scope%] <%Severity%> %Message%" | |
9 | +Asynchronous=false | |
10 | +Append=true | ... | ... |
1 | -/************************************************************************** | |
2 | -* file: dmphttpbase.cpp | |
3 | - | |
4 | -* Author: lijiahuan | |
5 | -* Date: 2021-12-09 17:41:00 | |
6 | -* Email: jiahuanl@chinadci.com | |
7 | -* copyright: 广州城市信息研究所有限公司 | |
8 | -***************************************************************************/ | |
9 | -#include "dmphttpbase.h" | |
10 | - | |
11 | -#define HTTP_JSON_BEGIN ("[") | |
12 | -#define HTTP_JSON_END ("]") | |
13 | - | |
14 | -DmpHttp::DmpHttpBase::DmpHttpBase(){} | |
15 | -DmpHttp::DmpHttpBase::~DmpHttpBase(){} | |
16 | -int DmpHttp::DmpHttpBase::parseUrl(const std::string& url, std::string& out_server, | |
17 | - std::string& out_port, std::string& out_path){ | |
18 | -const std::string& http_ = "http://"; | |
19 | -const std::string& https_ = "https://"; | |
20 | -std::string temp_data = url; | |
21 | -if (temp_data.find(http_) == 0) { | |
22 | - temp_data = temp_data.substr(http_.length()); | |
23 | - } | |
24 | - else if (temp_data.find(https_) == 0) { | |
25 | - temp_data = temp_data.substr(https_.length()); | |
26 | - } | |
27 | - else { | |
28 | - return HTTP_ERROR_HTTP_HEAD; | |
29 | - } | |
30 | - // 解析域名 | |
31 | - std::size_t idx = temp_data.find('/'); | |
32 | - // 解析 域名后的page | |
33 | - if (std::string::npos == idx) { | |
34 | - out_path = "/"; | |
35 | - idx = temp_data.size(); | |
36 | - } | |
37 | - else { | |
38 | - out_path = temp_data.substr(idx); | |
39 | - } | |
40 | - // 解析域名 | |
41 | - out_server = temp_data.substr(0, idx); | |
42 | - // 解析端口 | |
43 | - idx = out_server.find(':'); | |
44 | - if (std::string::npos == idx) { | |
45 | - out_port = "80"; | |
46 | - } | |
47 | - else { | |
48 | - out_port = out_server.substr(idx + 1); | |
49 | - out_server = out_server.substr(0, idx); | |
50 | - } | |
51 | - return HTTP_SUCCESS; | |
52 | -} | |
53 | - | |
54 | -int DmpHttp::DmpHttpBase::buildPostRequest(const std::string& server, const std::string& path, | |
55 | - std::ostream& out_request) { | |
56 | - // 分割path中的json数据 | |
57 | - std::string temp_path(path), temp_json; | |
58 | - int json_pos_begin = temp_path.find(HTTP_JSON_BEGIN) + 1; | |
59 | - int json_pos_end = temp_path.find(HTTP_JSON_END); | |
60 | - if (json_pos_begin != std::string::npos) { | |
61 | - // 计算json的长度 | |
62 | - int temp_json_lenth = std::string::npos; | |
63 | - if (json_pos_end != temp_json_lenth) { | |
64 | - temp_json_lenth = (json_pos_end - json_pos_begin); | |
65 | - } | |
66 | - temp_json = temp_path.substr(json_pos_begin, temp_json_lenth); | |
67 | - temp_path = temp_path.substr(0, (json_pos_begin - 1)); | |
68 | - } | |
69 | - out_request << "POST " << temp_path.c_str() << " HTTP/1.0\r\n"; | |
70 | - out_request << "Host: " << server.c_str() << "\r\n"; | |
71 | - out_request << "Content-Length: " << temp_json.length() << "\r\n"; | |
72 | - out_request << "Content-Type: application/x-www-form-urlencoded\r\n"; | |
73 | - out_request << "Accept: */*\r\n"; | |
74 | - out_request << "Connection: close\r\n\r\n"; | |
75 | - out_request << temp_json.c_str(); | |
76 | - return HTTP_SUCCESS; | |
77 | -} | |
78 | - | |
79 | -int DmpHttp::DmpHttpBase::buildGetRequest(const std::string& server, const std::string& path, | |
80 | - std::ostream& out_request) { | |
81 | - out_request << "GET " << path.c_str() << " HTTP/1.0\r\n"; | |
82 | - out_request << "Host: " << server.c_str() << "\r\n"; | |
83 | - out_request << "Accept: */*\r\n"; | |
84 | - out_request << "Connection: close\r\n\r\n"; | |
85 | - return HTTP_SUCCESS; | |
86 | -} | |
1 | +/************************************************************************** | |
2 | +* file: dmphttpbase.cpp | |
3 | + | |
4 | +* Author: lijiahuan | |
5 | +* Date: 2021-12-09 17:41:00 | |
6 | +* Email: jiahuanl@chinadci.com | |
7 | +* copyright: 广州城市信息研究所有限公司 | |
8 | +***************************************************************************/ | |
9 | +#include "dmphttpbase.h" | |
10 | + | |
11 | +#define HTTP_JSON_BEGIN ("[") | |
12 | +#define HTTP_JSON_END ("]") | |
13 | + | |
14 | +DmpHttp::DmpHttpBase::DmpHttpBase(){} | |
15 | +DmpHttp::DmpHttpBase::~DmpHttpBase(){} | |
16 | +int DmpHttp::DmpHttpBase::parseUrl(const std::string& url, std::string& out_server, | |
17 | + std::string& out_port, std::string& out_path){ | |
18 | +const std::string& http_ = "http://"; | |
19 | +const std::string& https_ = "https://"; | |
20 | +std::string temp_data = url; | |
21 | +if (temp_data.find(http_) == 0) { | |
22 | + temp_data = temp_data.substr(http_.length()); | |
23 | + } | |
24 | + else if (temp_data.find(https_) == 0) { | |
25 | + temp_data = temp_data.substr(https_.length()); | |
26 | + } | |
27 | + else { | |
28 | + return HTTP_ERROR_HTTP_HEAD; | |
29 | + } | |
30 | + // 解析域名 | |
31 | + std::size_t idx = temp_data.find('/'); | |
32 | + // 解析 域名后的page | |
33 | + if (std::string::npos == idx) { | |
34 | + out_path = "/"; | |
35 | + idx = temp_data.size(); | |
36 | + } | |
37 | + else { | |
38 | + out_path = temp_data.substr(idx); | |
39 | + } | |
40 | + // 解析域名 | |
41 | + out_server = temp_data.substr(0, idx); | |
42 | + // 解析端口 | |
43 | + idx = out_server.find(':'); | |
44 | + if (std::string::npos == idx) { | |
45 | + out_port = "80"; | |
46 | + } | |
47 | + else { | |
48 | + out_port = out_server.substr(idx + 1); | |
49 | + out_server = out_server.substr(0, idx); | |
50 | + } | |
51 | + return HTTP_SUCCESS; | |
52 | +} | |
53 | + | |
54 | +int DmpHttp::DmpHttpBase::buildPostRequest(const std::string& server, const std::string& path, | |
55 | + std::ostream& out_request) { | |
56 | + // 分割path中的json数据 | |
57 | + std::string temp_path(path), temp_json; | |
58 | + int json_pos_begin = temp_path.find(HTTP_JSON_BEGIN) + 1; | |
59 | + int json_pos_end = temp_path.find(HTTP_JSON_END); | |
60 | + if (json_pos_begin != std::string::npos) { | |
61 | + // 计算json的长度 | |
62 | + int temp_json_lenth = std::string::npos; | |
63 | + if (json_pos_end != temp_json_lenth) { | |
64 | + temp_json_lenth = (json_pos_end - json_pos_begin); | |
65 | + } | |
66 | + temp_json = temp_path.substr(json_pos_begin, temp_json_lenth); | |
67 | + temp_path = temp_path.substr(0, (json_pos_begin - 1)); | |
68 | + } | |
69 | + out_request << "POST " << temp_path.c_str() << " HTTP/1.0\r\n"; | |
70 | + out_request << "Host: " << server.c_str() << "\r\n"; | |
71 | + out_request << "Content-Length: " << temp_json.length() << "\r\n"; | |
72 | + out_request << "Content-Type: application/x-www-form-urlencoded\r\n"; | |
73 | + out_request << "Accept: */*\r\n"; | |
74 | + out_request << "Connection: close\r\n\r\n"; | |
75 | + out_request << temp_json.c_str(); | |
76 | + return HTTP_SUCCESS; | |
77 | +} | |
78 | + | |
79 | +int DmpHttp::DmpHttpBase::buildGetRequest(const std::string& server, const std::string& path, | |
80 | + std::ostream& out_request) { | |
81 | + out_request << "GET " << path.c_str() << " HTTP/1.0\r\n"; | |
82 | + out_request << "Host: " << server.c_str() << "\r\n"; | |
83 | + out_request << "Accept: */*\r\n"; | |
84 | + out_request << "Connection: close\r\n\r\n"; | |
85 | + return HTTP_SUCCESS; | |
86 | +} | ... | ... |
1 | -/************************************************************************** | |
2 | -* file: dmphttpbase.h | |
3 | - | |
4 | -* Author: lijiahuan | |
5 | -* Date: 2021-12-09 17:41:00 | |
6 | -* Email: jiahuanl@chinadci.com | |
7 | -* copyright: 广州城市信息研究所有限公司 | |
8 | -***************************************************************************/ | |
9 | -#ifndef __dmphttpbase_h__ | |
10 | -#define __dmphttpbase_h__ | |
11 | -#include <iostream> | |
12 | -#include <boost/asio.hpp> | |
13 | -namespace DmpHttp | |
14 | -{ | |
15 | - #define HTTP_SUCCESS (0) // 操作成功 | |
16 | - #define HTTP_ERROR_UNKNOWN (-1) // 未知的错误 | |
17 | - #define HTTP_ERROR_NETWORK (-2) // 网络连接失败 | |
18 | - #define HTTP_ERROR_HTTP_HEAD (-3) // 未找到协议头 http || https | |
19 | - | |
20 | - #define HTTP_ERROR_SERVICE (-1000) // 服务器请求失败 | |
21 | - #define HTTP_ERROR_LOGIN (-1001) // 登录失败 | |
22 | - #define HTTP_ERROR_ID (-1002) // 企业ID错误 | |
23 | - #define HTTP_ERROR_USER (-1003) // 帐号不存在 | |
24 | - #define HTTP_ERROR_PASSWORD (-1004) // 密码错误 | |
25 | - | |
26 | - #define HTTP_ERROR_PARAMETER (1) // 参数错误 | |
27 | - #define HTTP_ERROR_PHONE (2) // 电话号码错误 | |
28 | - #define HTTP_ERROR_MESSAGE (3) // 短信有屏蔽字段 | |
29 | - #define HTTP_ERROR_FUNCTION (4) // 当前平台不支持这个功能 | |
30 | - | |
31 | - class DmpHttpBase | |
32 | - { | |
33 | - public: | |
34 | - DmpHttpBase(); | |
35 | - virtual ~DmpHttpBase(); | |
36 | - // Post请求 | |
37 | - virtual int post(const std::string& url) = 0; | |
38 | - // get请求 | |
39 | - virtual int get(const std::string& url) = 0; | |
40 | - virtual std::string getResponse(void) = 0; | |
41 | - | |
42 | - protected: | |
43 | - typedef int(*pBuildRequest)(const std::string&, const std::string&,std::ostream&); | |
44 | - | |
45 | - static int parseUrl(const std::string& url, std::string& out_server, | |
46 | - std::string& out_port, std::string& out_path); | |
47 | - static int buildPostRequest(const std::string& server, const std::string& path, | |
48 | - std::ostream& out_request); | |
49 | - static int buildGetRequest(const std::string& server, const std::string& path, | |
50 | - std::ostream& out_request); | |
51 | - }; | |
52 | -} | |
53 | - | |
54 | - | |
55 | - | |
56 | - | |
1 | +/************************************************************************** | |
2 | +* file: dmphttpbase.h | |
3 | + | |
4 | +* Author: lijiahuan | |
5 | +* Date: 2021-12-09 17:41:00 | |
6 | +* Email: jiahuanl@chinadci.com | |
7 | +* copyright: 广州城市信息研究所有限公司 | |
8 | +***************************************************************************/ | |
9 | +#ifndef __dmphttpbase_h__ | |
10 | +#define __dmphttpbase_h__ | |
11 | +#include <iostream> | |
12 | +#include <boost/asio.hpp> | |
13 | +namespace DmpHttp | |
14 | +{ | |
15 | + #define HTTP_SUCCESS (0) // 操作成功 | |
16 | + #define HTTP_ERROR_UNKNOWN (-1) // 未知的错误 | |
17 | + #define HTTP_ERROR_NETWORK (-2) // 网络连接失败 | |
18 | + #define HTTP_ERROR_HTTP_HEAD (-3) // 未找到协议头 http || https | |
19 | + | |
20 | + #define HTTP_ERROR_SERVICE (-1000) // 服务器请求失败 | |
21 | + #define HTTP_ERROR_LOGIN (-1001) // 登录失败 | |
22 | + #define HTTP_ERROR_ID (-1002) // 企业ID错误 | |
23 | + #define HTTP_ERROR_USER (-1003) // 帐号不存在 | |
24 | + #define HTTP_ERROR_PASSWORD (-1004) // 密码错误 | |
25 | + | |
26 | + #define HTTP_ERROR_PARAMETER (1) // 参数错误 | |
27 | + #define HTTP_ERROR_PHONE (2) // 电话号码错误 | |
28 | + #define HTTP_ERROR_MESSAGE (3) // 短信有屏蔽字段 | |
29 | + #define HTTP_ERROR_FUNCTION (4) // 当前平台不支持这个功能 | |
30 | + | |
31 | + class DmpHttpBase | |
32 | + { | |
33 | + public: | |
34 | + DmpHttpBase(); | |
35 | + virtual ~DmpHttpBase(); | |
36 | + // Post请求 | |
37 | + virtual int post(const std::string& url) = 0; | |
38 | + // get请求 | |
39 | + virtual int get(const std::string& url) = 0; | |
40 | + virtual std::string getResponse(void) = 0; | |
41 | + | |
42 | + protected: | |
43 | + typedef int(*pBuildRequest)(const std::string&, const std::string&,std::ostream&); | |
44 | + | |
45 | + static int parseUrl(const std::string& url, std::string& out_server, | |
46 | + std::string& out_port, std::string& out_path); | |
47 | + static int buildPostRequest(const std::string& server, const std::string& path, | |
48 | + std::ostream& out_request); | |
49 | + static int buildGetRequest(const std::string& server, const std::string& path, | |
50 | + std::ostream& out_request); | |
51 | + }; | |
52 | +} | |
53 | + | |
54 | + | |
55 | + | |
56 | + | |
57 | 57 | #endif //__dmphttpbase_h__ |
\ No newline at end of file | ... | ... |
1 | -/************************************************************************** | |
2 | -* file: dmphttputils.cpp | |
3 | - | |
4 | -* Author: lijiahuan | |
5 | -* Date: 2021-12-09 17:41:00 | |
6 | -* Email: jiahuanl@chinadci.com | |
7 | -* copyright: 广州城市信息研究所有限公司 | |
8 | -***************************************************************************/ | |
9 | -#include "dmphttputils.h" | |
10 | -#include <boost/bind.hpp> | |
11 | - | |
12 | -DmpHttp::DmpHttpUtils::DmpHttpUtils(boost::asio::io_service& io_service) | |
13 | -: resolver_(io_service), socket_(io_service) {} | |
14 | -DmpHttp::DmpHttpUtils::~DmpHttpUtils() {} | |
15 | - | |
16 | -int DmpHttp::DmpHttpUtils::post(const std::string& url) | |
17 | -{ | |
18 | - handle_request_resolve(url, DmpHttpBase::buildPostRequest); | |
19 | - return HTTP_SUCCESS; | |
20 | -} | |
21 | -int DmpHttp::DmpHttpUtils::get(const std::string& url) | |
22 | -{ | |
23 | - handle_request_resolve(url, DmpHttpBase::buildGetRequest); | |
24 | - return HTTP_SUCCESS; | |
25 | -} | |
26 | -void DmpHttp::DmpHttpUtils::handle_request_resolve(const std::string& url, pBuildRequest func) { | |
27 | - try { | |
28 | - responseData_.clear(); | |
29 | - // 解析URL | |
30 | - std::string server, port, path; | |
31 | - parseUrl(url, server, port, path); | |
32 | - | |
33 | - std::ostream request_stream(&request_); | |
34 | - // 合成请求 | |
35 | - func(server, path, request_stream); | |
36 | - | |
37 | - // 解析服务地址\端口 | |
38 | - boost::asio::ip::tcp::resolver::query query(server, port); | |
39 | - resolver_.async_resolve(query, | |
40 | - boost::bind(&DmpHttpUtils::handle_resolve, this, | |
41 | - boost::asio::placeholders::error, | |
42 | - boost::asio::placeholders::iterator)); | |
43 | - } | |
44 | - catch (std::exception& e) { | |
45 | - socket_.close(); | |
46 | - std::cout << "Exception: " << e.what() << "\n"; | |
47 | - } | |
48 | - return; | |
49 | -} | |
50 | -void DmpHttp::DmpHttpUtils::handle_resolve(const boost::system::error_code& err, | |
51 | - boost::asio::ip::tcp::resolver::iterator endpoint_iterator) { | |
52 | - if (err) { | |
53 | - std::cout << "Error: " << err << "\n"; | |
54 | - return; | |
55 | - } | |
56 | - // 尝试连接 | |
57 | - boost::asio::async_connect(socket_, endpoint_iterator, | |
58 | - boost::bind(&DmpHttpUtils::handle_connect, this, | |
59 | - boost::asio::placeholders::error)); | |
60 | -} | |
61 | -void DmpHttp::DmpHttpUtils::handle_connect(const boost::system::error_code& err) { | |
62 | - if (err) { | |
63 | - std::cout << "Error: " << err << "\n"; | |
64 | - return; | |
65 | - } | |
66 | - // 发送request请求 | |
67 | - boost::asio::async_write(socket_, request_, | |
68 | - boost::bind(&DmpHttpUtils::handle_write_request, this, | |
69 | - boost::asio::placeholders::error)); | |
70 | -} | |
71 | -void DmpHttp::DmpHttpUtils::handle_write_request(const boost::system::error_code& err) { | |
72 | - if (err) { | |
73 | - std::cout << "Error: " << err << "\n"; | |
74 | - return; | |
75 | - } | |
76 | - // 异步持续读数据到response_,直到接收协议符号 \r\n 为止 | |
77 | - boost::asio::async_read_until(socket_, response_, "\r\n", | |
78 | - boost::bind(&DmpHttpUtils::handle_read_status_line, this, | |
79 | - boost::asio::placeholders::error)); | |
80 | -} | |
81 | -void DmpHttp::DmpHttpUtils::handle_read_status_line(const boost::system::error_code& err) { | |
82 | - if (err) { | |
83 | - std::cout << "Error: " << err << "\n"; | |
84 | - return; | |
85 | - } | |
86 | - // 解析buff | |
87 | - std::istream response_stream(&response_); | |
88 | - unsigned int status_code; | |
89 | - std::string http_version, status_message; | |
90 | - response_stream >> http_version; | |
91 | - response_stream >> status_code; | |
92 | - std::getline(response_stream, status_message); | |
93 | - | |
94 | - // 核对是否是正确返回 | |
95 | - if (!response_stream || http_version.substr(0, 5) != "HTTP/") { | |
96 | - std::cout << "错误的响应数据\n"; | |
97 | - return; | |
98 | - } | |
99 | - if (status_code != 200) { | |
100 | - std::cout << "服务器响应的状态码: " << status_code << "\n"; | |
101 | - return; | |
102 | - } | |
103 | - // 读取响应头,直到接收协议符号 \r\n\r\n 为止 | |
104 | - boost::asio::async_read_until(socket_, response_, "\r\n\r\n", | |
105 | - boost::bind(&DmpHttpUtils::handle_read_headers, this, | |
106 | - boost::asio::placeholders::error)); | |
107 | -} | |
108 | - | |
109 | -void DmpHttp::DmpHttpUtils::handle_read_headers(const boost::system::error_code& err) { | |
110 | - if (err) { | |
111 | - std::cout << "Error: " << err << "\n"; | |
112 | - return; | |
113 | - } | |
114 | - // 输出响应头 | |
115 | - std::istream response_stream(&response_); | |
116 | - std::string header; | |
117 | - while (std::getline(response_stream, header) && header != "\r") { | |
118 | -#ifdef _DEBUG | |
119 | - std::cout << header << "\n"; | |
120 | -#endif | |
121 | - } | |
122 | -#ifdef _DEBUG | |
123 | - std::cout << "\n"; | |
124 | -#endif | |
125 | - | |
126 | - // 写完所有剩余的内容 | |
127 | - if (response_.size() > 0) { | |
128 | - boost::asio::streambuf::const_buffers_type cbt = response_.data(); | |
129 | - responseData_ += std::string(boost::asio::buffers_begin(cbt), boost::asio::buffers_end(cbt)); | |
130 | -#ifdef _DEBUG | |
131 | - std::cout << &response_; | |
132 | -#endif | |
133 | - } | |
134 | - | |
135 | - // 开始读取剩余所有内容 | |
136 | - boost::asio::async_read(socket_, response_, | |
137 | - boost::asio::transfer_at_least(1), | |
138 | - boost::bind(&DmpHttpUtils::handle_read_content, this, | |
139 | - boost::asio::placeholders::error)); | |
140 | -} | |
141 | -void DmpHttp::DmpHttpUtils::handle_read_content(const boost::system::error_code& err) { | |
142 | - if (!err) { | |
143 | - | |
144 | - // 输出读到的数据 | |
145 | - boost::asio::streambuf::const_buffers_type cbt = response_.data(); | |
146 | - | |
147 | - responseData_ = std::string(boost::asio::buffers_begin(cbt), boost::asio::buffers_end(cbt)); | |
148 | -#ifdef _DEBUG | |
149 | - std::cout << &response_; | |
150 | -#endif | |
151 | - | |
152 | - // 继续读取剩余内容,直到读到EOF | |
153 | - boost::asio::async_read(socket_, response_, | |
154 | - boost::asio::transfer_at_least(1), | |
155 | - boost::bind(&DmpHttpUtils::handle_read_content, this, | |
156 | - boost::asio::placeholders::error)); | |
157 | - | |
158 | - } | |
159 | - else if (err != boost::asio::error::eof) { | |
160 | - std::cout << "Error: " << err << "\n"; | |
161 | - } | |
162 | - else { | |
163 | - socket_.close(); | |
164 | - resolver_.cancel(); | |
165 | - std::cout << "读取响应数据完毕." << std::endl; | |
166 | - //std::cout << responseData_; | |
167 | - } | |
168 | -} | |
169 | - | |
170 | - | |
171 | -std::string DmpHttp::post(std::string url) { | |
172 | - boost::asio::io_service io; | |
173 | - DmpHttp::DmpHttpUtils c(io); | |
174 | - c.post(url); | |
175 | - io.run(); | |
176 | - return c.getResponse(); | |
177 | -} | |
178 | - | |
179 | -std::string DmpHttp::get(std::string url) { | |
180 | - boost::asio::io_service io; | |
181 | - DmpHttp::DmpHttpUtils c(io); | |
182 | - c.get(url); | |
183 | - io.run(); | |
184 | - return c.getResponse(); | |
1 | +/************************************************************************** | |
2 | +* file: dmphttputils.cpp | |
3 | + | |
4 | +* Author: lijiahuan | |
5 | +* Date: 2021-12-09 17:41:00 | |
6 | +* Email: jiahuanl@chinadci.com | |
7 | +* copyright: 广州城市信息研究所有限公司 | |
8 | +***************************************************************************/ | |
9 | +#include "dmphttputils.h" | |
10 | +#include <boost/bind.hpp> | |
11 | + | |
12 | +DmpHttp::DmpHttpUtils::DmpHttpUtils(boost::asio::io_service& io_service) | |
13 | +: resolver_(io_service), socket_(io_service) {} | |
14 | +DmpHttp::DmpHttpUtils::~DmpHttpUtils() {} | |
15 | + | |
16 | +int DmpHttp::DmpHttpUtils::post(const std::string& url) | |
17 | +{ | |
18 | + handle_request_resolve(url, DmpHttpBase::buildPostRequest); | |
19 | + return HTTP_SUCCESS; | |
20 | +} | |
21 | +int DmpHttp::DmpHttpUtils::get(const std::string& url) | |
22 | +{ | |
23 | + handle_request_resolve(url, DmpHttpBase::buildGetRequest); | |
24 | + return HTTP_SUCCESS; | |
25 | +} | |
26 | +void DmpHttp::DmpHttpUtils::handle_request_resolve(const std::string& url, pBuildRequest func) { | |
27 | + try { | |
28 | + responseData_.clear(); | |
29 | + // 解析URL | |
30 | + std::string server, port, path; | |
31 | + parseUrl(url, server, port, path); | |
32 | + | |
33 | + std::ostream request_stream(&request_); | |
34 | + // 合成请求 | |
35 | + func(server, path, request_stream); | |
36 | + | |
37 | + // 解析服务地址\端口 | |
38 | + boost::asio::ip::tcp::resolver::query query(server, port); | |
39 | + resolver_.async_resolve(query, | |
40 | + boost::bind(&DmpHttpUtils::handle_resolve, this, | |
41 | + boost::asio::placeholders::error, | |
42 | + boost::asio::placeholders::iterator)); | |
43 | + } | |
44 | + catch (std::exception& e) { | |
45 | + socket_.close(); | |
46 | + std::cout << "Exception: " << e.what() << "\n"; | |
47 | + } | |
48 | + return; | |
49 | +} | |
50 | +void DmpHttp::DmpHttpUtils::handle_resolve(const boost::system::error_code& err, | |
51 | + boost::asio::ip::tcp::resolver::iterator endpoint_iterator) { | |
52 | + if (err) { | |
53 | + std::cout << "Error: " << err << "\n"; | |
54 | + return; | |
55 | + } | |
56 | + // 尝试连接 | |
57 | + boost::asio::async_connect(socket_, endpoint_iterator, | |
58 | + boost::bind(&DmpHttpUtils::handle_connect, this, | |
59 | + boost::asio::placeholders::error)); | |
60 | +} | |
61 | +void DmpHttp::DmpHttpUtils::handle_connect(const boost::system::error_code& err) { | |
62 | + if (err) { | |
63 | + std::cout << "Error: " << err << "\n"; | |
64 | + return; | |
65 | + } | |
66 | + // 发送request请求 | |
67 | + boost::asio::async_write(socket_, request_, | |
68 | + boost::bind(&DmpHttpUtils::handle_write_request, this, | |
69 | + boost::asio::placeholders::error)); | |
70 | +} | |
71 | +void DmpHttp::DmpHttpUtils::handle_write_request(const boost::system::error_code& err) { | |
72 | + if (err) { | |
73 | + std::cout << "Error: " << err << "\n"; | |
74 | + return; | |
75 | + } | |
76 | + // 异步持续读数据到response_,直到接收协议符号 \r\n 为止 | |
77 | + boost::asio::async_read_until(socket_, response_, "\r\n", | |
78 | + boost::bind(&DmpHttpUtils::handle_read_status_line, this, | |
79 | + boost::asio::placeholders::error)); | |
80 | +} | |
81 | +void DmpHttp::DmpHttpUtils::handle_read_status_line(const boost::system::error_code& err) { | |
82 | + if (err) { | |
83 | + std::cout << "Error: " << err << "\n"; | |
84 | + return; | |
85 | + } | |
86 | + // 解析buff | |
87 | + std::istream response_stream(&response_); | |
88 | + unsigned int status_code; | |
89 | + std::string http_version, status_message; | |
90 | + response_stream >> http_version; | |
91 | + response_stream >> status_code; | |
92 | + std::getline(response_stream, status_message); | |
93 | + | |
94 | + // 核对是否是正确返回 | |
95 | + if (!response_stream || http_version.substr(0, 5) != "HTTP/") { | |
96 | + std::cout << "错误的响应数据\n"; | |
97 | + return; | |
98 | + } | |
99 | + if (status_code != 200) { | |
100 | + std::cout << "服务器响应的状态码: " << status_code << "\n"; | |
101 | + return; | |
102 | + } | |
103 | + // 读取响应头,直到接收协议符号 \r\n\r\n 为止 | |
104 | + boost::asio::async_read_until(socket_, response_, "\r\n\r\n", | |
105 | + boost::bind(&DmpHttpUtils::handle_read_headers, this, | |
106 | + boost::asio::placeholders::error)); | |
107 | +} | |
108 | + | |
109 | +void DmpHttp::DmpHttpUtils::handle_read_headers(const boost::system::error_code& err) { | |
110 | + if (err) { | |
111 | + std::cout << "Error: " << err << "\n"; | |
112 | + return; | |
113 | + } | |
114 | + // 输出响应头 | |
115 | + std::istream response_stream(&response_); | |
116 | + std::string header; | |
117 | + while (std::getline(response_stream, header) && header != "\r") { | |
118 | +#ifdef _DEBUG | |
119 | + std::cout << header << "\n"; | |
120 | +#endif | |
121 | + } | |
122 | +#ifdef _DEBUG | |
123 | + std::cout << "\n"; | |
124 | +#endif | |
125 | + | |
126 | + // 写完所有剩余的内容 | |
127 | + if (response_.size() > 0) { | |
128 | + boost::asio::streambuf::const_buffers_type cbt = response_.data(); | |
129 | + responseData_ += std::string(boost::asio::buffers_begin(cbt), boost::asio::buffers_end(cbt)); | |
130 | +#ifdef _DEBUG | |
131 | + std::cout << &response_; | |
132 | +#endif | |
133 | + } | |
134 | + | |
135 | + // 开始读取剩余所有内容 | |
136 | + boost::asio::async_read(socket_, response_, | |
137 | + boost::asio::transfer_at_least(1), | |
138 | + boost::bind(&DmpHttpUtils::handle_read_content, this, | |
139 | + boost::asio::placeholders::error)); | |
140 | +} | |
141 | +void DmpHttp::DmpHttpUtils::handle_read_content(const boost::system::error_code& err) { | |
142 | + if (!err) { | |
143 | + | |
144 | + // 输出读到的数据 | |
145 | + boost::asio::streambuf::const_buffers_type cbt = response_.data(); | |
146 | + | |
147 | + responseData_ = std::string(boost::asio::buffers_begin(cbt), boost::asio::buffers_end(cbt)); | |
148 | +#ifdef _DEBUG | |
149 | + std::cout << &response_; | |
150 | +#endif | |
151 | + | |
152 | + // 继续读取剩余内容,直到读到EOF | |
153 | + boost::asio::async_read(socket_, response_, | |
154 | + boost::asio::transfer_at_least(1), | |
155 | + boost::bind(&DmpHttpUtils::handle_read_content, this, | |
156 | + boost::asio::placeholders::error)); | |
157 | + | |
158 | + } | |
159 | + else if (err != boost::asio::error::eof) { | |
160 | + std::cout << "Error: " << err << "\n"; | |
161 | + } | |
162 | + else { | |
163 | + socket_.close(); | |
164 | + resolver_.cancel(); | |
165 | + std::cout << "读取响应数据完毕." << std::endl; | |
166 | + //std::cout << responseData_; | |
167 | + } | |
168 | +} | |
169 | + | |
170 | + | |
171 | +std::string DmpHttp::post(std::string url) { | |
172 | + boost::asio::io_service io; | |
173 | + DmpHttp::DmpHttpUtils c(io); | |
174 | + c.post(url); | |
175 | + io.run(); | |
176 | + return c.getResponse(); | |
177 | +} | |
178 | + | |
179 | +std::string DmpHttp::get(std::string url) { | |
180 | + boost::asio::io_service io; | |
181 | + DmpHttp::DmpHttpUtils c(io); | |
182 | + c.get(url); | |
183 | + io.run(); | |
184 | + return c.getResponse(); | |
185 | 185 | } |
\ No newline at end of file | ... | ... |
1 | -/************************************************************************** | |
2 | -* file: dmphttputils.h | |
3 | - | |
4 | -* Author: lijiahuan | |
5 | -* Date: 2021-12-09 17:41:00 | |
6 | -* Email: jiahuanl@chinadci.com | |
7 | -* copyright: 广州城市信息研究所有限公司 | |
8 | -***************************************************************************/ | |
9 | -#ifndef __dmppghttputils_h__ | |
10 | -#define __dmppghttputils_h__ | |
11 | -#include <iostream> | |
12 | -#include <boost/asio.hpp> | |
13 | -#include "dmphttpbase.h" | |
14 | - | |
15 | -namespace DmpHttp | |
16 | -{ | |
17 | - class DmpHttpUtils : public DmpHttpBase | |
18 | - { | |
19 | - public: | |
20 | - DmpHttpUtils(boost::asio::io_service& io_service); | |
21 | - virtual ~DmpHttpUtils(); | |
22 | - virtual int post(const std::string& url); | |
23 | - virtual int get(const std::string& url); | |
24 | - | |
25 | - virtual std::string getResponse(void) {return responseData_;} | |
26 | - private: | |
27 | - // 建立请求 | |
28 | - void handle_request_resolve(const std::string& url, pBuildRequest func); | |
29 | - // 解析后 | |
30 | - void handle_resolve(const boost::system::error_code& err, | |
31 | - boost::asio::ip::tcp::resolver::iterator endpoint_iterator); | |
32 | - // 连接后 | |
33 | - void handle_connect(const boost::system::error_code& err); | |
34 | - // 发送请求后 | |
35 | - void handle_write_request(const boost::system::error_code& err); | |
36 | - // 读取响应后 | |
37 | - void handle_read_status_line(const boost::system::error_code& err); | |
38 | - // 读取响应头后 | |
39 | - void handle_read_headers(const boost::system::error_code& err); | |
40 | - // 读取正文数据后 | |
41 | - void handle_read_content(const boost::system::error_code& err); | |
42 | - private: | |
43 | - // 解析器 | |
44 | - boost::asio::ip::tcp::resolver resolver_; | |
45 | - // 套接字 | |
46 | - boost::asio::ip::tcp::socket socket_; | |
47 | - // 请求缓冲区 | |
48 | - boost::asio::streambuf request_; | |
49 | - // 响应缓冲区 | |
50 | - boost::asio::streambuf response_; | |
51 | - // 响应数据 | |
52 | - std::string responseData_; | |
53 | - }; | |
54 | - std::string post(std::string url); | |
55 | - std::string get(std::string url); | |
56 | -} | |
57 | - | |
1 | +/************************************************************************** | |
2 | +* file: dmphttputils.h | |
3 | + | |
4 | +* Author: lijiahuan | |
5 | +* Date: 2021-12-09 17:41:00 | |
6 | +* Email: jiahuanl@chinadci.com | |
7 | +* copyright: 广州城市信息研究所有限公司 | |
8 | +***************************************************************************/ | |
9 | +#ifndef __dmppghttputils_h__ | |
10 | +#define __dmppghttputils_h__ | |
11 | +#include <iostream> | |
12 | +#include <boost/asio.hpp> | |
13 | +#include "dmphttpbase.h" | |
14 | + | |
15 | +namespace DmpHttp | |
16 | +{ | |
17 | + class DmpHttpUtils : public DmpHttpBase | |
18 | + { | |
19 | + public: | |
20 | + DmpHttpUtils(boost::asio::io_service& io_service); | |
21 | + virtual ~DmpHttpUtils(); | |
22 | + virtual int post(const std::string& url); | |
23 | + virtual int get(const std::string& url); | |
24 | + | |
25 | + virtual std::string getResponse(void) {return responseData_;} | |
26 | + private: | |
27 | + // 建立请求 | |
28 | + void handle_request_resolve(const std::string& url, pBuildRequest func); | |
29 | + // 解析后 | |
30 | + void handle_resolve(const boost::system::error_code& err, | |
31 | + boost::asio::ip::tcp::resolver::iterator endpoint_iterator); | |
32 | + // 连接后 | |
33 | + void handle_connect(const boost::system::error_code& err); | |
34 | + // 发送请求后 | |
35 | + void handle_write_request(const boost::system::error_code& err); | |
36 | + // 读取响应后 | |
37 | + void handle_read_status_line(const boost::system::error_code& err); | |
38 | + // 读取响应头后 | |
39 | + void handle_read_headers(const boost::system::error_code& err); | |
40 | + // 读取正文数据后 | |
41 | + void handle_read_content(const boost::system::error_code& err); | |
42 | + private: | |
43 | + // 解析器 | |
44 | + boost::asio::ip::tcp::resolver resolver_; | |
45 | + // 套接字 | |
46 | + boost::asio::ip::tcp::socket socket_; | |
47 | + // 请求缓冲区 | |
48 | + boost::asio::streambuf request_; | |
49 | + // 响应缓冲区 | |
50 | + boost::asio::streambuf response_; | |
51 | + // 响应数据 | |
52 | + std::string responseData_; | |
53 | + }; | |
54 | + std::string post(std::string url); | |
55 | + std::string get(std::string url); | |
56 | +} | |
57 | + | |
58 | 58 | #endif //__dmphttpsutils_h__ |
\ No newline at end of file | ... | ... |
1 | -/************************************************************************** | |
2 | -* file: dmptmstileprovider.cpp | |
3 | - | |
4 | -* Author: lijiahuan | |
5 | -* Date: 2021-12-09 17:41:00 | |
6 | -* Email: jiahuanl@chinadci.com | |
7 | -* copyright: 广州城市信息研究所有限公司 | |
8 | -***************************************************************************/ | |
9 | -#include "dmptmstileprovider.h" | |
10 | -#include "dmpserverresponse.h" | |
11 | -namespace DmpTms | |
12 | -{ | |
13 | - DmpTmsTileProvider::DmpTmsTileProvider(const std::string& root_path) | |
14 | - { | |
15 | - file_rootPath=root_path; | |
16 | - } | |
17 | - void DmpTmsTileProvider::WriteTile(const int row, const int col, const int level, const std::string& format, DmpServerResponse& response) | |
18 | - { | |
19 | - std::string tile_path = file_rootPath+"/"+std::to_string(level)+"/"+std::to_string(row)+"/"+std::to_string(col)+"."+format; | |
20 | - std::ifstream fread(tile_path, std::ifstream::binary); | |
21 | - if(!fread) | |
22 | - { | |
23 | - response.sendError(500, "找不到瓦片:("); | |
24 | - return; | |
25 | - } | |
26 | - fread.seekg(0,fread.end); | |
27 | - int length = fread.tellg(); | |
28 | - if(length > 0) | |
29 | - { | |
30 | - fread.seekg(0,fread.beg); | |
31 | - char* buff = new char[length]; | |
32 | - fread.read(buff,length); | |
33 | - | |
34 | - std::string f = (format == "jpg") ? "image/jpg" : "image/png"; | |
35 | - response.setHeader("Content-Type", f); | |
36 | - response.writeContent(buff, length); | |
37 | - | |
38 | - delete buff; | |
39 | - } | |
40 | - else | |
41 | - { | |
42 | - response.sendError(500, "找不到瓦片:("); | |
43 | - } | |
44 | - fread.close(); | |
45 | - } | |
1 | +/************************************************************************** | |
2 | +* file: dmptmstileprovider.cpp | |
3 | + | |
4 | +* Author: lijiahuan | |
5 | +* Date: 2021-12-09 17:41:00 | |
6 | +* Email: jiahuanl@chinadci.com | |
7 | +* copyright: 广州城市信息研究所有限公司 | |
8 | +***************************************************************************/ | |
9 | +#include "dmptmstileprovider.h" | |
10 | +#include "dmpserverresponse.h" | |
11 | +namespace DmpTms | |
12 | +{ | |
13 | + DmpTmsTileProvider::DmpTmsTileProvider(const std::string& root_path) | |
14 | + { | |
15 | + file_rootPath=root_path; | |
16 | + } | |
17 | + void DmpTmsTileProvider::WriteTile(const int row, const int col, const int level, const std::string& format, DmpServerResponse& response) | |
18 | + { | |
19 | + std::string tile_path = file_rootPath+"/"+std::to_string(level)+"/"+std::to_string(row)+"/"+std::to_string(col)+"."+format; | |
20 | + std::ifstream fread(tile_path, std::ifstream::binary); | |
21 | + if(!fread) | |
22 | + { | |
23 | + response.sendError(500, "找不到瓦片:("); | |
24 | + return; | |
25 | + } | |
26 | + fread.seekg(0,fread.end); | |
27 | + int length = fread.tellg(); | |
28 | + if(length > 0) | |
29 | + { | |
30 | + fread.seekg(0,fread.beg); | |
31 | + char* buff = new char[length]; | |
32 | + fread.read(buff,length); | |
33 | + | |
34 | + std::string f = (format == "jpg") ? "image/jpg" : "image/png"; | |
35 | + response.setHeader("Content-Type", f); | |
36 | + response.writeContent(buff, length); | |
37 | + | |
38 | + delete buff; | |
39 | + } | |
40 | + else | |
41 | + { | |
42 | + response.sendError(500, "找不到瓦片:("); | |
43 | + } | |
44 | + fread.close(); | |
45 | + } | |
46 | 46 | } |
\ No newline at end of file | ... | ... |
1 | -/************************************************************************** | |
2 | -* file: dmptmstileprovider.h | |
3 | - | |
4 | -* Author: lijiahuan | |
5 | -* Date: 2021-12-09 17:41:00 | |
6 | -* Email: jiahuanl@chinadci.com | |
7 | -* copyright: 广州城市信息研究所有限公司 | |
8 | -***************************************************************************/ | |
9 | -#ifndef __dmptmstileprovider_h__ | |
10 | -#define __dmptmstileprovider_h__ | |
11 | - | |
12 | -#include <string> | |
13 | -#include "dmpserverresponse.h" | |
14 | - | |
15 | -namespace DmpTms | |
16 | -{ | |
17 | - class DmpTmsTileProvider | |
18 | - { | |
19 | - public: | |
20 | - std::string ImageFormat() const; | |
21 | - DmpTmsTileProvider(const std::string& root_path); | |
22 | - void WriteTile(const int row, const int col, const int level, const std::string& format, DmpServerResponse& response) ; | |
23 | - protected: | |
24 | - std::string file_rootPath; | |
25 | - }; | |
26 | -} | |
27 | - | |
1 | +/************************************************************************** | |
2 | +* file: dmptmstileprovider.h | |
3 | + | |
4 | +* Author: lijiahuan | |
5 | +* Date: 2021-12-09 17:41:00 | |
6 | +* Email: jiahuanl@chinadci.com | |
7 | +* copyright: 广州城市信息研究所有限公司 | |
8 | +***************************************************************************/ | |
9 | +#ifndef __dmptmstileprovider_h__ | |
10 | +#define __dmptmstileprovider_h__ | |
11 | + | |
12 | +#include <string> | |
13 | +#include "dmpserverresponse.h" | |
14 | + | |
15 | +namespace DmpTms | |
16 | +{ | |
17 | + class DmpTmsTileProvider | |
18 | + { | |
19 | + public: | |
20 | + std::string ImageFormat() const; | |
21 | + DmpTmsTileProvider(const std::string& root_path); | |
22 | + void WriteTile(const int row, const int col, const int level, const std::string& format, DmpServerResponse& response) ; | |
23 | + protected: | |
24 | + std::string file_rootPath; | |
25 | + }; | |
26 | +} | |
27 | + | |
28 | 28 | #endif |
\ No newline at end of file | ... | ... |
请
注册
或
登录
后发表评论