1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab ft=cpp
6 #include "rgw_http_client.h"
10 class RGWHTTPSimpleRequest
: public RGWHTTPClient
{
15 using unique_lock
= std::unique_lock
<std::mutex
>;
17 std::mutex out_headers_lock
;
18 map
<string
, string
> out_headers
;
21 bufferlist::iterator
*send_iter
;
23 size_t max_response
; /* we need this as we don't stream out response */
26 virtual int handle_header(const string
& name
, const string
& val
);
27 void get_params_str(map
<string
, string
>& extra_args
, string
& dest
);
30 RGWHTTPSimpleRequest(CephContext
*_cct
, const string
& _method
, const string
& _url
,
31 param_vec_t
*_headers
, param_vec_t
*_params
) : RGWHTTPClient(_cct
, _method
, _url
),
32 http_status(0), status(0),
35 set_headers(_headers
);
39 void set_headers(param_vec_t
*_headers
) {
44 void set_params(param_vec_t
*_params
) {
49 int receive_header(void *ptr
, size_t len
) override
;
50 int receive_data(void *ptr
, size_t len
, bool *pause
) override
;
51 int send_data(void *ptr
, size_t len
, bool* pause
=nullptr) override
;
53 bufferlist
& get_response() { return response
; }
55 void get_out_headers(map
<string
, string
> *pheaders
); /* modifies out_headers */
57 int get_http_status() { return http_status
; }
61 class RGWRESTSimpleRequest
: public RGWHTTPSimpleRequest
{
63 RGWRESTSimpleRequest(CephContext
*_cct
, const string
& _method
, const string
& _url
,
64 param_vec_t
*_headers
, param_vec_t
*_params
) : RGWHTTPSimpleRequest(_cct
, _method
, _url
, _headers
, _params
) {}
66 int execute(const DoutPrefixProvider
*dpp
, RGWAccessKey
& key
, const char *method
, const char *resource
, optional_yield y
);
67 int forward_request(const DoutPrefixProvider
*dpp
, RGWAccessKey
& key
, req_info
& info
, size_t max_response
, bufferlist
*inbl
, bufferlist
*outbl
, optional_yield y
);
70 class RGWWriteDrainCB
{
72 RGWWriteDrainCB() = default;
73 virtual ~RGWWriteDrainCB() = default;
74 virtual void notify(uint64_t pending_size
) = 0;
77 class RGWRESTGenerateHTTPHeaders
{
86 RGWRESTGenerateHTTPHeaders(CephContext
*_cct
, RGWEnv
*_env
, req_info
*_info
) : cct(_cct
), new_env(_env
), new_info(_info
) {}
87 void init(const string
& method
, const string
& url
, const string
& resource
, const param_vec_t
& params
);
88 void set_extra_headers(const map
<string
, string
>& extra_headers
);
89 int set_obj_attrs(const DoutPrefixProvider
*dpp
, map
<string
, bufferlist
>& rgw_attrs
);
90 void set_http_attrs(const map
<string
, string
>& http_attrs
);
91 void set_policy(RGWAccessControlPolicy
& policy
);
92 int sign(const DoutPrefixProvider
*dpp
, RGWAccessKey
& key
);
94 const string
& get_url() { return url
; }
97 class RGWHTTPStreamRWRequest
: public RGWHTTPSimpleRequest
{
103 ceph::make_mutex("RGWHTTPStreamRWRequest");
104 ceph::mutex write_lock
=
105 ceph::make_mutex("RGWHTTPStreamRWRequest::write_lock");
106 ReceiveCB
*cb
{nullptr};
107 RGWWriteDrainCB
*write_drain_cb
{nullptr};
112 uint64_t write_ofs
{0};
113 bool read_paused
{false};
114 bool send_paused
{false};
115 bool stream_writes
{false};
116 bool write_stream_complete
{false};
118 int handle_header(const string
& name
, const string
& val
) override
;
120 int send_data(void *ptr
, size_t len
, bool *pause
) override
;
121 int receive_data(void *ptr
, size_t len
, bool *pause
) override
;
125 uint64_t extra_data_len
{0};
127 ReceiveCB() = default;
128 virtual ~ReceiveCB() = default;
129 virtual int handle_data(bufferlist
& bl
, bool *pause
= nullptr) = 0;
130 virtual void set_extra_data_len(uint64_t len
) {
131 extra_data_len
= len
;
135 RGWHTTPStreamRWRequest(CephContext
*_cct
, const string
& _method
, const string
& _url
,
136 param_vec_t
*_headers
, param_vec_t
*_params
) : RGWHTTPSimpleRequest(_cct
, _method
, _url
, _headers
, _params
) {
138 RGWHTTPStreamRWRequest(CephContext
*_cct
, const string
& _method
, const string
& _url
, ReceiveCB
*_cb
,
139 param_vec_t
*_headers
, param_vec_t
*_params
) : RGWHTTPSimpleRequest(_cct
, _method
, _url
, _headers
, _params
),
142 virtual ~RGWHTTPStreamRWRequest() override
{}
144 void set_outbl(bufferlist
& _outbl
) {
148 void set_in_cb(ReceiveCB
*_cb
) { cb
= _cb
; }
149 void set_write_drain_cb(RGWWriteDrainCB
*_cb
) { write_drain_cb
= _cb
; }
151 void unpause_receive();
153 void add_send_data(bufferlist
& bl
);
155 void set_stream_write(bool s
);
157 uint64_t get_pending_send_size();
159 /* finish streaming writes */
163 class RGWRESTStreamRWRequest
: public RGWHTTPStreamRWRequest
{
165 HostStyle host_style
;
167 RGWRESTStreamRWRequest(CephContext
*_cct
, const string
& _method
, const string
& _url
, RGWHTTPStreamRWRequest::ReceiveCB
*_cb
,
168 param_vec_t
*_headers
, param_vec_t
*_params
, HostStyle _host_style
= PathStyle
) : RGWHTTPStreamRWRequest(_cct
, _method
, _url
, _cb
, _headers
, _params
), host_style(_host_style
) {
170 virtual ~RGWRESTStreamRWRequest() override
{}
172 int send_prepare(const DoutPrefixProvider
*dpp
, RGWAccessKey
*key
, map
<string
, string
>& extra_headers
, const string
& resource
, bufferlist
*send_data
= nullptr /* optional input data */);
173 int send_prepare(const DoutPrefixProvider
*dpp
, RGWAccessKey
& key
, map
<string
, string
>& extra_headers
, const rgw_obj
& obj
);
174 int send(RGWHTTPManager
*mgr
);
176 int send_request(const DoutPrefixProvider
*dpp
, RGWAccessKey
& key
, map
<string
, string
>& extra_headers
, const rgw_obj
& obj
, RGWHTTPManager
*mgr
);
177 int send_request(const DoutPrefixProvider
*dpp
, RGWAccessKey
*key
, map
<string
, string
>& extra_headers
, const string
& resource
, RGWHTTPManager
*mgr
, bufferlist
*send_data
= nullptr /* optional input data */);
179 int complete_request(optional_yield y
,
180 string
*etag
= nullptr,
181 real_time
*mtime
= nullptr,
182 uint64_t *psize
= nullptr,
183 map
<string
, string
> *pattrs
= nullptr,
184 map
<string
, string
> *pheaders
= nullptr);
186 void add_params(param_vec_t
*params
);
189 int do_send_prepare(const DoutPrefixProvider
*dpp
, RGWAccessKey
*key
, map
<string
, string
>& extra_headers
, const string
& resource
, bufferlist
*send_data
= nullptr /* optional input data */);
192 class RGWRESTStreamReadRequest
: public RGWRESTStreamRWRequest
{
194 RGWRESTStreamReadRequest(CephContext
*_cct
, const string
& _url
, ReceiveCB
*_cb
, param_vec_t
*_headers
,
195 param_vec_t
*_params
, HostStyle _host_style
= PathStyle
) : RGWRESTStreamRWRequest(_cct
, "GET", _url
, _cb
, _headers
, _params
, _host_style
) {}
198 class RGWRESTStreamHeadRequest
: public RGWRESTStreamRWRequest
{
200 RGWRESTStreamHeadRequest(CephContext
*_cct
, const string
& _url
, ReceiveCB
*_cb
, param_vec_t
*_headers
,
201 param_vec_t
*_params
) : RGWRESTStreamRWRequest(_cct
, "HEAD", _url
, _cb
, _headers
, _params
) {}
204 class RGWRESTStreamS3PutObj
: public RGWRESTStreamRWRequest
{
205 RGWGetDataCB
*out_cb
;
208 RGWRESTGenerateHTTPHeaders headers_gen
;
210 RGWRESTStreamS3PutObj(CephContext
*_cct
, const string
& _method
, const string
& _url
, param_vec_t
*_headers
,
211 param_vec_t
*_params
, HostStyle _host_style
) : RGWRESTStreamRWRequest(_cct
, _method
, _url
, nullptr, _headers
, _params
, _host_style
),
212 out_cb(NULL
), new_info(cct
, &new_env
), headers_gen(_cct
, &new_env
, &new_info
) {}
213 ~RGWRESTStreamS3PutObj() override
;
215 void send_init(rgw::sal::RGWObject
* obj
);
216 int send_ready(const DoutPrefixProvider
*dpp
, RGWAccessKey
& key
, map
<string
, bufferlist
>& rgw_attrs
, bool send
);
217 int send_ready(const DoutPrefixProvider
*dpp
, RGWAccessKey
& key
, const map
<string
, string
>& http_attrs
,
218 RGWAccessControlPolicy
& policy
, bool send
);
219 int send_ready(const DoutPrefixProvider
*dpp
, RGWAccessKey
& key
, bool send
);
221 int put_obj_init(const DoutPrefixProvider
*dpp
, RGWAccessKey
& key
, rgw::sal::RGWObject
* obj
, uint64_t obj_size
, map
<string
, bufferlist
>& attrs
, bool send
);
223 RGWGetDataCB
*get_out_cb() { return out_cb
; }