解决代码冗余问题

import socket
import re
import os
import sys
import mini_web_frame_3
"""

GET /a/b/c HTTP/1.1\r\n 请求行
Accept: text/html;iamge/jpeg....
Accept: text/html;iamge/jpeg....
\r\n
请求体


HTTP/1.1 200 OK\r\n
Server: fdfff
Content-type:cfdf\r\n
\r\n
响应体

"""




class HttpServer(object):
    def __init__(self):
        # 1、创建负责监听的socket
        self.socket_watch = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        # 2、设置地址重用
        self.socket_watch.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        # 3、绑定监听的端口
        self.socket_watch.bind(("localhost", 8888))
        # 4、转为被动
        self.socket_watch.listen(128)

    def handle_client(self,socket_con):
        """
        负责处理客户端的连接
        接收客户端发送的请求报文
        解析客户端发送的请求报文
        返回响应报文
        """
        request = socket_con.recv(4096).decode()
        # print(request)
        # 通过split函数,切割请求报文,获取请求行
        request_lines = request.split("\r\n")
        # print(request_lines)
        # 获取请求行
        requeset_line = request_lines[0]
        # print(requeset_line)
        # GET /a/b/c/d.html HTTP/1.1
        #/ a / b / c / d.html
        # favicon.ico
        res = re.match(r"\w+\s+(\S+)",requeset_line)
        path = res.group(1)
        # path ="/Users/zhaojianyu/Desktop/hm_day02/www" + path
        path = os.getcwd() + "/www" + path
        # print(path)
        # 如果访问的资源路径,服务器中不存在, return 404  # ......py
        #key: value
        if path.endswith(".py"): # WSGI
            response_line = "HTTP/1.1 200 OK\r\n"
            response_head = "Server: mini_web_frame v 1.0\r\n"
            response_head += "Content-type:text/html;charset= utf-8\r\n"

            # 1、浏览器发送了一个.p请求,服务器处理不了,将请求给web应用
            # 2、web应用根据请求,来选择性的调用响应的函数处理
            # 3、通过全路径获取文件名
            file_name = os.path.basename(path).split('.')[0] #login.py

            response_body = mini_web_frame_3.application(file_name)
            response = response_line + response_head + "\r\n" +response_body
            socket_con.send(response.encode())
            socket_con.close()
            return










        else:
            if not os.path.exists(path):
                response_line = "HTTP/1.1 404 Not Found\r\n"
                response_head = "Server:laozhao v3.0\r\n"
                response_body = "request directory or file is not exist\r\n"
                response = response_line + response_head + "\r\n" +response_body
                socket_con.send(response.encode())
                socket_con.close()
                return
            else:
                # 要么是文件,要么是文件夹
                # 判断用户请求的是文件
                if os.path.isfile(path):
                    # 读取指定路径下的文件,并返回(响应报文)
                    response_line = "HTTP/1.1 200 OK\r\n"
                    response_head = "Server: laozhao v3.0\r\n"
                    file = open(path,"rb")
                    response_body = file.read()
                    file.close()
                    response = response_line.encode() + response_head.encode() + "\r\n".encode() +response_body
                    socket_con.send(response)
                    socket_con.close()
                    return
                else:
                    #请求的文件夹资源,没有/
                    if not path.endswith("/"):
                        response_line = "HTTP/1.1 302 Found\r\n"
                        response_head = "Server: laozhao v3.0\r\n"
                        response_head += "Content-Type:text/html;charset=utf-8\r\n"
                        response_body = "重定向到"+path +"/"
                        response = response_line+ response_head +"\r\n" +response_body
                        socket_con.send(response.encode())
                        socket_con.close()
                        return
                    else:
                        # 请求的资源路径有斜线
                        # 1、我允许你访问我的默认文件
                        defualt_document = False
                        # 如果为True,则读取对应的默认文件
                        if defualt_document:
                            if os.path.exists(path+"index.html"):
                                file = open(path+"index.html","rb")
                                response_body =file.read()
                                file.close()
                                response_line = "HTTP/1.1 200 OK\r\n"
                                response_head = "Server: laozhao v3.0\r\n"
                                response = response_line.encode() + response_head.encode() +"\r\n".encode()+response_body
                                socket_con.send(response)
                                socket_con.close()
                                return
                            elif os.path.exists(path + "default.html"):
                                file = open(path + "default.html", "rb")
                                response_body = file.read()
                                file.close()
                                response_line = "HTTP/1.1 200 OK\r\n"
                                response_head = "Server: laozhao v3.0\r\n"
                                response = response_line.encode() + response_head.encode() + "\r\n".encode() + response_body
                                socket_con.send(response)
                                socket_con.close()
                                return
                            else:
                                response_line = "HTTP/1.1 404 Not Found\r\n"
                                response_head = "Server: laozhao v3.0\r\n"
                                response_body = "Not Found"
                                response = response_line + response_head +"\r\n" +response_body
                                socket_con.send(response.encode())
                                socket_con.close()
                                return
                        else:
                            # 判断是否开启了目录浏览
                            document_browsing = True
                            if document_browsing :
                                # 1、获取访问资源文件夹下所有的文件和文件夹(当前目录下)
                                list_names = os.listdir(path)
                                # 2、拼接HTML页面,返回给浏览器客户端
                                response_body = "<html><head><body><ul>"
                                for item in list_names:
                                    response_body += "<li><a href='#'>" + item +"</a></li>"
                                response_body += "</ul></body></head></html>"
                                response_line ="HTTP/1.1 200 OK\r\n"
                                response_head = "Server: laozhao v3.0\r\n"
                                response = response_line +response_head +"\r\n" +response_body
                                socket_con.send(response.encode())
                                socket_con.close()
                                return








                        # index.html default.html
                    # 2、如果不允许你访问我的默认文件,判断是否开启了目录浏览
                    # 3、如果开启了目录浏览,则拼接文件夹的列表,进行返回
                    # 4、如果没有开启目录浏览,404  提示............

        # print(path)
        # /Users/zhaojianyu/Desktop/hm_day02/www/favicon.ico
        # /Users/zhaojianyu/Desktop/hm_day02/www/a/b/c/d.html
        # 拼接响应报文
        """
            响应行
            响应头
            空行
            响应体
        """
        """
            www.baidu.com
            www.baidu.com/
            www.baidu.com/index.html
            www.baidu.com/a
            www.baidu.com/a/b
            结论:从路径是否有扩展名判断是文件或者是文件夹是不成立的。
            服务器处理:
                如果用户请求的是文件夹,
                首先判断文件夹的结尾是否有 /(服务器认为,只有文件夹后加上/,才是访问文件夹的标准格式)
                重定向到 带/的路径下
            文件夹有/
                1、如果说文件夹中有默认的文件,则给你返回默认的文件 index.html defalut.html
                2、是否开启了目录浏览
        """


        response_line = "HTTP/1.1 200 OK\r\n"
        response_head = "Server:laozhao v1.0\r\n"
        response_head += "Content-Type: text/html;charset=utf-8\r\n"
        # 返回固定页面的web服务器
        path = "/Users/zhaojianyu/Desktop/hm_day02/www/index.html"
        file = open(path,"r")
        response_body = file.read()
        file.close()
        response = response_line + response_head + "\r\n" + response_body
        # send给客户端浏览器
        socket_con.send(response.encode())
        socket_con.close()

    def run_server(self):
        while True:
            # 返回与客户端通信的socket和客户端的地址
            socket_con, con_addr = self.socket_watch.accept()
            print("客户端%s连接成功!!!!" % str(con_addr))
            # handle_client
            self.handle_client(socket_con)
def main():
    # 1、创建HttpServer对象
    # port = int(sys.argv[1])
    http_server = HttpServer()
    # 2、调用run_server方法
    http_server.run_server()


if __name__ == '__main__':
    main()

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值