Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Send text "http" over python socket

I am trying to create a HTTP server using python. The thing is I am getting everything to work except for sending a response message; if the message has a text http, the send() doesn't work.

Here is the snippet of the code:

connectionSocket.send('HTTP/1.1 200 OK text/html')

Here are the others I tried:

connectionSocket.send(''.join('%s 200 OK text/html' % ('HTTP/1.1')))
connectionSocket.send('%s 200 OK text/html' % ('HTTP/1.1'))
msg = 'HTTP/1.1 200 OK text/html'
for i in range(0, len(msg))
    connectionSocket.send(msg[i])

The only thing that seems to work is entity-fying the any of the character in HTTP, like

connectionSocket.send('HTTP/1.1 200 OK text/html')

Where H is equivalent to H. Otherwise the browser doesn't display the header received from the python server socket.

The problem also goes when I am trying to send a 404 Message down the socket. The other contents are displayed, however, like a html file sent through the socket.

I want to know is there a proper way to do it? Because, if the client is not a browser, the html entity will not be understood.

Thanks in advance

Update:

Code:

from socket import *
serverSocket = socket(AF_INET, SOCK_STREAM)

serverSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
serverSocket.bind(('127.0.0.1', 1240))
serverSocket.listen(1);

while True:
  print 'Ready to serve...'
  connectionSocket, addr = serverSocket.accept()
  try:
    message = connectionSocket.recv(1024)
    filename = message.split()[1]
    f = open(filename[1:])
    outputdata = f.read()

    #Send one HTTP header line into socket
    connectionSocket.send('HTTP/1.1 200 OK text/html') ## this is not working

    #Send the content of the requested file to the client
    for i in range(0, len(outputdata)):
        connectionSocket.send(outputdata[i])
    connectionSocket.close()

  except IOError:
    connectionSocket.send('HTTP/1.1 404 File not found') ## this is not working
    connectionSocket.close();

serverSocket.close()

Screenshots:

Text as 'HTTP/1.1 ...'

enter image description here

enter image description here

Text as 'HTTP/1.1 ...'

enter image description here

enter image description here

HTML Code of hello.html

<html>
  <head>
    <title>Test Python</title>
  </head>
  <body>
    <h1>Hello World!</h1>
  </body>
</html>
like image 739
Gopikrishna S Avatar asked Feb 27 '14 23:02

Gopikrishna S


1 Answers

You are not returning a correctly formed HTTP response. Your line

connectionSocket.send('HTTP/1.1 200 OK text/html') ## this is not working

is not even terminated by a newline, then immediately followed by the content of your file. Protocols like HTTP specify fairly rigorously what must be sent, and I find it little short of miraculous that you saw anything at all in your browser.

Try something like:

connectionSocket.send('HTTP/1.1 200 OK\nContent-Type: text/html\n\n')

This is the start of a correctly-formed HTTP 1.1 response with a primary response line and a single header. The double newline terminates the headers, preparing the client to read the content that follows.

http://www.jmarshall.com/easy/http/ is one of many approachable ways to learn a bit more about the protocol you have chosen to use. Good luck!

like image 127
holdenweb Avatar answered Sep 18 '22 17:09

holdenweb