Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
98b40a1
Initial commit med all kod (#16)
Kathify Feb 10, 2026
c1b5f70
build: configure pom.xml with needed plugin/tools. (#19)
eeebbaandersson Feb 10, 2026
bf4d977
Initial commit för tcp-server (#17)
Kathify Feb 10, 2026
148411e
Issue #12 (#21)
Xeutos Feb 10, 2026
9ac7b57
Feature/docker image builder issue#11 (#25)
Xeutos Feb 11, 2026
875d1ef
Feature/http parse headers (#18)
FeFFe1996 Feb 11, 2026
9289c7d
Feature/http response builder (#24)
JohanHiths Feb 11, 2026
6bdb1ef
Feature/http parse request line (#20)
FeFFe1996 Feb 11, 2026
781e34a
Add Bucket4j dependency in pom file (#40)
gvaguirres Feb 11, 2026
511b5ee
Add support for serving static files (#42)
codebyNorthsteep Feb 12, 2026
aaeba6d
Updates pom.xml, with jackson-dependencies, for config file (#48)
fredrikmohlen Feb 12, 2026
524f33c
* Move HTTP handling to a dedicated ConnectionHandler (#50)
donne41 Feb 12, 2026
8cc69d8
Feature/13 implement config file (#22)
MartinStenhagen Feb 17, 2026
c0e3de6
Enhancement/404 page not found (#53)
codebyNorthsteep Feb 17, 2026
bcb828c
Feature/issue59 run configloader (#61)
MartinStenhagen Feb 18, 2026
945d32b
23 define and create filter interface (#46)
eraiicphu Feb 18, 2026
3128ac7
Feature/mime type detection #8 (#47)
gitnes94 Feb 18, 2026
d4e7481
Dockerfile update (#52) (#63)
Xeutos Feb 19, 2026
5c80eaa
Added comprehensive README.MD (#67)
gitnes94 Feb 19, 2026
6950c14
Fix: Path traversal vulnerability in StaticFileHandler (#65)
apaegs Feb 19, 2026
78f7e21
Resolve port: CLI > config > default (#29)
viktorlindell12 Feb 23, 2026
86f2ba7
Refactor status codes to constants #71 (#77)
eeebbaandersson Feb 23, 2026
261a32a
Add rate limiting filter implementation
gvaguirres Feb 24, 2026
2b33865
Add rate limiting filter test
gvaguirres Feb 24, 2026
e62d217
Merge remote-tracking branch 'origin/main' into feature/rate-limiting…
gvaguirres Feb 24, 2026
650028e
Add error 429 too many requests in builder
gvaguirres Feb 24, 2026
23c0667
Change to new reason phrases from builder in test class
gvaguirres Feb 24, 2026
103178a
fixed file path (#86)
gurkvatten Feb 24, 2026
a736812
Add a little description of the bucket and change "429" to sc_too_man…
gvaguirres Feb 24, 2026
2077377
Add a description of how the token bucket algorithm works
gvaguirres Feb 24, 2026
e72f073
Fix path in Dockerfile for `www` directory copy operation (#87)
codebyNorthsteep Feb 24, 2026
ff4cd12
Feature/27 ipfilter (#70)
apaegs Feb 24, 2026
c46f6e6
Update 429 error response with HTML body
gvaguirres Feb 24, 2026
b54c2aa
Merge remote-tracking branch 'origin/main' into feature/rate-limiting…
gvaguirres Feb 24, 2026
4140c95
Add Rate Limiting Filter in connection handler
gvaguirres Feb 24, 2026
7652687
Feature/LocaleFilter (#81)
AntonAhlqvist Feb 25, 2026
ff5e13e
Add guard against mission/invalid client ip
gvaguirres Feb 25, 2026
d6f1d26
Create LoggFilter (#83)
AnnaZiafar Feb 25, 2026
6583833
Add method for prevent unbounded growth of buckets per‑IP
gvaguirres Feb 25, 2026
27e627c
Return status code 500 (#79)
AnnaZiafar Feb 25, 2026
db0c574
Feature/LocaleFilterCookie (#92)
AntonAhlqvist Feb 25, 2026
b7154fa
added brotli4j (#94)
gurkvatten Feb 25, 2026
2d93fc5
Add three test to check the removing of the buckets
gvaguirres Feb 25, 2026
e18b048
Refactorization of the method startCleanupThread, add method getBucke…
gvaguirres Feb 25, 2026
c38e84b
Add lifecycle control to cleanup
gvaguirres Feb 25, 2026
fa1599a
Issue/69 remove html concat (#73)
Rickank Feb 26, 2026
c7c63e8
Implement configurable filter pipeline (global + per‑route filters) #…
Ericthilen Feb 26, 2026
245e188
28 file format compression filter (#82)
gurkvatten Feb 26, 2026
bc93313
Feature/32 filter request timeout class (#90)
eeebbaandersson Feb 26, 2026
80ffccf
Feature/config loading from classpath (#72)
MartinStenhagen Feb 27, 2026
bf38050
Implement X-Forwarded-For in rate limiting filter
gvaguirres Feb 27, 2026
c504044
Merge remote-tracking branch 'origin/main' into feature/rate-limiting…
gvaguirres Feb 27, 2026
9575288
Correction in x forwarded for logic
gvaguirres Feb 27, 2026
a610bac
Refactoring logic of x forwarded for to a method
gvaguirres Feb 27, 2026
d95116b
Fix logic in method resolve client ip
gvaguirres Feb 27, 2026
0583b14
Add rate limiting filter IP test
gvaguirres Feb 27, 2026
6fed940
Fix with code rabbit review
gvaguirres Feb 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
name: Java CI with Maven

on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]

jobs:
build:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4

- name: Get Java Version
run: |
JAVA_VERSION=$(mvn help:evaluate "-Dexpression=maven.compiler.release" -q -DforceStdout)
echo "JAVA_VERSION=$JAVA_VERSION" >> $GITHUB_ENV

- name: Set up JDK ${{ env.JAVA_VERSION }}
uses: actions/setup-java@v4
with:
java-version: ${{ env.JAVA_VERSION }}
distribution: 'temurin'
cache: maven

- name: Compile with Maven
run: mvn -B compile --file pom.xml

- name: Test with Maven
run: mvn -B test --file pom.xml
35 changes: 35 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
name: Publish Docker Image to Github Packages on Release
on:
release:
types:
- published
jobs:
publish:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- uses: actions/checkout@v6.0.2
- uses: docker/setup-qemu-action@v3.7.0
- uses: docker/setup-buildx-action@v3.12.0
- name: Log in to GHCR
uses: docker/login-action@v3.7.0
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract metadata
id: meta
uses: docker/metadata-action@v5.10.0
with:
images: ghcr.io/ithsjava25/webserver
- name: Build and push
uses: docker/build-push-action@v6.18.0
with:
context: .
push: true
platforms: linux/amd64, linux/arm64
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}

16 changes: 16 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
FROM maven:3-eclipse-temurin-25-alpine AS build
WORKDIR /build
COPY src/ src/
COPY pom.xml pom.xml
RUN mvn compile
RUN mvn dependency:copy-dependencies -DincludeScope=compile

FROM eclipse-temurin:25-jre-alpine
EXPOSE 8080
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
WORKDIR /app/
COPY --from=build /build/target/classes/ /app/
COPY --from=build /build/target/dependency/ /app/dependencies/
COPY www/ ./www/
USER appuser
ENTRYPOINT ["java", "-classpath", "/app:/app/dependencies/*", "org.example.App"]
Comment on lines +1 to +16
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

application.yml is never loaded at runtime in Docker — config path mismatch

App.java loads the config from the hardcoded relative path "src/main/resources/application.yml". After mvn compile, Maven copies application.yml to target/classes/, and the Dockerfile then places it at /app/application.yml. At runtime the working directory is /app/, so the JVM looks for /app/src/main/resources/application.yml, which does not exist. ConfigLoader silently falls back to defaults, meaning server.port, rootDir, and ipFilter settings in application.yml are never applied in production.

Fix options:

  • Option A (recommended): Change App.java to load from the classpath (ClassLoader.getSystemResourceAsStream("application.yml")) instead of a filesystem path.
  • Option B: COPY the file to src/main/resources/application.yml relative to WORKDIR, or add an ADD/COPY into the expected path in the runtime stage.
💡 Option A — classpath loading in App.java (outside this file's diff)
// In App.java
try (InputStream is = App.class.getClassLoader().getResourceAsStream("application.yml")) {
    AppConfig appConfig = ConfigLoader.loadFromStream(is); // adjust ConfigLoader accordingly
    ...
}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Dockerfile` around lines 1 - 16, App.java currently loads configuration from
the filesystem path "src/main/resources/application.yml", which is missing at
runtime inside the Docker image; update App.java to load application.yml from
the classpath using
App.class.getClassLoader().getResourceAsStream("application.yml") and pass that
InputStream into ConfigLoader (e.g., ConfigLoader.loadFromStream) so the file
packaged in target/classes is used, or alternatively modify the Dockerfile
runtime stage to place application.yml at the expected filesystem path (copy
into /app/src/main/resources/application.yml) if you prefer the filesystem
approach; ensure references to App, ConfigLoader, and application.yml are
updated accordingly.

49 changes: 49 additions & 0 deletions PortConfigurationGuide.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
# Konfiguration: port (CLI → config-fil → default)

Det här projektet väljer vilken port servern ska starta på enligt följande prioritet:

1. **CLI-argument** (`--port <port>`) – högst prioritet
2. **Config-fil** (`application.yml`: `server.port`)
3. **Default** (`8080`) – används om port saknas i config eller om config-filen saknas

---

## 1) Default-värde

Om varken CLI eller config anger port används:

- **8080** (default för `server.port` i `AppConfig`)

---

## 2) Config-fil: `application.yml`

### Var ska filen ligga?
Standard:
- `src/main/resources/application.yml`

### Exempel
```yaml
server:
port: 9090
```

---

## 3) CLI-argument

CLI kan användas för att override:a config:

```bash
java -cp target/classes org.example.App --port 8000
```

---

## 4) Sammanfattning

Prioritet:

1. CLI (`--port`)
2. `application.yml` (`server.port`)
3. Default (`8080`)
Loading