mirror of
https://github.com/UofCBaja/BajaCloud.git
synced 2025-06-15 05:04:17 -06:00
109 lines
3.9 KiB
Python
109 lines
3.9 KiB
Python
from GetSchedulePackager import getSchedulePackager
|
|
from postSelectAppointment import SelectAppointment
|
|
import json
|
|
import signal
|
|
import sys
|
|
from http.server import BaseHTTPRequestHandler, HTTPServer
|
|
|
|
# Define request handler
|
|
class RequestHandler(BaseHTTPRequestHandler):
|
|
|
|
def do_GET(self):
|
|
"""Handle GET requests and route based on path"""
|
|
if self.path == '/getAppointments':
|
|
self._send_response(getSchedulePackager())
|
|
elif self.path == '/interview_data':
|
|
self._send_response(doNothing()) # If you want to return an empty response
|
|
else:
|
|
self._send_error(404, "Not Found")
|
|
|
|
def do_POST(self):
|
|
"""Handle POST requests to '/selectAppointment' or '/'"""
|
|
content_length = int(self.headers['Content-Length'])
|
|
post_data = self.rfile.read(content_length)
|
|
|
|
# Try to parse JSON data from the request body
|
|
try:
|
|
json_data = json.loads(post_data.decode('utf-8'))
|
|
except json.JSONDecodeError:
|
|
self._send_error(400, "Invalid Request")
|
|
return
|
|
|
|
if self.path == '/selectAppointment':
|
|
self._send_response(SelectAppointment(json_data)) # Use SelectAppointment directly
|
|
elif self.path == '/':
|
|
self._send_response(doNothing()) # Empty response for the root route
|
|
else:
|
|
self._send_error(404, "Not Found")
|
|
|
|
def _send_response(self, res):
|
|
"""Send the response body with the given status code"""
|
|
if isinstance(res, dict):
|
|
# Ensure res has all the required keys
|
|
body = res.get("body", "") # Default to empty string if no body is provided
|
|
baseEncoded = res.get("isBase64ENcoded", "false") # Default to "false" if not provided
|
|
status_code = res.get("statusCode", 200) # Default to 200 if no statusCode is provided
|
|
|
|
# Convert body to string if it's not already
|
|
if isinstance(body, dict):
|
|
body = json.dumps(body)
|
|
|
|
# If body is base64 encoded, we would handle that differently, but currently we treat all as 'false'
|
|
|
|
response = {
|
|
"statusCode": status_code,
|
|
"isBase64Encoded": baseEncoded,
|
|
"headers": {
|
|
"Content-Type": "application/json", # Specify content type
|
|
"X-IsBase64Encoded": baseEncoded # Indicating if the body is base64 encoded
|
|
},
|
|
"body": body
|
|
}
|
|
|
|
# Send the status code and headers
|
|
self.send_response(status_code)
|
|
self.send_header("Content-Type", "application/json")
|
|
self.end_headers()
|
|
|
|
# Write the JSON response body, ensuring it's encoded to utf-8
|
|
self.wfile.write(json.dumps(response).encode('utf-8'))
|
|
|
|
def _send_error(self, status_code=404, message="Not Found"):
|
|
"""Send error response with the same structure as normal responses"""
|
|
res = {
|
|
"statusCode": status_code,
|
|
"body": json.dumps({"message": message})
|
|
}
|
|
# Return the error response in the same format
|
|
self._send_response(res)
|
|
|
|
def doNothing():
|
|
"""Return an empty JSON response"""
|
|
return {
|
|
"statusCode": 200,
|
|
"isBase64ENcoded": "false",
|
|
"body": json.dumps({"message": ""})
|
|
}
|
|
|
|
|
|
# Graceful shutdown handler
|
|
def signal_handler(sig, frame):
|
|
print("\nShutting down server gracefully...")
|
|
sys.exit(0)
|
|
|
|
# Set up and start the server
|
|
if __name__ == "__main__":
|
|
# Register signal handler for graceful shutdown (e.g., Ctrl+C)
|
|
signal.signal(signal.SIGINT, signal_handler)
|
|
|
|
# Set the server address (localhost) and port (8080)
|
|
server_address = ('', 8080)
|
|
httpd = HTTPServer(server_address, RequestHandler)
|
|
|
|
print("Server started on port 8080")
|
|
try:
|
|
# Start the server and listen for requests
|
|
httpd.serve_forever()
|
|
except KeyboardInterrupt:
|
|
pass
|