Basic server working.
This commit is contained in:
		
							parent
							
								
									274f2efb2e
								
							
						
					
					
						commit
						ef56eebf7b
					
				
							
								
								
									
										49
									
								
								build.gradle
									
									
									
									
									
								
							
							
						
						
									
										49
									
								
								build.gradle
									
									
									
									
									
								
							| @ -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' | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
							
								
								
									
										64
									
								
								src/server/java/com/jessebrault/site/JbHandler.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								src/server/java/com/jessebrault/site/JbHandler.java
									
									
									
									
									
										Normal 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; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| } | ||||
							
								
								
									
										60
									
								
								src/server/java/com/jessebrault/site/JbServer.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								src/server/java/com/jessebrault/site/JbServer.java
									
									
									
									
									
										Normal 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); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| } | ||||
							
								
								
									
										17
									
								
								src/server/resources/log4j2.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								src/server/resources/log4j2.xml
									
									
									
									
									
										Normal 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> | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 JesseBrault0709
						JesseBrault0709