1

I am building a basic python web server, but I keep having a problem where it is not sending any data (by the way I am accessing the website on the same computer as it is running on and I have the file which the server is trying to access) here is my code:

import socket
HOST, PORT = '', 80
def between(left,right,s):
 before,_,a = s.partition(left)
 a,_,after = a.partition(right)
 return a
filereq = ""
listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
listen_socket.bind((HOST, PORT))
lines = []
print("Started!")
listen_socket.listen(1)
print("Listening")
while True:
 try:
 lines = []
 client_connection, client_address = listen_socket.accept()
 print("Connected")
 request = client_connection.recv(1024)
 print("Received Data!")
 filereq = between("GET /", " HT", request)
 print(filereq)
 filereq = open(filereq)
 for line in filereq:
 lines.append(line)
 print(lines)
 sendata = ''.join(lines)
 print(sendata)
 http_response = """\
 HTTP/1.1 200 OK 
 {}
 """.format(sendata)
 print(http_response)
 client_connection.sendall(http_response)
 print("Sent the Data!")
 client_connection.close()
 print("Connection Closed!")
 except:
 5+5
snakecharmerb
57.2k13 gold badges137 silver badges201 bronze badges
asked Oct 1, 2017 at 19:58

1 Answer 1

1

The problem is that the server is implemented in Python3 but the code mixes bytes and strings, which works in Python2 but not Python3.

This causes an error in the between function, because partition is being called on a bytes object but is being provided with str separator values.

>>> data = b'abc'
>>> data.partition('b')
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
TypeError: a bytes-like object is required, not 'str'

To fix this, decode the data from bytes to str when read from the socket, then encode back to bytes before sending the response (socket.sendall expects bytes as an argument).

Also, print out any exceptions that occur so that you can debug them.

import socket
import sys
import traceback
HOST, PORT = '', 80
def between(left,right,s):
 before,_,a = s.partition(left)
 a,_,after = a.partition(right)
 return a
filereq = ""
listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
listen_socket.bind((HOST, PORT))
lines = []
print("Started!")
listen_socket.listen(1)
print("Listening")
while True:
 try:
 lines = []
 client_connection, client_address = listen_socket.accept()
 print("Connected")
 request = client_connection.recv(1024)
 print("Received Data!")
 # Decode the data before processing.
 decoded = request.decode('utf-8')
 filereq = between("GET /", " HT", decoded)
 print(filereq)
 filereq = open(filereq)
 for line in filereq:
 lines.append(line)
 print(lines)
 sendata = ''.join(lines)
 print(sendata)
 http_response = """\
 HTTP/1.1 200 OK 
 {}
 """.format(sendata)
 print(http_response)
 # Encode the response before sending.
 encoded = http_response.encode('utf-8')
 client_connection.sendall(encoded)
 print("Sent the Data!")
 client_connection.close()
 print("Connection Closed!")
 except Exception:
 # Print the traceback if there's an error.
 traceback.print_exc(file=sys.stderr)
answered Oct 5, 2017 at 6:21
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.