diff --git a/README.md b/README.md index c6f205b..c3eb0cb 100644 --- a/README.md +++ b/README.md @@ -1,88 +1,9 @@ -# PyWebServer +# Amethyst Web Server -## GitHub -The upstream of this project is on my own [Gitea instance](https://git.novacow.ch/Nova/PyWebServer/). -Because of that I'll mostly reply to issues and PRs there, you can submit issues and PRs on GitHub, but it might take longer before I read it. +## A word of warning! +Currently Amethyst is in very early alpha stage, a lot of things will be broken, names won't be correct, +promised features missing, but I'm very much working on it live! +Every save I do increments the build number by 1, I won't publish all of them, but most of them will be published. +Once a milestone is hit (e.g. a new feature fully implemented), I'll publish a release! -## Installing -### The little tiny easier route -Installing and running PyWebServer is very simple. -First off, download the latest release from the 'Releases' tab, choose the Zip variant if unsure. -When it's done downloading, unpack the files in a directory of choice, for the purpose of this README, -I've chosen `./pywebserver/` (for Windows: `.\pywebserver\`). -From there, open up your favorite text editor and open the file `pywebsrv.conf` in the directory you unpacked PyWebServer. -In there, you should see this somewhere: -``` -# Here you choose what directory PyWebServer looks in for files. -directory: -``` -After the colon, enter your directory where you have your website stored. -After that, make sure you have installed Python. Here's how you can install Python: -Linux: -```bash -sudo apt install python3 # Debian / Ubuntu -sudo dnf install python3 # Fedora / Nobara -sudo pacman -S python3 # Arch and derivatives. -``` -macOS: -```bash -brew install python3 -``` -Windows: -```powershell -# You can change the `3.12` with whatever version you want/need. -winget install -e --id Python.Python.3.12 --scope machine -``` -Then, in the terminal window you have open, go to the directory you unpacked PyWebServer and type this: -``` -python3 ./pywebsrv.py -# For Windows users, if the above command doesn't work, try this: -py ./pywebsrv.py -``` -And there you go! You've now set up PyWebServer! - -### The little tiny harder route -Installing and running PyWebServer is very simple. -Assuming you're running Linux: -```bash -git clone https://git.novacow.ch/Nova/PyWebServer.git -cd ./PyWebServer/ -``` -Windows users, make sure you have installed Git, from there: -```powershell -git clone https://git.novacow.ch/Nova/PyWebServer.git -Set-Location .\PyWebServer\ -``` -Then, open `pywebsrv.conf` in your favorite text editor and change the `directory` key to the full path where your files are stored. -After that, put your files in and run this: -Linux: -```bash -python3 /path/to/pywebsrv.py -``` -Windows: -```powershell -# If you have installed Python via the Microsoft Store: -python3 \path\to\pywebsrv.py -# Via the python.org website: -py \path\to\pywebsrv.py -``` - -## SSL Support -PyWebServer supports SSL/TLS for authentication via HTTPS. In the config file, you should enable the HTTPS port. After that you need to create the certificate. -Currently PyWebServer looks for the `cert.pem` and the `key.pem` files in the root directory of the installation. - -## HTTP support -Currently PyWebServer only supports HTTP/1.1, this is very unlikely to change, as most of the modern web today still uses HTTP/1.1. -For methods PyWebServer only supports `GET`, this is being reworked though, check issue [#3](https://git.novacow.ch/Nova/PyWebServer/issues/3) for progress. - -## Files support -Unlike other small web servers, PyWebServer has full support for binary files being sent and received (once that logic is put in) over HTTP(S). - -## Support -PyWebServer will follow a standard support scheme. -### 1.x -For every 1.x version there will be support until 2 newer versions come out. -So that means that 1.0 will still be supported when 1.1 comes out, but no longer be supported when 1.2 comes out. -### 2.x -I am planning on releasing a 2.x version with will have a lot more advanced features, like nginx's server block emulation amongst other things. -When 2.0 will come out, 1.x will be developed further, but 2.0 will be the main focus. +## Currently W.I.P. Check back later! diff --git a/new_conf.conf b/new_conf.conf index 7a2bfc3..ca2c89d 100644 --- a/new_conf.conf +++ b/new_conf.conf @@ -1,31 +1,3 @@ -# NOTE: -# New functions: -# match(String,Boolean): -# String: The string to match. -# Boolean: Case sensitivity. -# General info: -# The match command is used for UA-based blocking. Will block -# anything that matches the String. - -# NOTE: -# Custom (sorta) datatypes. -# String: -# NSCL 2.0 equivalent of Pythons `str`. -# Integer: -# NSCL 2.0 equivalent of Pythons `int`. -# Boolean: -# NSCL 2.0 implementation of a Boolean. Supported inputs: -# 0: False -# 1: True - -# NOTE: -# This is a beta of NSCL 2.0 -# Current version: NSCL 2.0-raw-alpha0 -# The NSCL 1.3 spec and sample parser is uploaded to: -# https://git.novacow.ch/Nova/nscl-1.3-spec/ -# The 2.0 spec will be uploaded to: -# https://git.novacow.ch/Nova/nscl-2.0-spec/ - # WARNING: This is an alpha spec of NSCL 2.0!! host example.com { diff --git a/pywebsrv.py b/pywebsrv.py index a68ebb8..fc8d108 100644 --- a/pywebsrv.py +++ b/pywebsrv.py @@ -56,6 +56,8 @@ except ImportError: # ) pass +AMETHYST_BUILD_NUMBER = "0001" +AMETHYST_REPO = "https://git.novacow.ch/Nova/PyWebServer/" class FileHandler: CONFIG_FILE = "pywebsrv.conf" @@ -265,6 +267,7 @@ class RequestParser: Mfw im in an ugly code writing contest and my opponent is nova while writing a side project """ host = f"{host}" + print(f"hosts: {self.hosts}, host: {host}") if ":" in host: host = host.split(":", 1)[0] host = host.lstrip() @@ -342,17 +345,17 @@ class WebServer: self.http_404_html = ( "HTTP 404 - PyWebServer" - "

HTTP 404 - Not Found!

Running PyWebServer/1.2.1

" + f"

HTTP 404 - Not Found!

Running PyWebServer/amethyst-build-{AMETHYST_BUILD_NUMBER}

" "
" ) self.http_403_html = ( "HTTP 403 - PyWebServer" - "

HTTP 403 - Forbidden

Running PyWebServer/1.2.1

" + f"

HTTP 403 - Forbidden

Running PyWebServer/amethyst-build-{AMETHYST_BUILD_NUMBER}

" "
" ) self.http_405_html = ( "HTTP 405 - PyWebServer" - "

HTTP 405 - Method not allowed

Running PyWebServer/1.2.1

" + f"

HTTP 405 - Method not allowed

Running PyWebServer/amethyst-build-{AMETHYST_BUILD_NUMBER}

" "
" ) @@ -510,7 +513,7 @@ class WebServer: status_message = messages.get(status_code) headers = ( f"HTTP/1.1 {status_code} {status_message}\r\n" - f"Server: PyWebServer/1.4\r\n" + f"Server: PyWebServer/amethyst-build-{AMETHYST_BUILD_NUMBER}\r\n" f"Content-Type: {content_type}\r\n" f"Content-Length: {len(binary_data)}\r\n" f"Connection: close\r\n\r\n" @@ -547,7 +550,7 @@ class WebServer: # Don't encode yet, if 302 status code we have to include location. headers = ( f"HTTP/1.1 {status_code} {status_message}\r\n" - f"Server: PyWebServer/1.4\r\n" + f"Server: PyWebServer/amethyst-build-{AMETHYST_BUILD_NUMBER}\r\n" f"Content-Length: {len(body)}\r\n" f"Connection: close\r\n\r\n" ).encode() @@ -571,7 +574,7 @@ class WebServer: headers = ( f"HTTP/1.1 {status_code} {status_message}\r\n" f"Location: {host}\r\n" - f"Server: PyWebServer/1.2.1\r\n" + f"Server: PyWebServer/amethyst-build-{AMETHYST_BUILD_NUMBER}\r\n" f"Content-Length: {len(body)}\r\n" f"Connection: close\r\n\r\n" ).encode() @@ -587,6 +590,17 @@ class WebServer: def main(): + print( + "WARNING!!\n" + f"This is Amethyst alpha build {AMETHYST_BUILD_NUMBER}\n" + "Since this is an alpha version of Amethyst, most features aren't working!\n" + "These builds are also very verbose and will spit out a lot on the terminal. " + "As you can imagine, this is for debugging purposes.\n" + "THERE IS ABSOLUTELY NO SUPPORT FOR THESE VERSIONS!\n" + "DO NOT USE THEM IN PRODUCTION SETTINGS!\n" + f"Please report any bugs on {AMETHYST_REPO}\n" + ) + input("Press to continue. ") file_handler = FileHandler() file_handler.base_dir = file_handler.read_config("directory") http_port = file_handler.read_new_config("port") or 8080