def send_ok_response(sock, full_path, ext):
    # htmlが文字化けしたので、charsetを追加した
    modoki02_util_2_6.write_line(sock, "HTTP/1.1 200 OK")
    modoki02_util_2_6.write_line(sock, email.utils.formatdate(usegmt=True))
    modoki02_util_2_6.write_line(sock, "Server: Modoki/0.2")
    modoki02_util_2_6.write_line(sock, "Connection: close")

    content_type = "Content-Type: {}".format(modoki02_util_2_6.get_content_type(ext))
    modoki02_util_2_6.write_line(sock, content_type)
    modoki02_util_2_6.write_line(sock, "")

    if "text" in content_type:
        with open(full_path, encoding="utf-8") as f:
            r = f.read()
            modoki02_util_2_6.write_line(sock, r)
    
    elif "image" in content_type:
        with open(full_path, mode="rb") as f:
            r = f.read()
            sock.send(r)
def send_directory_traversal_response(sock, error_document_root):
    modoki02_util_2_6.write_line(sock, "HTTP/1.1 404 Not Found")
    modoki02_util_2_6.write_line(sock, "Date: {}".format(email.utils.formatdate(usegmt=True)))
    modoki02_util_2_6.write_line(sock, "Server: Modoki/0.2")
    modoki02_util_2_6.write_line(sock, "Connection: close")
    modoki02_util_2_6.write_line(sock, "Content-type: text/html")
    modoki02_util_2_6.write_line(sock, "")

    error_full_path = os.path.join(error_document_root, "404_dir_traversal.html")
    with open(error_full_path, encoding="utf-8") as f:
        r = f.read()
        modoki02_util_2_6.write_line(sock, r)
def send_move_permanently_response(sock, location):
    # Chromeの場合、301ではキャッシュすることもあるので注意
    # http://d.hatena.ne.jp/too_young/20110303/1299149420
    modoki02_util_2_6.write_line(sock, "HTTP/1.1 301 Moved Permanently")
    modoki02_util_2_6.write_line(sock, "Date: {}".format(email.utils.formatdate(usegmt=True)))
    modoki02_util_2_6.write_line(sock, "Server: Modoki/0.2")
    modoki02_util_2_6.write_line(sock, "Location: {}".format(location))
    modoki02_util_2_6.write_line(sock, "Connection: close")
    modoki02_util_2_6.write_line(sock, "")