Closure sent to main thread to request a reply to be sent to * a HTTP request. * Replies must be sent in the main loop in the main http thread, * this cannot be done from worker threads. */
| 642 | * this cannot be done from worker threads. |
| 643 | */ |
| 644 | void HTTPRequest::WriteReply(int nStatus, const std::string &strReply) |
| 645 | { |
| 646 | assert(!replySent && req); |
| 647 | // Send event to main http thread to send reply message |
| 648 | struct evbuffer *evb = evhttp_request_get_output_buffer(req); |
| 649 | assert(evb); |
| 650 | evbuffer_add(evb, strReply.data(), strReply.size()); |
| 651 | auto req_copy = req; |
| 652 | HTTPEvent *ev = new HTTPEvent(eventBase, true, |
| 653 | [req_copy, nStatus] |
| 654 | { |
| 655 | evhttp_send_reply(req_copy, nStatus, nullptr, nullptr); |
| 656 | // Re-enable reading from the socket. This is the second part of the libevent |
| 657 | // workaround above. |
| 658 | if (event_get_version_number() >= 0x02010600 && event_get_version_number() < 0x02020001) |
| 659 | { |
| 660 | evhttp_connection *conn = evhttp_request_get_connection(req_copy); |
| 661 | if (conn) |
| 662 | { |
| 663 | bufferevent *bev = evhttp_connection_get_bufferevent(conn); |
| 664 | if (bev) |
| 665 | { |
| 666 | bufferevent_enable(bev, EV_READ | EV_WRITE); |
| 667 | } |
| 668 | } |
| 669 | } |
| 670 | }); |
| 671 | ev->trigger(nullptr); |
| 672 | replySent = true; |
| 673 | req = nullptr; // transferred back to main thread |
| 674 | } |
| 675 | |
| 676 | CService HTTPRequest::GetPeer() |
| 677 | { |
no test coverage detected