21 zmq::null_mechanism_t::null_mechanism_t (session_base_t *session_,
24 mechanism_base_t (session_,
options_),
25 zap_client_t (session_, peer_address_,
options_),
26 _ready_command_sent (
false),
27 _error_command_sent (
false),
28 _ready_command_received (
false),
29 _error_command_received (
false),
30 _zap_request_sent (
false),
31 _zap_reply_received (
false)
35 zmq::null_mechanism_t::~null_mechanism_t ()
39 int zmq::null_mechanism_t::next_handshake_command (msg_t *msg_)
41 if (_ready_command_sent || _error_command_sent) {
46 if (zap_required () && !_zap_reply_received) {
47 if (_zap_request_sent) {
53 int rc = session->zap_connect ();
54 if (rc == -1 &&
options.zap_enforce_domain) {
55 session->get_socket ()->event_handshake_failed_no_detail (
56 session->get_endpoint (),
EFAULT);
61 _zap_request_sent =
true;
67 rc = receive_and_process_zap_reply ();
71 _zap_reply_received =
true;
75 if (_zap_reply_received && status_code !=
"200") {
76 _error_command_sent =
true;
77 if (status_code !=
"300") {
78 const size_t status_code_len = 3;
79 const int rc = msg_->init_size (
82 unsigned char *msg_data =
83 static_cast<unsigned char *
> (msg_->data ());
86 *msg_data = status_code_len;
88 memcpy (msg_data, status_code.c_str (), status_code_len);
98 _ready_command_sent =
true;
103 int zmq::null_mechanism_t::process_handshake_command (msg_t *msg_)
105 if (_ready_command_received || _error_command_received) {
106 session->get_socket ()->event_handshake_failed_protocol (
112 const unsigned char *cmd_data =
113 static_cast<unsigned char *
> (msg_->data ());
114 const size_t data_size = msg_->size ();
119 rc = process_ready_command (cmd_data, data_size);
122 rc = process_error_command (cmd_data, data_size);
124 session->get_socket ()->event_handshake_failed_protocol (
139 int zmq::null_mechanism_t::process_ready_command (
140 const unsigned char *cmd_data_,
size_t data_size_)
142 _ready_command_received =
true;
147 int zmq::null_mechanism_t::process_error_command (
148 const unsigned char *cmd_data_,
size_t data_size_)
150 const size_t fixed_prefix_size =
152 if (data_size_ < fixed_prefix_size) {
153 session->get_socket ()->event_handshake_failed_protocol (
154 session->get_endpoint (),
160 const size_t error_reason_len =
162 if (error_reason_len > data_size_ - fixed_prefix_size) {
163 session->get_socket ()->event_handshake_failed_protocol (
164 session->get_endpoint (),
170 const char *error_reason =
171 reinterpret_cast<const char *
> (cmd_data_) + fixed_prefix_size;
172 handle_error_reason (error_reason, error_reason_len);
173 _error_command_received =
true;
177 int zmq::null_mechanism_t::zap_msg_available ()
179 if (_zap_reply_received) {
183 const int rc = receive_and_process_zap_reply ();
185 _zap_reply_received =
true;
186 return rc == -1 ? -1 : 0;
191 if (_ready_command_sent && _ready_command_received)
194 const bool command_sent = _ready_command_sent || _error_command_sent;
195 const bool command_received =
196 _ready_command_received || _error_command_received;
197 return command_sent && command_received ?
error : handshaking;
200 void zmq::null_mechanism_t::send_zap_request ()
202 zap_client_t::send_zap_request (
"NULL", 4,
NULL,
NULL, 0);