Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
9409bf1
- Added jspecify to pom.xml
Martin-E-Karlsson Mar 2, 2026
70d7368
- @NullMarked to src/main/java/org/example/config
Martin-E-Karlsson Mar 2, 2026
d637d49
- Added @NullMarked to src/main/java/org/example/filter package
Martin-E-Karlsson Mar 2, 2026
85f6eed
- Added @NullMarked to src/main/java/org/example/http package
Martin-E-Karlsson Mar 2, 2026
1d684e8
- Added @NullMarked to src/main/java/org/example/httpparser package
Martin-E-Karlsson Mar 2, 2026
909ec9b
- Added @NullMarked to src/main/java/org/example/server package
Martin-E-Karlsson Mar 2, 2026
dd3b25b
- Added @NullMarked to src/test/java/org/example package
Martin-E-Karlsson Mar 2, 2026
af6e41b
- Added @NullMarked to src/test/java/org/example/config package
Martin-E-Karlsson Mar 2, 2026
f2b29d9
- Added @NullMarked to src/test/java/org/example/filter package
Martin-E-Karlsson Mar 2, 2026
cb6d91b
- Added @NullMarked to src/test/java/org/example/http package
Martin-E-Karlsson Mar 2, 2026
08bc34c
- Added @NullMarked to src/test/java/org/example/httpparser package
Martin-E-Karlsson Mar 2, 2026
ef42e29
- Added @NullMarked to src/test/java/org/example/server package
Martin-E-Karlsson Mar 2, 2026
f6a17d1
Applied suggested CodeRabbit fixes to Major Issues regarding null mar…
Martin-E-Karlsson Mar 2, 2026
45c3408
CodeRabbit test went against intended outcome of test. Rollbacked cha…
Martin-E-Karlsson Mar 2, 2026
0648782
- LocaleFilteR: Moved @Nullable from doFilter request parameter to re…
Martin-E-Karlsson Mar 2, 2026
d445813
Merge branch 'main' into 97-implement-null-handling-with-jspecify
Martin-E-Karlsson Mar 2, 2026
48bf90b
- Fixed compilation errors.
Martin-E-Karlsson Mar 2, 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
9 changes: 5 additions & 4 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,7 @@
<assertj.core.version>3.27.7</assertj.core.version>
<mockito.version>5.21.0</mockito.version>
<bucket4j.version>8.14.0</bucket4j.version>

</properties>

<dependencies>
<dependency>
<groupId>com.bucket4j</groupId>
Expand Down Expand Up @@ -70,14 +68,17 @@
<artifactId>brotli4j</artifactId>
<version>1.20.0</version>
</dependency>

<dependency>
<groupId>org.jspecify</groupId>
<artifactId>jspecify</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.5.32</version>
<scope>compile</scope>
</dependency>

</dependencies>
<build>
<plugins>
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/org/example/App.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@

import org.example.config.AppConfig;
import org.example.config.ConfigLoader;
import org.jspecify.annotations.Nullable;

import java.net.Socket;
import java.nio.file.Path;

public class App {
Expand All @@ -30,7 +30,7 @@ static int resolvePort(String[] args, int configPort) {
return validatePort(configPort, "configuration server.port");
}

static Integer parsePortFromCli(String[] args) {
static @Nullable Integer parsePortFromCli(String[] args) {
if (args == null) return null;

for (int i = 0; i < args.length; i++) {
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/org/example/config/package-info.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
@NullMarked
package org.example.config;

import org.jspecify.annotations.NullMarked;
3 changes: 2 additions & 1 deletion src/main/java/org/example/filter/CompressionFilter.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import org.example.http.HttpResponseBuilder;
import org.example.httpparser.HttpRequest;
import com.aayushatharva.brotli4j.encoder.Encoder;
import org.jspecify.annotations.Nullable;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
Expand Down Expand Up @@ -186,7 +187,7 @@ private boolean shouldCompress(String contentType) {
baseType.startsWith("text/");
}

private String getHeader(HttpRequest request, String headerName) {
private @Nullable String getHeader(HttpRequest request, String headerName) {
Map<String, String> headers = request.getHeaders();

String value = headers.get(headerName);
Expand Down
7 changes: 4 additions & 3 deletions src/main/java/org/example/filter/IpFilter.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

import org.example.http.HttpResponseBuilder;
import org.example.httpparser.HttpRequest;
import org.jspecify.annotations.Nullable;

import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
Expand Down Expand Up @@ -84,22 +85,22 @@ private boolean isIpAllowed(String ip) {
* @param ip the IP address
* @return the trimmed IP address, or {@code null} if the input is {@code null}
*/
private String normalizeIp(String ip) {
private @Nullable String normalizeIp(@Nullable String ip) {
return ip == null ? null : ip.trim();
}

public void setMode(FilterMode mode) {
this.mode = mode;
}

public void addBlockedIp(String ip) {
public void addBlockedIp(@Nullable String ip) {
if (ip == null) {
throw new IllegalArgumentException("IP address cannot be null");
}
blockedIps.add(normalizeIp(ip));
}

public void addAllowedIp(String ip) {
public void addAllowedIp(@Nullable String ip) {
if (ip == null) {
throw new IllegalArgumentException("IP address cannot be null");
}
Expand Down
Empty file.
5 changes: 3 additions & 2 deletions src/main/java/org/example/filter/LocaleFilterWithCookie.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import org.example.http.HttpResponseBuilder;
import org.example.httpparser.HttpRequest;
import org.jspecify.annotations.Nullable;

import java.util.Map;

Expand Down Expand Up @@ -74,7 +75,7 @@ private String resolveLocale(HttpRequest request) {
* <p>
* If the cookie header is missing, blank, or malformed, returns null.
*/
private String extractLocaleFromCookie(HttpRequest request) {
private @Nullable String extractLocaleFromCookie(HttpRequest request) {
Map<String, String> headers = request.getHeaders();
if (headers == null) {
return null;
Expand Down Expand Up @@ -111,7 +112,7 @@ private String extractLocaleFromCookie(HttpRequest request) {
* If the header is missing, blank, or malformed, returns null.
* The first language tag is used and any optional quality value (e.g., ";q=0.9") is stripped.
*/
private String extractLocaleFromHeader(HttpRequest request) {
private @Nullable String extractLocaleFromHeader(HttpRequest request) {
Map<String, String> headers = request.getHeaders();
if (headers == null) {
return null;
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/org/example/filter/package-info.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
@NullMarked
package org.example.filter;

import org.jspecify.annotations.NullMarked;
4 changes: 3 additions & 1 deletion src/main/java/org/example/http/MimeTypeDetector.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package org.example.http;

import org.jspecify.annotations.Nullable;

import java.util.Map;

/**
Expand Down Expand Up @@ -56,7 +58,7 @@ private MimeTypeDetector() {
*/


public static String detectMimeType(String filename) {
public static String detectMimeType(@Nullable String filename) {

String octet = "application/octet-stream";

Expand Down
4 changes: 4 additions & 0 deletions src/main/java/org/example/http/package-info.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
@NullMarked
package org.example.http;

import org.jspecify.annotations.NullMarked;
8 changes: 5 additions & 3 deletions src/main/java/org/example/httpparser/HttpRequest.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package org.example.httpparser;

import org.jspecify.annotations.Nullable;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
Expand All @@ -15,14 +17,14 @@ public class HttpRequest {
private final String path;
private final String version;
private final Map<String, String> headers;
private final String body;
private final @Nullable String body;
private final Map<String, Object> attributes = new HashMap<>();

public HttpRequest(String method,
String path,
String version,
Map<String, String> headers,
String body) {
@Nullable String body) {
this.method = method;
this.path = path;
this.version = version;
Expand All @@ -38,7 +40,7 @@ public String getVersion() {
return version; }
public Map<String, String> getHeaders() {
return headers; }
public String getBody() {
public @Nullable String getBody() {
return body; }
public void setAttribute(String key, Object value) {
attributes.put(key, value);
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/org/example/httpparser/package-info.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
@NullMarked
package org.example.httpparser;

import org.jspecify.annotations.NullMarked;
4 changes: 4 additions & 0 deletions src/main/java/org/example/package-info.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
@NullMarked
package org.example;

import org.jspecify.annotations.NullMarked;
3 changes: 2 additions & 1 deletion src/main/java/org/example/server/FilterRegistration.java
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
package org.example.server;

import org.example.filter.Filter;
import org.jspecify.annotations.Nullable;

import java.util.List;
import java.util.Objects;

public record FilterRegistration(
Filter filter,
int order,
List<String> routePatterns
@Nullable List<String> routePatterns
) {
public FilterRegistration {
filter = Objects.requireNonNull(filter, "filter must not be null");
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/org/example/server/package-info.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
@NullMarked
package org.example.server;

import org.jspecify.annotations.NullMarked;
4 changes: 4 additions & 0 deletions src/test/java/org/example/config/package-info.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
@NullMarked
package org.example.config;

import org.jspecify.annotations.NullMarked;
4 changes: 4 additions & 0 deletions src/test/java/org/example/filter/package-info.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
@NullMarked
package org.example.filter;

import org.jspecify.annotations.NullMarked;
4 changes: 4 additions & 0 deletions src/test/java/org/example/http/package-info.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
@NullMarked
package org.example.http;

import org.jspecify.annotations.NullMarked;
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
import java.io.*;

import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy;
import static org.junit.jupiter.api.Assertions.*;

class HttpParseRequestLineTest {
Expand All @@ -30,12 +29,6 @@ void testParserWithTestRequestLine() throws IOException {
assertThat(httpParseRequestLine.getVersion()).isEqualTo("HTTP/1.1");
}

@Test
void testParserThrowErrorWhenNull(){
assertThatThrownBy(() -> httpParseRequestLine.setReader(null)).isInstanceOf(NullPointerException.class);
}


@Test
void testParserThrowErrorWhenEmpty(){
InputStream in = new ByteArrayInputStream("".getBytes());
Expand Down
4 changes: 4 additions & 0 deletions src/test/java/org/example/httpparser/package-info.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
@NullMarked
package org.example.httpparser;

import org.jspecify.annotations.NullMarked;
4 changes: 4 additions & 0 deletions src/test/java/org/example/package-info.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
@NullMarked
package org.example;

import org.jspecify.annotations.NullMarked;
4 changes: 4 additions & 0 deletions src/test/java/org/example/server/package-info.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
@NullMarked
package org.example.server;

import org.jspecify.annotations.NullMarked;