Basic server working.

This commit is contained in:
JesseBrault0709 2024-06-03 08:33:59 +02:00
parent 274f2efb2e
commit ef56eebf7b
5 changed files with 193 additions and 2 deletions

View File

@ -1,5 +1,6 @@
plugins {
id 'com.jessebrault.ssg' version '0.4.0'
id 'distribution'
}
group = 'com.jessebrault'
@ -10,7 +11,51 @@ repositories {
mavenLocal()
}
dependencies {
implementation 'org.apache.groovy:groovy:4.0.21'
configurations {
server
}
sourceSets {
server
}
dependencies {
implementation 'org.apache.groovy:groovy:4.0.21'
serverImplementation 'org.eclipse.jetty:jetty-server:12.0.9'
serverImplementation 'info.picocli:picocli:4.7.6'
serverRuntimeOnly 'org.apache.logging.log4j:log4j-slf4j2-impl:2.23.1'
}
tasks.register('serverJar', Jar) {
group = 'build'
archiveBaseName = 'jb-ssg-site-server'
from sourceSets.server.java.classesDirectory
from sourceSets.server.resources.files
}
tasks.register('serverStartScripts', CreateStartScripts) {
applicationName = 'JbServer'
mainClass = 'com.jessebrault.site.JbServer'
classpath = files(configurations.serverRuntimeClasspath.files.collect {
java.nio.file.Path.of('lib', it.name).toFile()
})
classpath += files(tasks.named('serverJar', Jar).get().outputs.files.collect { it.name })
outputDir = file('build/tmp/serverStartScripts')
}
distributions {
server {
contents {
from(serverStartScripts) {
into 'bin'
}
from(serverJar) {
into 'lib'
}
from(configurations.serverRuntimeClasspath.files) {
into 'lib'
}
}
}
}

View File

@ -0,0 +1,64 @@
package com.jessebrault.site;
import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.Response;
import org.eclipse.jetty.util.Callback;
import java.nio.ByteBuffer;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.regex.Pattern;
public final class JbHandler extends Handler.Abstract {
private static final Pattern extensionPattern = Pattern.compile("\\.(?<extension>.+)$");
private static String getExtension(String path) {
final var m = extensionPattern.matcher(path);
if (m.matches()) {
return m.group("extension");
} else {
return null;
}
}
private final Path base;
public JbHandler(Path base) {
this.base = base;
}
@Override
public boolean handle(Request request, Response response, Callback callback) throws Exception {
final String path = request.getHttpURI().getDecodedPath();
String relative;
if (path.length() > 1) {
final String withoutStartSlash = path.substring(1);
if (withoutStartSlash.endsWith("/")) {
relative = withoutStartSlash + "index.html";
} else {
relative = withoutStartSlash;
}
} else {
relative = "index.html";
}
final String extension = getExtension(relative);
if (extension == null) {
relative = relative + ".html";
}
final Path resolved = base.resolve(relative);
if (!Files.exists(resolved)) {
return false;
} else {
try (final var inputStream = Files.newInputStream(resolved)) {
final ByteBuffer byteBuffer = ByteBuffer.wrap(inputStream.readAllBytes());
response.write(true, byteBuffer, callback);
}
return true;
}
}
}

View File

@ -0,0 +1,60 @@
package com.jessebrault.site;
import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.server.handler.DefaultHandler;
import org.eclipse.jetty.util.thread.QueuedThreadPool;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import picocli.CommandLine;
import java.nio.file.Path;
@CommandLine.Command(
name = "jbServer",
description = "The main server for jessebrault.com.",
mixinStandardHelpOptions = true
)
public class JbServer implements Runnable {
public static void main(String[] args) {
new CommandLine(new JbServer()).execute(args);
}
private static final Logger logger = LoggerFactory.getLogger(JbServer.class);
@CommandLine.Option(names = "--watch")
private boolean watch;
@CommandLine.Option(names = { "-p", "--port" }, defaultValue = "8080")
private int port;
@CommandLine.Option(names = { "-b", "--base" }, defaultValue = "dist/default")
private Path base;
@Override
public void run() {
final var queuedThreadPool = new QueuedThreadPool();
queuedThreadPool.setName("jbServer");
final var server = new Server(queuedThreadPool);
final var connector = new ServerConnector(server);
connector.setPort(this.port);
server.addConnector(connector);
final Handler.Sequence sequence = new Handler.Sequence();
sequence.addHandler(new JbHandler(this.base));
sequence.addHandler(new DefaultHandler());
server.setHandler(sequence);
try {
server.start();
logger.info("Server started on port {}.", this.port);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8" ?>
<Configuration xmlns="http://logging.apache.org/log4j/2.0/config">
<Appenders>
<Console name="root">
<PatternLayout>
<LevelPatternSelector defaultPattern="[%t] %-5level %logger{1.} %msg%n">
<PatternMatch key="DEBUG" pattern="[%t] %-5level %logger{1.}.%M() %msg%n" />
</LevelPatternSelector>
</PatternLayout>
</Console>
</Appenders>
<Loggers>
<Root level="INFO">
<AppenderRef ref="root" />
</Root>
</Loggers>
</Configuration>

5
start Executable file
View File

@ -0,0 +1,5 @@
#!/usr/bin/env bash
gradle -q installServerDist \
&& bin/ssg build -g \
&& build/install/jb-ssg-site-server/bin/JbServer "$@"