# sws
# Other contributors' names have been censored for privacy reasons
I****** M******, Tristan Shabbick, A****** J******
2025F Stevens CS 631 APUE Group Project
Collaboration Methods:
Discussions took place on Discord, including but not limited to: project
design, code review / feedback, assignment spec reviewal, etc.
Work was split up by features into different branches, then merged over to
the main branch through GitHub PRs and merges.
git(1) / Github were used as the primary version control tools.
Contributions / Code Delegation:
A****** J******:
- Implemented complete flag & options parsing/verification
- Structs to pass flag & options between functions
- Regular debugging, memory leak fixes, etc.
- Repo Management, PR Creation, Merge Conflict Assistance
- Dynamic Handling of CGI Requests, Execution, and Responses
- If-Modified-Since header support
- Directory Indexing
I****** M******:
- Added Logging Functionality
- Sending over messages to clients
- Sending Status code support
- Refactoring and bug fixes
- Directory Indexing
Tristan Shabbick:
- IPv4 / IPv6 & "Dual Stack" TCP/IP socket support
- Multiplexed I/O on incoming connections
- Daemonization
- Code clean up / review & refactoring in some sections
- If-Modified-Since header support
- User Directory translation & support
- Signal handling fun
Additional Information:
A****** J******:
For printing the usage message, I managed to find a nice trick on
stackoverflow show how to easily print a longer message, while
breaking it up into multiple, easy to read lines on the source file.
The logic for the flag_control struct was adapted from my ls submission
for CS 631.
Additionally, as much as I didn't want to just allocate a huge buffer
for .cgi executions, I felt it was very much necessary given the
circumstances of .cgi convention. Since responses from .cgi scripts still
need to be parsed for headers, there must be some parsing that is required
of the output at minimum. I also take the liberty of normalizing the entire
response to LF since RFC 3875 does not make any mention of line endings.
Also, it's a wonder just how many neat methods you can discover just by
reading the manpages. The SEE ALSO description can be a hidden gold mine
for neat and funky methods you can utilize in your code :)