2 * @file sslproxysession.cpp
\r
3 * @brief module of SSLproxy_session
\r
4 * @brief SSL handshaking and Connecting.
\r
5 * @brief Client and Server data read/write.
\r
7 * Copyright (C) 2008 NTT COMWARE Corporation.
\r
9 * This program is free software; you can redistribute it and/or
\r
10 * modify it under the terms of the GNU Lesser General Public
\r
11 * License as published by the Free Software Foundation; either
\r
12 * version 2.1 of the License, or (at your option) any later version.
\r
14 * This program is distributed in the hope that it will be useful,
\r
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
\r
17 * Lesser General Public License for more details.
\r
19 * You should have received a copy of the GNU Lesser General Public
\r
20 * License along with this library; if not, write to the Free Software
\r
21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
\r
24 **********************************************************************
\r
26 * Distributed under the Boost Software Licence, Version 1.0
\r
27 * http://www.boost.org/LICENSE_1_0.txt
\r
29 **********************************************************************/
\r
31 #include <sys/syscall.h> // for SYS_gettid
\r
32 #include <boost/lexical_cast.hpp>
\r
34 #include "sslproxyserver.h"
\r
35 #include "sslproxysession.h"
\r
37 // sslproxy_session constructor
\r
39 * SSLproxy_session constructor.
\r
41 * @param[in] io_service IO event dispatcher
\r
42 * @param[in] context SSL context
\r
43 * @param[in] itr endpoint iterator
\r
45 sslproxy_session::sslproxy_session(boost::asio::io_service& ioservice,
\r
46 boost::asio::ssl::context& context,
\r
47 boost::asio::ip::tcp::resolver::iterator itr)
\r
49 server_socket(ioservice),
\r
50 client_socket(ioservice, context),
\r
51 endpoint_iterator(itr),
\r
53 cancel_time(timeout_sec),
\r
60 /*-------- DEBUG LOG --------*/
\r
61 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_SSLPROXY_SESSION)) {
\r
62 LOGGER_PUT_LOG_DEBUG(LOG_CAT_SSLPROXY_SESSION, 1,
\r
63 "in/out_function : Constructor sslproxy_session::sslproxy_session("
\r
64 "boost::asio::io_service& ioservice, "
\r
65 "boost::asio::ssl::context& context, "
\r
66 "boost::asio::ip::tcp::resolver::iterator itr)");
\r
68 /*------ DEBUG LOG END ------*/
\r
69 pthread_mutex_init(&client_socket_mutex, NULL);
\r
73 * SSLproxy_session destructor.
\r
75 sslproxy_session::~sslproxy_session()
\r
77 /*-------- DEBUG LOG --------*/
\r
78 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_SSLPROXY_SESSION)) {
\r
79 LOGGER_PUT_LOG_DEBUG(LOG_CAT_SSLPROXY_SESSION, 2,
\r
80 "in/out_function : Destructor sslproxy_session::~sslproxy_session("
\r
83 /*------ DEBUG LOG END ------*/
\r
87 * Low level socket getting function.
\r
89 * @return password string
\r
90 * @retval ssl_socket::lowest_layer_type&
\r
92 ssl_socket::lowest_layer_type& sslproxy_session::low_socket()
\r
94 /*-------- DEBUG LOG --------*/
\r
95 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_SSLPROXY_SESSION)) {
\r
96 LOGGER_PUT_LOG_DEBUG(LOG_CAT_SSLPROXY_SESSION, 3,
\r
97 "in_function : ssl_socket::lowest_layer_type& sslproxy_session::low_socket("
\r
100 /*------ DEBUG LOG END ------*/
\r
103 ssl_socket::lowest_layer_type& sock = client_socket.lowest_layer();
\r
104 /*-------- DEBUG LOG --------*/
\r
105 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_SSLPROXY_SESSION)) {
\r
106 LOGGER_PUT_LOG_DEBUG(LOG_CAT_SSLPROXY_SESSION, 4,
\r
107 "function : ssl_socket::lowest_layer_type& sslproxy_session::low_socket() : "
\r
108 "lowest_layer() END.");
\r
110 /*------ DEBUG LOG END ------*/
\r
112 /*-------- DEBUG LOG --------*/
\r
113 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_SSLPROXY_SESSION)) {
\r
114 LOGGER_PUT_LOG_DEBUG(LOG_CAT_SSLPROXY_SESSION, 5,
\r
115 "out_function : ssl_socket::lowest_layer_type& sslproxy_session::low_socket("
\r
118 /*------ DEBUG LOG END ------*/
\r
120 } catch (std::exception& e) {
\r
121 LOGGER_PUT_LOG_ERROR(LOG_CAT_SSLPROXY_SESSION, 1,
\r
122 "Get low level socket error : %s.", e.what());
\r
128 * Get remote endpoint string.
\r
129 * get client address:port from SSL socket
\r
131 * @param[in] socket client SSL socket
\r
132 * @return endpoint string
\r
134 std::string sslproxy_session::get_remote_endpoint(ssl_socket& socket)
\r
136 /*-------- DEBUG LOG --------*/
\r
137 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_SSLPROXY_SESSION)) {
\r
138 LOGGER_PUT_LOG_DEBUG(LOG_CAT_SSLPROXY_SESSION, 6,
\r
139 "in_function : std::string sslproxy_session::get_remote_endpoint("
\r
140 "ssl_socket& socket)");
\r
142 /*------ DEBUG LOG END ------*/
\r
144 std::string endpoint_str = "";
\r
145 boost::asio::ip::tcp::endpoint endpoint;
\r
146 std::string address;
\r
151 endpoint = socket.lowest_layer().remote_endpoint();
\r
152 /*-------- DEBUG LOG --------*/
\r
153 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_SSLPROXY_SESSION)) {
\r
154 LOGGER_PUT_LOG_DEBUG(LOG_CAT_SSLPROXY_SESSION, 7,
\r
155 "function : std::string sslproxy_session::get_remote_endpoint() : "
\r
156 "lowest_layer().remote_endpoint() END.");
\r
158 /*------ DEBUG LOG END ------*/
\r
159 } catch (std::exception& e) {
\r
160 LOGGER_PUT_LOG_ERROR(LOG_CAT_SSLPROXY_SESSION, 2,
\r
161 "Get remote endpoint from socket error : %s.", e.what());
\r
166 address = endpoint.address().to_string();
\r
167 /*-------- DEBUG LOG --------*/
\r
168 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_SSLPROXY_SESSION)) {
\r
169 LOGGER_PUT_LOG_DEBUG(LOG_CAT_SSLPROXY_SESSION, 8,
\r
170 "function : std::string sslproxy_session::get_remote_endpoint() : "
\r
171 "address().to_string() END.");
\r
173 /*------ DEBUG LOG END ------*/
\r
174 } catch (std::exception& e) {
\r
175 LOGGER_PUT_LOG_ERROR(LOG_CAT_SSLPROXY_SESSION, 3,
\r
176 "Get address string error : %s.", e.what());
\r
181 port = boost::lexical_cast<std::string>(endpoint.port());
\r
182 /*-------- DEBUG LOG --------*/
\r
183 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_SSLPROXY_SESSION)) {
\r
184 LOGGER_PUT_LOG_DEBUG(LOG_CAT_SSLPROXY_SESSION, 9,
\r
185 "function : std::string sslproxy_session::get_remote_endpoint() : "
\r
186 "lexical_cast(port()) END.");
\r
188 /*------ DEBUG LOG END ------*/
\r
189 } catch (std::exception& e) {
\r
190 LOGGER_PUT_LOG_ERROR(LOG_CAT_SSLPROXY_SESSION, 4,
\r
191 "Get port string error : %s.", e.what());
\r
195 endpoint_str = address + ":" + port;
\r
196 /*-------- DEBUG LOG --------*/
\r
197 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_SSLPROXY_SESSION)) {
\r
198 LOGGER_PUT_LOG_DEBUG(LOG_CAT_SSLPROXY_SESSION, 10,
\r
199 "function : std::string sslproxy_session::get_remote_endpoint() : "
\r
200 "Get remote endpoint string END.");
\r
202 /*------ DEBUG LOG END ------*/
\r
205 /*-------- DEBUG LOG --------*/
\r
206 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_SSLPROXY_SESSION)) {
\r
207 LOGGER_PUT_LOG_DEBUG(LOG_CAT_SSLPROXY_SESSION, 11,
\r
208 "function : std::string sslproxy_session::get_remote_endpoint() : "
\r
209 "get_remote_endpoint() error.");
\r
211 /*------ DEBUG LOG END ------*/
\r
214 /*-------- DEBUG LOG --------*/
\r
215 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_SSLPROXY_SESSION)) {
\r
216 LOGGER_PUT_LOG_DEBUG(LOG_CAT_SSLPROXY_SESSION, 12,
\r
217 "out_function : std::string sslproxy_session::get_remote_endpoint("
\r
218 "ssl_socket& socket) : "
\r
219 "return value = %s",
\r
220 endpoint_str.c_str());
\r
222 /*------ DEBUG LOG END ------*/
\r
223 return endpoint_str;
\r
227 * Session start function.
\r
228 * Start async handshake and Set handshake timer
\r
230 void sslproxy_session::start()
\r
232 /*-------- DEBUG LOG --------*/
\r
233 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_SSLPROXY_SESSION)) {
\r
234 LOGGER_PUT_LOG_DEBUG(LOG_CAT_SSLPROXY_SESSION, 13,
\r
235 "in_function : void sslproxy_session::start(void)");
\r
237 /*------ DEBUG LOG END ------*/
\r
239 // Output connection log. (info level)
\r
240 if (conn_log_flag == "on") {
\r
241 LOGGER_PUT_LOG_INFO(LOG_CAT_SSLPROXY_CONNECTION, 1,
\r
242 "Connect from [%s] to [%s]. %s",
\r
243 get_remote_endpoint(client_socket).c_str(),
\r
244 target_endpoint.c_str(), target_id.c_str());
\r
248 // Start async handshake and Set handshake handler.
\r
249 client_socket.async_handshake(boost::asio::ssl::stream_base::server,
\r
250 boost::bind(&sslproxy_session::handle_handshake,
\r
252 boost::asio::placeholders::error));
\r
253 /*-------- DEBUG LOG --------*/
\r
254 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_SSLPROXY_SESSION)) {
\r
255 LOGGER_PUT_LOG_DEBUG(LOG_CAT_SSLPROXY_SESSION, 14,
\r
256 "function : void sslproxy_session::start() : "
\r
257 "async_handshake() registration END.");
\r
259 /*------ DEBUG LOG END ------*/
\r
261 // Set handshake expire time.
\r
263 timer.expires_from_now(boost::posix_time::seconds(cancel_time));
\r
264 /*-------- DEBUG LOG --------*/
\r
265 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_SSLPROXY_SESSION)) {
\r
266 LOGGER_PUT_LOG_DEBUG(LOG_CAT_SSLPROXY_SESSION, 15,
\r
267 "function : void sslproxy_session::start() : "
\r
268 "expires_from_now() END. "
\r
269 "cancel_time = %d",
\r
272 /*------ DEBUG LOG END ------*/
\r
273 } catch (std::exception& e) {
\r
274 LOGGER_PUT_LOG_ERROR(LOG_CAT_SSLPROXY_SESSION, 5,
\r
275 "Set handshake expire time error : %s.", e.what());
\r
279 // Start timer waiting and Set timer handler.
\r
280 timer.async_wait(boost::bind(&sslproxy_session::cancel,
\r
282 boost::asio::placeholders::error));
\r
283 /*-------- DEBUG LOG --------*/
\r
284 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_SSLPROXY_SESSION)) {
\r
285 LOGGER_PUT_LOG_DEBUG(LOG_CAT_SSLPROXY_SESSION, 16,
\r
286 "function : void sslproxy_session::start() : "
\r
287 "async_wait() END.");
\r
289 /*------ DEBUG LOG END ------*/
\r
291 LOGGER_PUT_LOG_ERROR(LOG_CAT_SSLPROXY_SESSION, 6,
\r
292 "Exception occured in sslproxy_session::start().");
\r
293 destroy_session(this);
\r
296 /*-------- DEBUG LOG --------*/
\r
297 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_SSLPROXY_SESSION)) {
\r
298 LOGGER_PUT_LOG_DEBUG(LOG_CAT_SSLPROXY_SESSION, 17,
\r
299 "outfunction : void sslproxy_session::start(void)");
\r
301 /*------ DEBUG LOG END ------*/
\r
305 * Handshake timeout handler function.
\r
307 * @param[in] error error code
\r
309 void sslproxy_session::cancel(const boost::system::error_code& error)
\r
311 // Check session is not already delete.
\r
312 if(sessionTable.end() != sessionTable.find((long)this)) {
\r
313 // Check timout and finishing status.
\r
314 if (istimeout || finishing) {
\r
315 destroy_session(this);
\r
317 /*-------- DEBUG LOG --------*/
\r
318 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_SSLPROXY_SESSION)) {
\r
319 LOGGER_PUT_LOG_DEBUG(LOG_CAT_SSLPROXY_SESSION, 18,
\r
320 "in_function : void sslproxy_session::cancel("
\r
321 "const boost::system::error_code& error) : "
\r
322 "error = %d, handshaked = %d",
\r
323 error.value(), handshaked);
\r
325 /*------ DEBUG LOG END ------*/
\r
328 // Check session is not already delete.
\r
329 if(sessionTable.end() != sessionTable.find((long)this)) {
\r
330 // Check handshaked.
\r
332 // When handshake not finished then timer is timeout.
\r
333 LOGGER_PUT_LOG_ERROR(LOG_CAT_SSLPROXY_SESSION, 7,
\r
334 "Handshake timer wait : %d giveup.", cancel_time);
\r
336 client_socket.lowest_layer().cancel();
\r
338 // When handshake finished then timer is diable.
\r
339 /*-------- DEBUG LOG --------*/
\r
340 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_SSLPROXY_SESSION)) {
\r
341 LOGGER_PUT_LOG_DEBUG(LOG_CAT_SSLPROXY_SESSION, 19,
\r
342 "function : void sslproxy_session::cancel() : "
\r
343 "Handshake timer is cancel.");
\r
345 /*------ DEBUG LOG END ------*/
\r
349 if (error.value() == ECANCELED) {
\r
350 LOGGER_PUT_LOG_INFO(LOG_CAT_SSLPROXY_SESSION, 1,
\r
351 "Handshake timer operation cancel. Normal END : %s.",
\r
352 error.message().c_str());
\r
354 LOGGER_PUT_LOG_ERROR(LOG_CAT_SSLPROXY_SESSION, 8,
\r
355 "Handshake timer wait NG : %s.",
\r
356 error.message().c_str());
\r
360 /*-------- DEBUG LOG --------*/
\r
361 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_SSLPROXY_SESSION)) {
\r
362 LOGGER_PUT_LOG_DEBUG(LOG_CAT_SSLPROXY_SESSION, 20,
\r
363 "out_function : void sslproxy_session::cancel("
\r
364 "const boost::system::error_code& error)");
\r
366 /*------ DEBUG LOG END ------*/
\r
372 * Destroy session function.
\r
374 * @param[in] session session object
\r
376 void sslproxy_session::destroy_session(sslproxy_session* session)
\r
378 /*-------- DEBUG LOG --------*/
\r
379 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_SSLPROXY_SESSION)) {
\r
380 LOGGER_PUT_LOG_DEBUG(LOG_CAT_SSLPROXY_SESSION, 21,
\r
381 "in_function : void sslproxy_session::destroy_session("
\r
382 "sslproxy_session* session)");
\r
384 /*------ DEBUG LOG END ------*/
\r
386 // Check session is not already delete.
\r
387 if(sessionTable.end() != sessionTable.find((long)session)) {
\r
389 if (u_event_count + d_event_count == 0) {
\r
391 pthread_mutex_lock(&sessionTable_mutex);
\r
392 sessionTable.erase((long)session);
\r
393 pthread_mutex_unlock(&sessionTable_mutex);
\r
394 pthread_mutex_lock(&client_socket_mutex);
\r
399 client_socket.lowest_layer().cancel();
\r
406 * Hnadshake handling function.
\r
407 * Check hendshake result and Start async connect.
\r
409 * @param[in] error error code
\r
411 void sslproxy_session::handle_handshake(const boost::system::error_code& error)
\r
413 // Check timout and finishing status.
\r
414 if (istimeout || finishing) {
\r
415 destroy_session(this);
\r
417 /*-------- DEBUG LOG --------*/
\r
418 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_SSLPROXY_SESSION)) {
\r
419 LOGGER_PUT_LOG_DEBUG(LOG_CAT_SSLPROXY_SESSION, 22,
\r
420 "in_function : void sslproxy_session::handle_handshake("
\r
421 "const boost::system::error_code& error) : "
\r
422 "error = %d, istimeout = %d",
\r
423 error.value(), istimeout);
\r
425 /*------ DEBUG LOG END ------*/
\r
428 // Check handshake result.
\r
430 // Connect to server after handshake
\r
431 boost::asio::ip::tcp::resolver::iterator end;
\r
432 if (endpoint_iterator != end) {
\r
433 // Start async connect
\r
434 server_socket.async_connect(*endpoint_iterator++,
\r
435 boost::bind(&sslproxy_session::handle_connect,
\r
437 boost::asio::placeholders::error));
\r
438 /*-------- DEBUG LOG --------*/
\r
439 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_SSLPROXY_SESSION)) {
\r
440 LOGGER_PUT_LOG_DEBUG(LOG_CAT_SSLPROXY_SESSION, 23,
\r
441 "function : void sslproxy_session::handle_handshake() : "
\r
442 "async_connect() registration END.");
\r
444 /*------ DEBUG LOG END ------*/
\r
446 LOGGER_PUT_LOG_ERROR(LOG_CAT_SSLPROXY_SESSION, 9,
\r
447 "Server endpoint is nothing for connect.");
\r
448 destroy_session(this);
\r
451 LOGGER_PUT_LOG_ERROR(LOG_CAT_SSLPROXY_SESSION, 10,
\r
452 "Handshaking NG : %s.",
\r
453 error.message().c_str());
\r
454 destroy_session(this);
\r
458 LOGGER_PUT_LOG_ERROR(LOG_CAT_SSLPROXY_SESSION, 11,
\r
459 "Exception occured in sslproxy_session::handle_handshake().");
\r
460 destroy_session(this);
\r
463 /*-------- DEBUG LOG --------*/
\r
464 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_SSLPROXY_SESSION)) {
\r
465 LOGGER_PUT_LOG_DEBUG(LOG_CAT_SSLPROXY_SESSION, 24,
\r
466 "out_function : void sslproxy_session::handle_handshake("
\r
467 "const boost::system::error_code& error)");
\r
469 /*------ DEBUG LOG END ------*/
\r
474 * Connect handling function.
\r
475 * Check connect result and Start async read client.
\r
477 * @param[in] error error code
\r
479 void sslproxy_session::handle_connect(const boost::system::error_code& error)
\r
481 // Check timout and finishing status.
\r
482 if (istimeout || finishing) {
\r
483 destroy_session(this);
\r
485 /*-------- DEBUG LOG --------*/
\r
486 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_SSLPROXY_SESSION)) {
\r
487 LOGGER_PUT_LOG_DEBUG(LOG_CAT_SSLPROXY_SESSION, 25,
\r
488 "in_function : void sslproxy_session::handle_connect("
\r
489 "const boost::system::error_code& error) : "
\r
490 "error = %d, istimeout = %d",
\r
491 error.value(), istimeout);
\r
493 /*------ DEBUG LOG END ------*/
\r
496 // Check connect result.
\r
500 // Start async read client.
\r
502 client_socket.async_read_some(boost::asio::buffer(client_buffer, MAX_BUFFER_SIZE),
\r
503 boost::bind(&sslproxy_session::handle_client_read,
\r
505 boost::asio::placeholders::error,
\r
506 boost::asio::placeholders::bytes_transferred));
\r
507 /*-------- DEBUG LOG --------*/
\r
508 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_SSLPROXY_SESSION)) {
\r
509 LOGGER_PUT_LOG_DEBUG(LOG_CAT_SSLPROXY_SESSION, 26,
\r
510 "function : void sslproxy_session::handle_connect() : "
\r
511 "Client async_read_some() registration END.");
\r
513 /*------ DEBUG LOG END ------*/
\r
515 // Start async read server.
\r
517 server_socket.async_read_some(boost::asio::buffer(server_buffer, MAX_BUFFER_SIZE),
\r
518 boost::bind(&sslproxy_session::handle_server_read,
\r
520 boost::asio::placeholders::error,
\r
521 boost::asio::placeholders::bytes_transferred));
\r
522 /*-------- DEBUG LOG --------*/
\r
523 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_SSLPROXY_SESSION)) {
\r
524 LOGGER_PUT_LOG_DEBUG(LOG_CAT_SSLPROXY_SESSION, 27,
\r
525 "function : void sslproxy_session::handle_server_write() : "
\r
526 "Client read completed. "
\r
527 "Server async_read_some() registration END.");
\r
529 /*------ DEBUG LOG END ------*/
\r
531 boost::asio::ip::tcp::resolver::iterator end;
\r
532 if (endpoint_iterator != end) {
\r
533 // Retry connect to server
\r
534 LOGGER_PUT_LOG_WARN(LOG_CAT_SSLPROXY_SESSION, 1,
\r
535 "Connecting NG : %s. Retry connect.",
\r
536 error.message().c_str());
\r
537 server_socket.async_connect(*endpoint_iterator++,
\r
538 boost::bind(&sslproxy_session::handle_connect,
\r
540 boost::asio::placeholders::error));
\r
541 /*-------- DEBUG LOG --------*/
\r
542 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_SSLPROXY_SESSION)) {
\r
543 LOGGER_PUT_LOG_DEBUG(LOG_CAT_SSLPROXY_SESSION, 28,
\r
544 "function : void sslproxy_session::handle_connect() : "
\r
545 "async_connect() retry registration END.");
\r
547 /*------ DEBUG LOG END ------*/
\r
549 LOGGER_PUT_LOG_ERROR(LOG_CAT_SSLPROXY_SESSION, 12,
\r
550 "Connecting NG : %s.",
\r
551 error.message().c_str());
\r
552 destroy_session(this);
\r
556 LOGGER_PUT_LOG_ERROR(LOG_CAT_SSLPROXY_SESSION, 13,
\r
557 "Exception occured in void sslproxy_session::handle_connect().");
\r
558 destroy_session(this);
\r
561 /*-------- DEBUG LOG --------*/
\r
562 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_SSLPROXY_SESSION)) {
\r
563 LOGGER_PUT_LOG_DEBUG(LOG_CAT_SSLPROXY_SESSION, 29,
\r
564 "out_function : void sslproxy_session::handle_connect("
\r
565 "const boost::system::error_code& error)");
\r
567 /*------ DEBUG LOG END ------*/
\r
572 * Client read handling function.
\r
573 * Check client read result and Start async write server.
\r
575 * @param[in] error error code
\r
576 * @param[in] bytes_transferred transferred data size
\r
578 void sslproxy_session::handle_client_read(const boost::system::error_code& error,
\r
579 size_t bytes_transferred)
\r
582 // Check timout and finishing status.
\r
583 if (istimeout || finishing) {
\r
584 destroy_session(this);
\r
586 /*-------- DEBUG LOG --------*/
\r
587 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_SSLPROXY_SESSION)) {
\r
588 LOGGER_PUT_LOG_DEBUG(LOG_CAT_SSLPROXY_SESSION, 30,
\r
589 "in_function : void sslproxy_session::handle_client_read("
\r
590 "const boost::system::error_code& error, "
\r
591 "size_t bytes_transferred) : "
\r
592 "error = %d, bytes_transferred = %d, istimeout = %d",
\r
593 error.value(), (int)bytes_transferred, istimeout);
\r
595 /*------ DEBUG LOG END ------*/
\r
598 // Check client read result.
\r
600 // Start async write server.
\r
602 boost::asio::async_write(server_socket,
\r
603 boost::asio::buffer(client_buffer, bytes_transferred),
\r
604 boost::bind(&sslproxy_session::handle_server_write,
\r
606 boost::asio::placeholders::error,
\r
607 bytes_transferred));
\r
608 /*-------- DEBUG LOG --------*/
\r
609 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_SSLPROXY_SESSION)) {
\r
610 LOGGER_PUT_LOG_DEBUG(LOG_CAT_SSLPROXY_SESSION, 31,
\r
611 "function : void sslproxy_session::handle_client_read() : "
\r
612 "Server async_write() registration END.");
\r
614 /*------ DEBUG LOG END ------*/
\r
616 if (error.value() == boost::asio::error::eof) {
\r
617 // When End of file. Client data read complete.
\r
618 LOGGER_PUT_LOG_INFO(LOG_CAT_SSLPROXY_SESSION, 2,
\r
619 "Client data read complete. Normal END : %s.",
\r
620 error.message().c_str());
\r
621 } else if (error.value() == boost::asio::error::shut_down) {
\r
622 LOGGER_PUT_LOG_INFO(LOG_CAT_SSLPROXY_SESSION, 3,
\r
623 "Client already shutdown. Normal END : %s.",
\r
624 error.message().c_str());
\r
625 } else if (error.value() == boost::asio::error::operation_aborted) {
\r
626 LOGGER_PUT_LOG_INFO(LOG_CAT_SSLPROXY_SESSION, 4,
\r
627 "Client read operation canceled. Normal END : %s.",
\r
628 error.message().c_str());
\r
630 LOGGER_PUT_LOG_ERROR(LOG_CAT_SSLPROXY_SESSION, 14,
\r
631 "Client read NG : %s.",
\r
632 error.message().c_str());
\r
634 destroy_session(this);
\r
638 LOGGER_PUT_LOG_ERROR(LOG_CAT_SSLPROXY_SESSION, 15,
\r
639 "Exception occured in void sslproxy_session::handle_client_read().");
\r
640 destroy_session(this);
\r
643 /*-------- DEBUG LOG --------*/
\r
644 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_SSLPROXY_SESSION)) {
\r
645 LOGGER_PUT_LOG_DEBUG(LOG_CAT_SSLPROXY_SESSION, 32,
\r
646 "out_function : void sslproxy_session::handle_client_read("
\r
647 "const boost::system::error_code& error, "
\r
648 "size_t bytes_transferred)");
\r
650 /*------ DEBUG LOG END ------*/
\r
655 * Server write handling function.
\r
656 * Check server write result and Start async read server.
\r
658 * @param[in] error error code
\r
659 * @param[in] bytes_transferred transferred data size
\r
661 void sslproxy_session::handle_server_write(const boost::system::error_code& error,
\r
662 size_t bytes_transferred)
\r
665 // Check timout and finishing status.
\r
666 if (istimeout || finishing) {
\r
667 destroy_session(this);
\r
669 /*-------- DEBUG LOG --------*/
\r
670 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_SSLPROXY_SESSION)) {
\r
671 LOGGER_PUT_LOG_DEBUG(LOG_CAT_SSLPROXY_SESSION, 33,
\r
672 "in_function : void sslproxy_session::handle_server_write("
\r
673 "const boost::system::error_code& error, "
\r
674 "size_t bytes_transferred) : "
\r
675 "error = %d, bytes_transferred = %d, istimeout = %d",
\r
676 error.value(), (int)bytes_transferred, istimeout);
\r
678 /*------ DEBUG LOG END ------*/
\r
681 // Check server write result.
\r
683 // Next client data wait, start async read client again.
\r
685 client_socket.async_read_some(boost::asio::buffer(client_buffer, MAX_BUFFER_SIZE),
\r
686 boost::bind(&sslproxy_session::handle_client_read,
\r
688 boost::asio::placeholders::error,
\r
689 boost::asio::placeholders::bytes_transferred));
\r
690 /*-------- DEBUG LOG --------*/
\r
691 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_SSLPROXY_SESSION)) {
\r
692 LOGGER_PUT_LOG_DEBUG(LOG_CAT_SSLPROXY_SESSION, 34,
\r
693 "function : void sslproxy_session::handle_server_write() : "
\r
694 "Client async_read_some() registration again END.");
\r
696 /*------ DEBUG LOG END ------*/
\r
698 LOGGER_PUT_LOG_ERROR(LOG_CAT_SSLPROXY_SESSION, 16,
\r
699 "Server write NG : %s.",
\r
700 error.message().c_str());
\r
701 destroy_session(this);
\r
705 LOGGER_PUT_LOG_ERROR(LOG_CAT_SSLPROXY_SESSION, 17,
\r
706 "Exception occured in void sslproxy_session::handle_server_write().");
\r
707 destroy_session(this);
\r
710 /*-------- DEBUG LOG --------*/
\r
711 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_SSLPROXY_SESSION)) {
\r
712 LOGGER_PUT_LOG_DEBUG(LOG_CAT_SSLPROXY_SESSION, 35,
\r
713 "out_function : void sslproxy_session::handle_server_write("
\r
714 "const boost::system::error_code& error, "
\r
715 "size_t bytes_transferred)");
\r
717 /*------ DEBUG LOG END ------*/
\r
722 * Server read handling function.
\r
723 * Check server read result and Start async write client.
\r
725 * @param[in] error error code
\r
726 * @param[in] bytes_transferred transferred data size
\r
728 void sslproxy_session::handle_server_read(const boost::system::error_code& error,
\r
729 size_t bytes_transferred)
\r
732 // Check timout and finishing status.
\r
733 if (istimeout || finishing) {
\r
734 destroy_session(this);
\r
736 /*-------- DEBUG LOG --------*/
\r
737 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_SSLPROXY_SESSION)) {
\r
738 LOGGER_PUT_LOG_DEBUG(LOG_CAT_SSLPROXY_SESSION, 36,
\r
739 "in_function : void sslproxy_session::handle_server_read("
\r
740 "const boost::system::error_code& error, "
\r
741 "size_t bytes_transferred) : "
\r
742 "error = %d, bytes_transferred = %d, istimeout = %d",
\r
743 error.value(), (int)bytes_transferred, istimeout);
\r
745 /*------ DEBUG LOG END ------*/
\r
748 // Check server read result.
\r
750 // Start async write client.
\r
752 pthread_mutex_lock(&client_socket_mutex);
\r
753 boost::asio::async_write(client_socket,
\r
754 boost::asio::buffer(server_buffer, bytes_transferred),
\r
755 boost::bind(&sslproxy_session::handle_client_write,
\r
757 boost::asio::placeholders::error,
\r
758 bytes_transferred));
\r
759 pthread_mutex_unlock(&client_socket_mutex);
\r
760 /*-------- DEBUG LOG --------*/
\r
761 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_SSLPROXY_SESSION)) {
\r
762 LOGGER_PUT_LOG_DEBUG(LOG_CAT_SSLPROXY_SESSION, 37,
\r
763 "function : void sslproxy_session::handle_server_read() : "
\r
764 "Client async_write() registration END.");
\r
766 /*------ DEBUG LOG END ------*/
\r
768 if (error.value() == boost::asio::error::eof) {
\r
769 // When End of file. Server data read complete.
\r
770 LOGGER_PUT_LOG_INFO(LOG_CAT_SSLPROXY_SESSION, 5,
\r
771 "Server data read complete. Normal END : %s.",
\r
772 error.message().c_str());
\r
774 LOGGER_PUT_LOG_ERROR(LOG_CAT_SSLPROXY_SESSION, 18,
\r
775 "Server read NG : %s.",
\r
776 error.message().c_str());
\r
778 destroy_session(this);
\r
782 LOGGER_PUT_LOG_ERROR(LOG_CAT_SSLPROXY_SESSION, 19,
\r
783 "Exception occured in void sslproxy_session::handle_server_read().");
\r
784 destroy_session(this);
\r
787 /*-------- DEBUG LOG --------*/
\r
788 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_SSLPROXY_SESSION)) {
\r
789 LOGGER_PUT_LOG_DEBUG(LOG_CAT_SSLPROXY_SESSION, 38,
\r
790 "out_function : void sslproxy_session::handle_server_read("
\r
791 "const boost::system::error_code& error, "
\r
792 "size_t bytes_transferred)");
\r
794 /*------ DEBUG LOG END ------*/
\r
799 * Client write handling function.
\r
800 * Check client write result and Start async read client.
\r
802 * @param[in] error error code
\r
803 * @param[in] bytes_transferred transferred data size
\r
805 void sslproxy_session::handle_client_write(const boost::system::error_code& error,
\r
806 size_t bytes_transferred)
\r
809 // Check timout and finishing status.
\r
810 if (istimeout || finishing) {
\r
811 destroy_session(this);
\r
813 /*-------- DEBUG LOG --------*/
\r
814 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_SSLPROXY_SESSION)) {
\r
815 LOGGER_PUT_LOG_DEBUG(LOG_CAT_SSLPROXY_SESSION, 39,
\r
816 "in_function : void sslproxy_session::handle_client_write("
\r
817 "const boost::system::error_code& error, "
\r
818 "size_t bytes_transferred) : "
\r
819 "error = %d, bytes_transferred = %d, istimeout = %d",
\r
820 error.value(), (int)bytes_transferred, istimeout);
\r
822 /*------ DEBUG LOG END ------*/
\r
825 // Check client write result.
\r
827 // Next server data wait, start async read server again.
\r
829 server_socket.async_read_some(boost::asio::buffer(server_buffer, MAX_BUFFER_SIZE),
\r
830 boost::bind(&sslproxy_session::handle_server_read,
\r
832 boost::asio::placeholders::error,
\r
833 boost::asio::placeholders::bytes_transferred));
\r
834 /*-------- DEBUG LOG --------*/
\r
835 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_SSLPROXY_SESSION)) {
\r
836 LOGGER_PUT_LOG_DEBUG(LOG_CAT_SSLPROXY_SESSION, 40,
\r
837 "function : void sslproxy_session::handle_client_write() : "
\r
838 "Server async_read_some() registration again END.");
\r
840 /*------ DEBUG LOG END ------*/
\r
842 if (error.value() == boost::asio::error::connection_reset) {
\r
843 LOGGER_PUT_LOG_INFO(LOG_CAT_SSLPROXY_SESSION, 6,
\r
844 "Reset connection. Normal END : %s.",
\r
845 error.message().c_str());
\r
846 } else if (error.value() == boost::asio::error::broken_pipe) {
\r
847 LOGGER_PUT_LOG_INFO(LOG_CAT_SSLPROXY_SESSION, 7,
\r
848 "Pipe broken. Normal END : %s.",
\r
849 error.message().c_str());
\r
851 LOGGER_PUT_LOG_ERROR(LOG_CAT_SSLPROXY_SESSION, 20,
\r
852 "Client write NG : %s.",
\r
853 error.message().c_str());
\r
855 destroy_session(this);
\r
859 LOGGER_PUT_LOG_ERROR(LOG_CAT_SSLPROXY_SESSION, 21,
\r
860 "Exception occured in void sslproxy_session::handle_client_write().");
\r
861 destroy_session(this);
\r
864 /*-------- DEBUG LOG --------*/
\r
865 if (LOG_LV_DEBUG == logger_get_log_level(LOG_CAT_SSLPROXY_SESSION)) {
\r
866 LOGGER_PUT_LOG_DEBUG(LOG_CAT_SSLPROXY_SESSION, 41,
\r
867 "out_function : void sslproxy_session::handle_client_write("
\r
868 "const boost::system::error_code& error, "
\r
869 "size_t bytes_transferred)");
\r
871 /*------ DEBUG LOG END ------*/
\r