summaryrefslogtreecommitdiffstats
path: root/src/web_service/web_backend.h
blob: d75fbcc15509a178e1f9e497e0104f4b47d313f7 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
// Copyright 2017 Citra Emulator Project
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.

#pragma once

#include <functional>
#include <mutex>
#include <string>
#include <tuple>
#include <httplib.h>
#include "common/common_types.h"
#include "common/web_result.h"

namespace httplib {
class Client;
}

namespace WebService {

class Client {
public:
    Client(const std::string& host, const std::string& username, const std::string& token);

    /**
     * Posts JSON to the specified path.
     * @param path the URL segment after the host address.
     * @param data String of JSON data to use for the body of the POST request.
     * @param allow_anonymous If true, allow anonymous unauthenticated requests.
     * @return the result of the request.
     */
    Common::WebResult PostJson(const std::string& path, const std::string& data,
                               bool allow_anonymous) {
        return GenericJson("POST", path, data, allow_anonymous);
    }

    /**
     * Gets JSON from the specified path.
     * @param path the URL segment after the host address.
     * @param allow_anonymous If true, allow anonymous unauthenticated requests.
     * @return the result of the request.
     */
    Common::WebResult GetJson(const std::string& path, bool allow_anonymous) {
        return GenericJson("GET", path, "", allow_anonymous);
    }

    /**
     * Deletes JSON to the specified path.
     * @param path the URL segment after the host address.
     * @param data String of JSON data to use for the body of the DELETE request.
     * @param allow_anonymous If true, allow anonymous unauthenticated requests.
     * @return the result of the request.
     */
    Common::WebResult DeleteJson(const std::string& path, const std::string& data,
                                 bool allow_anonymous) {
        return GenericJson("DELETE", path, data, allow_anonymous);
    }

private:
    /// A generic function handles POST, GET and DELETE request together
    Common::WebResult GenericJson(const std::string& method, const std::string& path,
                                  const std::string& data, bool allow_anonymous);

    /**
     * A generic function with explicit authentication method specified
     * JWT is used if the jwt parameter is not empty
     * username + token is used if jwt is empty but username and token are not empty
     * anonymous if all of jwt, username and token are empty
     */
    Common::WebResult GenericJson(const std::string& method, const std::string& path,
                                  const std::string& data, const std::string& jwt = "",
                                  const std::string& username = "", const std::string& token = "");

    // Retrieve a new JWT from given username and token
    void UpdateJWT();

    std::string host;
    std::string username;
    std::string token;
    std::string jwt;
    std::unique_ptr<httplib::Client> cli;

    struct JWTCache {
        std::mutex mutex;
        std::string username;
        std::string token;
        std::string jwt;
    };
    static JWTCache jwt_cache;
};

} // namespace WebService