Skip to content

Instantly share code, notes, and snippets.

@H0neyBadger
Last active December 19, 2021 18:37
Show Gist options
  • Save H0neyBadger/8d1ab88fe1655818fa4fe10e436ee5ea to your computer and use it in GitHub Desktop.
Save H0neyBadger/8d1ab88fe1655818fa4fe10e436ee5ea to your computer and use it in GitHub Desktop.
ps4 ps4_remote_pkg_installer gateway
from time import sleep
from shutil import copyfileobj
import socket
from http import server, client, cookiejar
import urllib.request
from urllib.parse import urlparse
LISTEN_PORT = 8090
TARGET = "http://gs2.ww.prod.dl.playstation.net"
class PS4Handler(server.SimpleHTTPRequestHandler):
protocol_version = "HTTP/1.1"
server_version = "CloudStorage"
sys_version = ""
def do_GET(self):
print("-------------------------------- START --------------------------------")
host = urlparse(TARGET).hostname
new_url = f"{TARGET}{self.path}"
new_headers = {}
for key, value in self.headers.items():
print(f"Request Header[{key}:{value}]")
if key.lower() == "host":
# rewrite Host header
new_headers[key] = host
continue
# forward source header
new_headers[key] = value
print(self.__dict__)
cookie = cookiejar.CookieJar()
cookie_processor = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(cookie_processor)
print("-------------------------------- REQUEST --------------------------------")
print(new_url, new_headers)
request = urllib.request.Request(new_url, headers=new_headers)
while True:
try:
response = opener.open(request)
break
except urllib.error.HTTPError as err:
print(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>", err, "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<")
sleep(0.5)
print("-------------------------------- RESPONSE --------------------------------")
self.send_response(response.status)
length = None
for key, value in response.headers.items():
print(f"Response Header[{key}:{value}]")
if key == "Date":
continue
if key == "Server":
continue
if key == "Content-Length":
length = int(value)
continue
self.send_header(key.strip(), value.strip())
print(response.__dict__, response)
if response.headers["Content-Type"] == "application/json":
data = response.read()
server, port = self.wfile._sock.getsockname()
data = data.replace(
TARGET.encode("utf-8"),
f"http://{server}:{port}".encode("utf-8")
)
self.send_header("Content-Length", len(data))
self.end_headers()
self.wfile.write(data)
print("-------------------------------- END --------------------------------")
return
if length is not None:
self.send_header("Content-Length", length)
self.end_headers()
try:
copyfileobj(response, self.wfile, 10*1024)
except Exception as err:
print(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>", err, "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<")
response.close()
print("after", dir(self.wfile), self.wfile.__dict__)
print("-------------------------------- END --------------------------------")
addr = ('', LISTEN_PORT)
http = server.ThreadingHTTPServer(addr, PS4Handler)
http.serve_forever()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment