Skip to content

Commit 074e875

Browse files
committed
Include CORS headers in bitcoind POST response as required.
1 parent aea290f commit 074e875

File tree

3 files changed

+40
-12
lines changed

3 files changed

+40
-12
lines changed

include/bitcoin/node/protocols/protocol_bitcoind.hpp

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,9 @@ class BCN_API protocol_bitcoind
4949
void start() NOEXCEPT override;
5050

5151
protected:
52+
using post = network::http::method::post;
53+
using options = network::http::method::options;
54+
5255
template <class Derived, typename Method, typename... Args>
5356
inline void subscribe(Method&& method, Args&&... args) NOEXCEPT
5457
{
@@ -59,7 +62,7 @@ class BCN_API protocol_bitcoind
5962
void handle_receive_options(const code& ec,
6063
const network::http::method::options::cptr& options) NOEXCEPT override;
6164
void handle_receive_post(const code& ec,
62-
const network::http::method::post::cptr& post) NOEXCEPT override;
65+
const post::cptr& post) NOEXCEPT override;
6366

6467
/// Handlers.
6568
bool handle_get_best_block_hash(const code& ec,
@@ -101,14 +104,19 @@ class BCN_API protocol_bitcoind
101104
interface::verify_tx_out_set, const std::string&) NOEXCEPT;
102105

103106
private:
104-
void send_json(boost::json::value&& model, size_t size_hint,
105-
const network::http::request& request={}) NOEXCEPT;
107+
// Provide the request for serialization, keeping it out of dispatch.
108+
void set_post(const post::cptr& post) NOEXCEPT;
109+
const post& get_post() const NOEXCEPT;
110+
111+
// Send the response.
112+
void send_json(boost::json::value&& model, size_t size_hint) NOEXCEPT;
106113

107114
// This is thread safe.
108115
////const options_t& options_;
109116

110-
// This is protected by strand.
117+
// These are protected by strand.
111118
dispatcher dispatcher_{};
119+
post::cptr post_{};
112120
};
113121

114122
} // namespace node

src/protocols/protocol_bitcoind.cpp

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ void protocol_bitcoind::start() NOEXCEPT
7474
// ----------------------------------------------------------------------------
7575

7676
void protocol_bitcoind::handle_receive_options(const code& ec,
77-
const network::http::method::options::cptr& options) NOEXCEPT
77+
const options::cptr& options) NOEXCEPT
7878
{
7979
BC_ASSERT(stranded());
8080

@@ -100,7 +100,7 @@ void protocol_bitcoind::handle_receive_options(const code& ec,
100100

101101
// TODO: also handle_receive_get and dispatch based on URL parse.
102102
void protocol_bitcoind::handle_receive_post(const code& ec,
103-
const network::http::method::post::cptr& post) NOEXCEPT
103+
const post::cptr& post) NOEXCEPT
104104
{
105105
BC_ASSERT(stranded());
106106

@@ -145,14 +145,14 @@ void protocol_bitcoind::handle_receive_post(const code& ec,
145145
return;
146146
}
147147

148-
// TODO: post-process request.
149-
// github.com/bitcoin/bitcoin/blob/master/doc/JSON-RPC-interface.md
148+
set_post(post);
150149
if (const auto code = dispatcher_.notify(request))
151150
stop(code);
152151
}
153152

154153
// Handlers.
155154
// ----------------------------------------------------------------------------
155+
// github.com/bitcoin/bitcoin/blob/master/doc/JSON-RPC-interface.md
156156
// TODO: precompute size for buffer hints.
157157

158158
// {"jsonrpc": "1.0", "id": "curltest", "method": "getbestblockhash", "params": []}
@@ -283,14 +283,28 @@ bool protocol_bitcoind::handle_verify_tx_out_set(const code& ec,
283283
// private
284284
// ----------------------------------------------------------------------------
285285

286+
void protocol_bitcoind::set_post(const post::cptr& post) NOEXCEPT
287+
{
288+
BC_ASSERT(post);
289+
post_ = post;
290+
}
291+
292+
const protocol_bitcoind::post& protocol_bitcoind::get_post() const NOEXCEPT
293+
{
294+
BC_ASSERT(post_);
295+
return *post_;
296+
}
297+
286298
// TODO: post-process response for json-rpc version.
287-
void protocol_bitcoind::send_json(boost::json::value&& model, size_t size_hint,
288-
const request& request) NOEXCEPT
299+
void protocol_bitcoind::send_json(boost::json::value&& model,
300+
size_t size_hint) NOEXCEPT
289301
{
290302
BC_ASSERT(stranded());
303+
const auto& post = get_post();
291304
constexpr auto json = media_type::application_json;
292-
response response{ status::ok, request.version() };
293-
add_common_headers(response, request);
305+
response response{ status::ok, post.version() };
306+
add_common_headers(response, post);
307+
add_access_control_headers(response, post);
294308
response.set(field::content_type, from_media_type(json));
295309
response.body() = { std::move(model), size_hint };
296310
response.prepare_payload();

src/protocols/protocol_html.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,7 @@ void protocol_html::send_json(boost::json::value&& model, size_t size_hint,
168168
BC_ASSERT(stranded());
169169
response response{ status::ok, request.version() };
170170
add_common_headers(response, request);
171+
add_access_control_headers(response, request);
171172
response.set(field::content_type, from_media_type(json));
172173
response.body() = { std::move(model), size_hint };
173174
response.prepare_payload();
@@ -180,6 +181,7 @@ void protocol_html::send_text(std::string&& hexidecimal,
180181
BC_ASSERT(stranded());
181182
response response{ status::ok, request.version() };
182183
add_common_headers(response, request);
184+
add_access_control_headers(response, request);
183185
response.set(field::content_type, from_media_type(text));
184186
response.body() = std::move(hexidecimal);
185187
response.prepare_payload();
@@ -192,6 +194,7 @@ void protocol_html::send_chunk(system::data_chunk&& bytes,
192194
BC_ASSERT(stranded());
193195
response response{ status::ok, request.version() };
194196
add_common_headers(response, request);
197+
add_access_control_headers(response, request);
195198
response.set(field::content_type, from_media_type(data));
196199
response.body() = std::move(bytes);
197200
response.prepare_payload();
@@ -205,6 +208,7 @@ void protocol_html::send_file(file&& file, media_type type,
205208
BC_ASSERT_MSG(file.is_open(), "sending closed file handle");
206209
response response{ status::ok, request.version() };
207210
add_common_headers(response, request);
211+
add_access_control_headers(response, request);
208212
response.set(field::content_type, from_media_type(type));
209213
response.body() = std::move(file);
210214
response.prepare_payload();
@@ -217,6 +221,7 @@ void protocol_html::send_span(span_body::value_type&& span,
217221
BC_ASSERT(stranded());
218222
response response{ status::ok, request.version() };
219223
add_common_headers(response, request);
224+
add_access_control_headers(response, request);
220225
response.set(field::content_type, from_media_type(type));
221226
response.body() = std::move(span);
222227
response.prepare_payload();
@@ -229,6 +234,7 @@ void protocol_html::send_buffer(buffer_body::value_type&& buffer,
229234
BC_ASSERT(stranded());
230235
response response{ status::ok, request.version() };
231236
add_common_headers(response, request);
237+
add_access_control_headers(response, request);
232238
response.set(field::content_type, from_media_type(type));
233239
response.body() = std::move(buffer);
234240
response.prepare_payload();

0 commit comments

Comments
 (0)