Advertisement
Guest User

jd-https-proxy.patch

a guest
Apr 15th, 2017
730
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 4.23 KB | None | 0 0
  1. From 7b6e8bc4f09f2f3a9eb927cf490f1ca0c2b9c5f6 Mon Sep 17 00:00:00 2001
  2. From: jd-street <jd-street@not.available>
  3. Date: Sat, 15 Apr 2017 20:12:24 +0900
  4. Subject: [PATCH 3/4] fix error in creating https connection via proxy
  5.  
  6. send 'CONNECT' request first, to set up a https tunnel via proxy.
  7.  
  8. Signed-off-by: jd-street <jd-street@not.available>
  9. ---
  10. src/jdlib/loader.cpp | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++
  11.  src/jdlib/loader.h   |  1 +
  12.  2 files changed, 86 insertions(+)
  13.  
  14. diff --git a/src/jdlib/loader.cpp b/src/jdlib/loader.cpp
  15. index 2146c57..7ad1154 100644
  16. --- a/src/jdlib/loader.cpp
  17. +++ b/src/jdlib/loader.cpp
  18. @@ -558,6 +558,87 @@ void* Loader::launcher( void* dat )
  19.  }
  20.  
  21.  
  22. +const bool Loader::send_connect( const int soc, std::string& errmsg )
  23. +{
  24. +    std::string authority;
  25. +    std::string msg_send;
  26. +
  27. +    authority = m_data.host + ":" + std::to_string( m_data.port );
  28. +    msg_send = "CONNECT " + authority + " HTTP/1.1\r\nHost: " + authority + "\r\n\r\n";
  29. +    size_t send_size = strlen( msg_send.data() );
  30. +    while( send_size > 0 && !m_stop ){
  31. +        if( ! wait_recv_send( soc, false ) ){
  32. +            m_data.code = HTTP_TIMEOUT;
  33. +            errmsg = "send timeout";
  34. +            return false;
  35. +        }
  36. +
  37. +#ifdef _WIN32
  38. +        ssize_t tmpsize = send( soc, msg_send.data(), send_size,0);
  39. +        int lastError = WSAGetLastError();
  40. +#else
  41. +#ifdef MSG_NOSIGNAL
  42. +        ssize_t tmpsize = send( soc, msg_send.data(), send_size, MSG_NOSIGNAL );
  43. +#else
  44. +        // SolarisにはMSG_NOSIGNALが無いのでSIGPIPEをIGNOREする (FreeBSD4.11Rにもなかった)
  45. +        signal( SIGPIPE , SIG_IGN ); /* シグナルを無視する */
  46. +        ssize_t tmpsize = send( soc, msg_send.data(), send_size,0);
  47. +        signal(SIGPIPE,SIG_DFL); /* 念のため戻す */
  48. +#endif // MSG_NOSIGNAL
  49. +#endif // _WIN32
  50. +
  51. +#ifdef _WIN32
  52. +        if( tmpsize == 0
  53. +            || ( tmpsize < 0 && !( lastError == WSAEWOULDBLOCK || errno == WSAEINTR ) ) ){
  54. +#else
  55. +        if( tmpsize == 0
  56. +            || ( tmpsize < 0 && !( errno == EWOULDBLOCK || errno == EINTR ) ) ){
  57. +#endif
  58. +
  59. +            m_data.code = HTTP_ERR;
  60. +            errmsg = "send failed : " + m_data.url;
  61. +            return false;
  62. +        }
  63. +
  64. +        if( tmpsize > 0 ) send_size -= tmpsize;
  65. +    }
  66. +
  67. +    char rbuf[256];
  68. +    size_t read_size = 0;
  69. +    while( read_size < sizeof(rbuf) && !m_stop ){
  70. +
  71. +        ssize_t tmpsize;
  72. +
  73. +        if( !wait_recv_send( soc, true ) ){
  74. +            m_data.code = HTTP_TIMEOUT;
  75. +            errmsg = "CONNECT: read timeout in";
  76. +            return false;
  77. +        }
  78. +
  79. +        tmpsize = recv( soc, rbuf + read_size, sizeof(rbuf) - read_size, 0 );
  80. +        if( tmpsize < 0 && errno != EINTR ){
  81. +            m_data.code = HTTP_ERR;
  82. +            errmsg = "CONNECT: recv() failed";
  83. +            return false;
  84. +        }
  85. +
  86. +        if( tmpsize == 0 ) break;
  87. +        if( tmpsize > 0 ){
  88. +            read_size += tmpsize;
  89. +
  90. +            const int ret = receive_header( rbuf, read_size );
  91. +            if( ret == HTTP_ERR ){
  92. +
  93. +                m_data.code = HTTP_ERR;
  94. +                errmsg = "CONNECT: invalid header : " + m_data.url;
  95. +                return false;
  96. +            }
  97. +            else if( ret == HTTP_OK ) return true;
  98. +        }
  99. +    }
  100. +    return false;
  101. +}
  102. +
  103.  //
  104.  // 実際の処理部
  105.  //
  106. @@ -683,6 +764,10 @@ void Loader::run_main()
  107.      // ssl 初期化とコネクト
  108.      if( m_data.use_ssl ){
  109.  
  110. +        if ( use_proxy ) {
  111. +            if ( ! send_connect( soc, errmsg ) )
  112. +                goto EXIT_LOADING;
  113. +        }
  114.          ssl = new JDLIB::JDSSL();
  115.          if( ! ssl->connect( soc ) ){
  116.              m_data.code = HTTP_ERR;
  117. diff --git a/src/jdlib/loader.h b/src/jdlib/loader.h
  118. index 3bc91d6..d1c5fe5 100644
  119. --- a/src/jdlib/loader.h
  120. +++ b/src/jdlib/loader.h
  121. @@ -104,6 +104,7 @@ namespace JDLIB
  122.          struct addrinfo* get_addrinfo( const std::string& hostname, const int port );
  123.          const std::string create_msg_send();
  124.          const bool wait_recv_send( const int fd, const bool recv );
  125. +        const bool send_connect( const int soc, std::string& errmsg );
  126.  
  127.          // ローディング終了処理
  128.          void finish_loading();
  129. --
  130. 2.12.2
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement