1#ifndef CPR_REDIRECT_H
2#define CPR_REDIRECT_H
3
4#include <cstdint>
5
6namespace cpr {
7enum class PostRedirectFlags : uint8_t {
8 /**
9 * Respect RFC 7231 (section 6.4.2 to 6.4.4).
10 * Same as CURL_REDIR_POST_301 (https://curl.se/libcurl/c/CURLOPT_POSTREDIR.html).
11 **/
12 POST_301 = 0x1 << 0,
13 /**
14 * Maintain the request method after a 302 redirect.
15 * Same as CURL_REDIR_POST_302 (https://curl.se/libcurl/c/CURLOPT_POSTREDIR.html).
16 **/
17 POST_302 = 0x1 << 1,
18 /**
19 * Maintain the request method after a 303 redirect.
20 * Same as CURL_REDIR_POST_303 (https://curl.se/libcurl/c/CURLOPT_POSTREDIR.html).
21 **/
22 POST_303 = 0x1 << 2,
23 /**
24 * Default value.
25 * Convenience option to enable all flags.
26 * Same as CURL_REDIR_POST_ALL (https://curl.se/libcurl/c/CURLOPT_POSTREDIR.html).
27 **/
28 POST_ALL = POST_301 | POST_302 | POST_303,
29 /**
30 * * Convenience option to disable all flags.
31 **/
32 NONE = 0x0
33};
34
35PostRedirectFlags operator|(PostRedirectFlags lhs, PostRedirectFlags rhs);
36PostRedirectFlags operator&(PostRedirectFlags lhs, PostRedirectFlags rhs);
37PostRedirectFlags operator^(PostRedirectFlags lhs, PostRedirectFlags rhs);
38PostRedirectFlags operator~(PostRedirectFlags flag);
39PostRedirectFlags& operator|=(PostRedirectFlags& lhs, PostRedirectFlags rhs);
40PostRedirectFlags& operator&=(PostRedirectFlags& lhs, PostRedirectFlags rhs);
41PostRedirectFlags& operator^=(PostRedirectFlags& lhs, PostRedirectFlags rhs);
42bool any(PostRedirectFlags flag);
43
44class Redirect {
45 public:
46 /**
47 * The maximum number of redirects to follow.
48 * 0: Refuse any redirects.
49 * -1: Infinite number of redirects.
50 * Default: 50
51 * https://curl.se/libcurl/c/CURLOPT_MAXREDIRS.html
52 **/
53 // NOLINTNEXTLINE (google-runtime-int)
54 long maximum{50L};
55 /**
56 * Follow 3xx redirects.
57 * Default: true
58 * https://curl.se/libcurl/c/CURLOPT_FOLLOWLOCATION.html
59 **/
60 bool follow{true};
61 /**
62 * Continue to send authentication (user+password) credentials when following locations, even when hostname changed.
63 * Default: false
64 * https://curl.se/libcurl/c/CURLOPT_UNRESTRICTED_AUTH.html
65 **/
66 bool cont_send_cred{false};
67 /**
68 * Flags to control how to act after a redirect for a post request.
69 * Default: POST_ALL
70 **/
71 PostRedirectFlags post_flags{PostRedirectFlags::POST_ALL};
72
73 Redirect() = default;
74 // NOLINTNEXTLINE (google-runtime-int)
75 Redirect(long p_maximum, bool p_follow, bool p_cont_send_cred, PostRedirectFlags p_post_flags) : maximum(p_maximum), follow(p_follow), cont_send_cred(p_cont_send_cred), post_flags(p_post_flags){};
76 // NOLINTNEXTLINE (google-runtime-int)
77 explicit Redirect(long p_maximum) : maximum(p_maximum){};
78 explicit Redirect(bool p_follow) : follow(p_follow){};
79 Redirect(bool p_follow, bool p_cont_send_cred) : follow(p_follow), cont_send_cred(p_cont_send_cred){};
80 explicit Redirect(PostRedirectFlags p_post_flags) : post_flags(p_post_flags){};
81};
82} // namespace cpr
83
84#endif
85