Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- From 7b6e8bc4f09f2f3a9eb927cf490f1ca0c2b9c5f6 Mon Sep 17 00:00:00 2001
- From: jd-street <jd-street@not.available>
- Date: Sat, 15 Apr 2017 20:12:24 +0900
- Subject: [PATCH 3/4] fix error in creating https connection via proxy
- send 'CONNECT' request first, to set up a https tunnel via proxy.
- Signed-off-by: jd-street <jd-street@not.available>
- ---
- src/jdlib/loader.cpp | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++
- src/jdlib/loader.h | 1 +
- 2 files changed, 86 insertions(+)
- diff --git a/src/jdlib/loader.cpp b/src/jdlib/loader.cpp
- index 2146c57..7ad1154 100644
- --- a/src/jdlib/loader.cpp
- +++ b/src/jdlib/loader.cpp
- @@ -558,6 +558,87 @@ void* Loader::launcher( void* dat )
- }
- +const bool Loader::send_connect( const int soc, std::string& errmsg )
- +{
- + std::string authority;
- + std::string msg_send;
- +
- + authority = m_data.host + ":" + std::to_string( m_data.port );
- + msg_send = "CONNECT " + authority + " HTTP/1.1\r\nHost: " + authority + "\r\n\r\n";
- + size_t send_size = strlen( msg_send.data() );
- + while( send_size > 0 && !m_stop ){
- + if( ! wait_recv_send( soc, false ) ){
- + m_data.code = HTTP_TIMEOUT;
- + errmsg = "send timeout";
- + return false;
- + }
- +
- +#ifdef _WIN32
- + ssize_t tmpsize = send( soc, msg_send.data(), send_size,0);
- + int lastError = WSAGetLastError();
- +#else
- +#ifdef MSG_NOSIGNAL
- + ssize_t tmpsize = send( soc, msg_send.data(), send_size, MSG_NOSIGNAL );
- +#else
- + // SolarisにはMSG_NOSIGNALが無いのでSIGPIPEをIGNOREする (FreeBSD4.11Rにもなかった)
- + signal( SIGPIPE , SIG_IGN ); /* シグナルを無視する */
- + ssize_t tmpsize = send( soc, msg_send.data(), send_size,0);
- + signal(SIGPIPE,SIG_DFL); /* 念のため戻す */
- +#endif // MSG_NOSIGNAL
- +#endif // _WIN32
- +
- +#ifdef _WIN32
- + if( tmpsize == 0
- + || ( tmpsize < 0 && !( lastError == WSAEWOULDBLOCK || errno == WSAEINTR ) ) ){
- +#else
- + if( tmpsize == 0
- + || ( tmpsize < 0 && !( errno == EWOULDBLOCK || errno == EINTR ) ) ){
- +#endif
- +
- + m_data.code = HTTP_ERR;
- + errmsg = "send failed : " + m_data.url;
- + return false;
- + }
- +
- + if( tmpsize > 0 ) send_size -= tmpsize;
- + }
- +
- + char rbuf[256];
- + size_t read_size = 0;
- + while( read_size < sizeof(rbuf) && !m_stop ){
- +
- + ssize_t tmpsize;
- +
- + if( !wait_recv_send( soc, true ) ){
- + m_data.code = HTTP_TIMEOUT;
- + errmsg = "CONNECT: read timeout in";
- + return false;
- + }
- +
- + tmpsize = recv( soc, rbuf + read_size, sizeof(rbuf) - read_size, 0 );
- + if( tmpsize < 0 && errno != EINTR ){
- + m_data.code = HTTP_ERR;
- + errmsg = "CONNECT: recv() failed";
- + return false;
- + }
- +
- + if( tmpsize == 0 ) break;
- + if( tmpsize > 0 ){
- + read_size += tmpsize;
- +
- + const int ret = receive_header( rbuf, read_size );
- + if( ret == HTTP_ERR ){
- +
- + m_data.code = HTTP_ERR;
- + errmsg = "CONNECT: invalid header : " + m_data.url;
- + return false;
- + }
- + else if( ret == HTTP_OK ) return true;
- + }
- + }
- + return false;
- +}
- +
- //
- // 実際の処理部
- //
- @@ -683,6 +764,10 @@ void Loader::run_main()
- // ssl 初期化とコネクト
- if( m_data.use_ssl ){
- + if ( use_proxy ) {
- + if ( ! send_connect( soc, errmsg ) )
- + goto EXIT_LOADING;
- + }
- ssl = new JDLIB::JDSSL();
- if( ! ssl->connect( soc ) ){
- m_data.code = HTTP_ERR;
- diff --git a/src/jdlib/loader.h b/src/jdlib/loader.h
- index 3bc91d6..d1c5fe5 100644
- --- a/src/jdlib/loader.h
- +++ b/src/jdlib/loader.h
- @@ -104,6 +104,7 @@ namespace JDLIB
- struct addrinfo* get_addrinfo( const std::string& hostname, const int port );
- const std::string create_msg_send();
- const bool wait_recv_send( const int fd, const bool recv );
- + const bool send_connect( const int soc, std::string& errmsg );
- // ローディング終了処理
- void finish_loading();
- --
- 2.12.2
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement