0

I'm making a python proxy server for a school assignment and I've got the code below. When I run it in my command prompt and attempt to connect to google, the code doesn't make it past connecting the server socket, but the page still connects. I honestly have no idea why it doesn't even go through the connection step. Thoughts?

EDIT: And yeah there's been other homework posts about this but none of them seem to have addressed the fact the sys.exit() on line 8 ends the script (to my knowledge anyway) and whenever we comment it out, the script still does not get past connecting the server socket and hits the "illegal request" exception.

from socket import *
from urllib2 import HTTPError #Used for 404 Not Found error
import sys
import requests

if len(sys.argv) <= 1:
    print 'Usage : "python ProxyServer.py server_ip"\n[server_ip : It is the IP Address Of Proxy Server]'
    #sys.exit(2)

#POST request extension
print 'Fetching webpage using POST'
r = requests.post('http://httpbin.org/post', data = {'key':'value'})
print 'Printing webpage body'
print r.text

print 'Creating and binding socket for proxy server'
# Create a server socket, bind it to a port and start listening
tcpServerSock = socket(AF_INET, SOCK_STREAM)
# Fill in start.
tcpServerSock.bind(('',8888))
tcpServerSock.listen(10) #the number is the maximum number of connections     we want to have
# Fill in end.

while 1:
    # Start receiving data from the client
    print 'Ready to serve...'
    tcpClientSock, addr = tcpServerSock.accept()
    print 'Received a connection from:', addr
    # Fill in start. 
    message = tcpClientSock.recv(4096) #receive data with buffer size      4096
    # Fill in end.

    print 'Printing message'
    print message
    # Extract the filename from the given message
    print message.split()[1]
    filename = message.split()[1].partition("/")[2]
    print '\n'
    print 'Printing file name'
    print filename
    fileExist = "false"
    filetouse = "/" + filename
    print '\n'
    print 'Printing file to use'
    print filetouse
    print '\n'
    try:
        # Check whether the file exist in the cache
        f = open(filetouse[1:], "r")
        outputdata = f.readlines()
        fileExist = "true"
        # ProxyServer finds a cache hit and generates a response message
        tcpClientSock.send("HTTP/1.0 200 OK\r\n")
        tcpClientSock.send("Content-Type:text/html\r\n")
        # Fill in start.
        for x in range(0,len(outputdata)):
            tcpClientSock.send(outputdata[x])
        # Fill in end.

        print 'Read from cache\n'
    # Error handling for file not found in cache
    except IOError:
        if fileExist == "false":
            # Create a socket on the proxyserver
            # Fill in start. 
            print 'Creating server socket\n'
            c = socket(AF_INET, SOCK_STREAM)
            # Fill in end.

            hostn = filename
            #hostn = filename.replace("www.","",1)
            print 'Printing host to connect'
            print hostn
            print '\n'
            print 'Attempting to connect to hostn\n'
            try:
                # Connect to the socket to port 80
                # Fill in start.
                c.connect((hostn,80)) #port 80 is used for http web pages
                # Fill in end.

                # Create a temporary file on this socket and ask port 80
                # for the file requested by the client
                fileobj = c.makefile('r', 0)
                fileobj.write("GET "+"http://" + filename +    "HTTP/1.0\n\n")

                # Show what request was made
                print "GET "+"http://" + filename + " HTTP/1.0"

                # Read the response into buffer
                # Fill in start.
                buff = fileobj.readlines() #reads until EOF and returns a     list with the lines read
                # Fill in end.

                # Create a new file in the cache for the requested file.
                # Also send the response in the buffer to client socket
                # and the corresponding file in the cache
                tmpFile = open("./" + filename,"wb") #creates the temp      file for the requested file
                # Fill in start.
                for x in range(0, len(buff)):
                    tmpFile.write(buff[x]) #writes the buffer response    into the temp file (cache?)
                    tcpClientSock.send(buff[x]) #sends the response saved     in the buffer to the client
                # Fill in end.
                tmpFile.close()

            except:
                print "Illegal request\n"
        else:
            # HTTP response message for file not found
            # Fill in start.
            print 'File not found'
            # Fill in end.
    #404 not found error handling
    except HTTPError as e:
        print 'The server couldn\'t fulfill the request.'
        print 'Error code: ', e.code

    # Close the client and the server sockets
    tcpClientSock.close()
# Fill in start.
tcpServerSock.close()
# Fill in end
Jose M
  • 1
  • 2
  • Google is working on https, od your proxy working with https? – Dawid Dave Kosiński Apr 21 '17 at 18:51
  • Possible duplicate of [Homework - Python Proxy Server](http://stackoverflow.com/questions/11713933/homework-python-proxy-server) –  Apr 21 '17 at 19:51
  • @DawidDaveKosiński hmm not sure, I hadn't thought about it. Most https pages I've tried to open load even after the connection fails. – Jose M Apr 22 '17 at 19:46

1 Answers1

0

I'm aware this question is old, and Jose M's assignment is probably long past due.

if len(sys.argv) <= 1: checks for an additional argument that needs to be passed, which is the IP of the server. Commenting out the exit essentially removes the error checking.

A fix for the code above is to change line 20 from this tcpSerSock.bind(('', 8888)) to this tcpSerSock.bind((sys.argv[1], tcpSerPort))

You must then call the script correctly python ProxyServer.py 127.0.0.1.

Ryan Kozak
  • 1,091
  • 6
  • 16
  • 21