title: Python socket HTTP 1.1 CONNECT request without a valid response
body: <p>Well, I just want to make the following simple program that tries to create an https tunel with www.google.com at port 443. I first tried the following code:</p>
  
  <pre><code>import socket
  
  def main():
      s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
      s.connect(("www.google.com", 80))
      request = "CONNECT www.google.com:443 HTTP/1.1\n\n"
      s.send(request.encode())
      print(s.recv(4096).decode())
  
  main()
  </code></pre>
  
  <p>The result of that was the following:</p>
  
  <pre><code>HTTP/1.1 405 Method Not Allowed
  
  Content-Type: text/html; charset=UTF-8
  
  Referrer-Policy: no-referrer
  
  Content-Length: 1592
  
  Date: Wed, 16 Aug 2017 07:56:14 GMT
  
  Connection: close
  
  
  
  &lt;!DOCTYPE html&gt;
  &lt;html lang=en&gt;
    &lt;meta charset=utf-8&gt;
    &lt;meta name=viewport content="initial-scale=1, minimum-scale=1, width=device-width"&gt;
    &lt;title&gt;Error 405 (Method Not Allowed)!!1&lt;/title&gt;
    &lt;style&gt;
      *{margin:0;padding:0}html,code{font:15px/22px arial,sans-serif}html{background:#fff;color:#222;padding:15px}body{margin:7% auto 0;max-width:390px;min-height:180px;padding:30px 0 15px}* &gt; body{background:url(//www.google.com/images/errors/robot.png) 100% 5px no-repeat;padding-right:205px}p{margin:11px 0 22px;overflow:hidden}ins{color:#777;text-decoration:none}a img{border:0}@media screen and (max-width:772px){body{background:none;margin-top:0;max-width:none;padding-right:0}}#logo{background:url(//www.google.com/images/branding/googlelogo/1x/googlelogo_color_150x54dp.png) no-repeat;margin-left:-5px}@media only screen and (min-resolution:192dpi){#logo{background:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) no-repeat 0% 0%/100% 100%;-moz-border-image:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) 0}}@media only screen and (-webkit-min-device-pixel-ratio:2){#logo{background:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) no-repeat;-webkit-background-size:100% 100%}}#logo{display:inline-block;height:54px;width:150px}
    &lt;/style&gt;
    &lt;a href=//www.google.com/&gt;&lt;span id=logo aria-label=Google&gt;&lt;/span&gt;&lt;/a&gt;
    &lt;p&gt;&lt;b&gt;405.&lt;/b&gt; &lt;ins&gt;That’s an error.&lt;/ins&gt;
    &lt;p&gt;The request method &lt;code&gt;CONNECT&lt;/code&gt; is inappropriate for the URL &lt;code&gt;/&lt;/code&gt;.  &lt;ins&gt;That’s all we know.&lt;/ins&gt;
  </code></pre>
  
  <p>That means that the server does not allow this request to be executed. So I thought that the problem was the port number. So I changed it to 443(which is the port for https connection). The code is that:</p>
  
  <pre><code>def main():
      s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
      s.connect(("www.google.com", 443))
      request = "CONNECT www.google.com:443 HTTP/1.1\n\n"
      s.send(request.encode())
      print(s.recv(4096).decode())
  
  main()
  </code></pre>
  
  <p>But it does not print out a valid respnse as it should have done. It gives me an empty response.
  The question to that is: "Why is that happening? How can I make it work properly?"
  Note: I don't want to use built-in urllib or urllib2 libraries. I want to do that with sockets.</p>