4 #include <boost/algorithm/hex.hpp>
5 #include <boost/algorithm/string.hpp>
6 #include <boost/filesystem.hpp>
12 #include "json/json.h"
14 #include "crypto/crypto.h"
15 #include "http/httpinterface.h"
16 #include "logging/logging.h"
18 #include "utilities/utils.h"
20 enum class ProvisioningResult { kOK, kFailure };
25 HttpFake(
const boost::filesystem::path &test_dir_in, std::string flavor =
"",
26 const boost::filesystem::path &meta_dir_in =
"")
27 : test_dir(test_dir_in), flavor_(std::move(flavor)), meta_dir(meta_dir_in) {
28 if (meta_dir.empty()) {
29 meta_dir = temp_meta_dir.Path();
36 void setCerts(
const std::string &ca, CryptoSource ca_source,
const std::string &cert, CryptoSource cert_source,
37 const std::string &pkey, CryptoSource pkey_source)
override {
47 bool rewrite(std::string &url,
const std::string &pattern) {
48 size_t pat_pos = url.find(pattern);
49 if (pat_pos == std::string::npos) {
52 size_t ext_pos = pattern.find(
".json");
53 if (ext_pos == std::string::npos) {
54 LOG_ERROR <<
"Invalid pattern";
59 url.replace(pat_pos + ext_pos, std::string(
".json").size(),
"_" + flavor_ +
".json");
63 virtual HttpResponse handle_event(
const std::string &url,
const Json::Value &
data) {
70 HttpResponse get(
const std::string &url, int64_t maxsize)
override {
72 std::cout <<
"URL requested: " << url <<
"\n";
74 std::string new_url = url;
75 if (!flavor_.empty()) {
76 rewrite(new_url,
"director/targets.json") || rewrite(new_url,
"repo/timestamp.json") ||
77 rewrite(new_url,
"repo/targets.json") || rewrite(new_url,
"snapshot.json");
80 std::cout <<
"Rewritten to: " << new_url <<
"\n";
84 const boost::filesystem::path path = meta_dir / new_url.substr(tls_server.size());
86 std::cout <<
"file served: " << path <<
"\n";
88 if (boost::filesystem::exists(path)) {
89 return HttpResponse(Utils::readFile(path), 200, CURLE_OK,
"");
91 std::cout <<
"not found: " << path <<
"\n";
96 HttpResponse post(
const std::string &url,
const std::string &content_type,
const std::string &
data)
override {
103 HttpResponse post(
const std::string &url,
const Json::Value &
data)
override {
104 if (url.find(
"/devices") != std::string::npos || url.find(
"/director/ecus") != std::string::npos || url.empty()) {
105 LOG_ERROR <<
"OK create device";
106 Utils::writeFile((test_dir /
"post.json").
string(),
data);
107 if (provisioningResponse == ProvisioningResult::kOK) {
108 return HttpResponse(Utils::readFile(
"tests/test_data/cred.p12"), 200, CURLE_OK,
"");
112 }
else if (url.find(
"/events") != std::string::npos) {
113 return handle_event(url,
data);
119 HttpResponse put(
const std::string &url,
const std::string &content_type,
const std::string &
data)
override {
126 HttpResponse put(
const std::string &url,
const Json::Value &
data)
override {
127 last_manifest =
data;
131 std::future<HttpResponse> downloadAsync(
const std::string &url, curl_write_callback write_cb,
132 curl_xferinfo_callback progress_cb,
void *userp, curl_off_t from,
133 CurlHandler *easyp)
override {
139 std::cout <<
"URL requested: " << url <<
"\n";
140 const boost::filesystem::path path = meta_dir / url.substr(tls_server.size());
141 std::cout <<
"file served: " << path <<
"\n";
143 std::promise<HttpResponse> resp_promise;
144 auto resp_future = resp_promise.get_future();
146 [path, write_cb, progress_cb, userp, url](std::promise<HttpResponse> promise) {
147 std::string content = Utils::readFile(path.string());
148 for (
unsigned int i = 0; i < content.size(); ++i) {
149 write_cb(const_cast<char *>(&content[i]), 1, 1, userp);
150 progress_cb(userp, 0, 0, 0, 0);
151 if (url.find(
"downloads/repo/targets/primary_firmware.txt") != std::string::npos) {
152 std::this_thread::sleep_for(std::chrono::milliseconds(100));
155 promise.set_value(
HttpResponse(content, 200, CURLE_OK,
""));
157 std::move(resp_promise))
163 HttpResponse download(
const std::string &url, curl_write_callback write_cb, curl_xferinfo_callback progress_cb,
164 void *userp, curl_off_t from)
override {
165 return downloadAsync(url, write_cb, progress_cb, userp, from,
nullptr).get();
168 const std::string tls_server =
"https://tlsserver.com";
169 ProvisioningResult provisioningResponse{ProvisioningResult::kOK};
170 Json::Value last_manifest;
173 boost::filesystem::path test_dir;
175 boost::filesystem::path meta_dir;
179 #endif // HTTPFAKE_H_