Defensive publication demonstrates a custom REST API and server architecture, highlighting implications for software development.
Defensive Publication — My MSimpleServer, my Simple Mini Server Architecture, my own REST API-Definition and my Parallel Logger. A platform independent Server Architecture, special restrictive REST API-Definition and a Simple Http App Server including a parallel Logger. Version 0.0.1, Alpha — 27th of July 2026. Older Defensive Publications can be found on archive.today, archive.ph and archive.is. This project is regularly public on GitHub for the purpose of archiving. This software is proprietary and protected by copyright law. Project exclusive author and exclusive owner: Marco Scherzer Ideas, APIs, nomenclatures & architectures: Marco Scherzer Copyright: Marco Scherzer. All rights reserved. Contact Author/Owner: fahrservices.1@gmail.com Please see Legal Notice for more information. For sales, see: Repository Content Sale Notice. MSimpleServer is a single-developer project implemented entirely in platform-independent Java. Currently it runs on Windows Desktop and Android (Example: https://github.com/Marco-Scherzer/MSimpleServerAndroidApp). External dependencies: BOUNCYCASTLE, GSON(ObjectMapping). This early version of MSimpleServer (jar) focuses on HTTP and HTTPS handler implementations and currently supports only simple HttpServer and HttpsServer features with a focus on security through minimalism. Development of MSimpleServer started in early 2025 and had reached 3 to 4 weeks of progress when it started to work for my own simple scenario purposes. MSimpleServer was regularly backed up in the cloud during development, using server-side timestamps. Features after 4 weeks: Parallel accept loops for redundancy General SSL redirection of unencrypted browser HTTP requests Webpage serving My Own Custom REST API with own endpoint declarations Simple Parallel Logger Since October 31, 2025, I decided to develop MSimpleServer on GitHub, continuing from this point. Note: Because I use Git as an addition to my history for proof of authorship, I regularly commit things in my (anyway to treat as private) repositories in an unready state (nothing works). New Features: Post API MHttpResource extended for adding 'MResourceMethod' endpoint methods to a specific file resource New comfortable-to-use MSimpleHttpServerApp app pattern that preconfigures my HTTP server via its API with common default values Parallel Logger extended for better configurability (multi-stream logging, tag filtering) Import of my KeePass entry read/write classes (from my project 'chrono-commit setuper'). Extension of these classes for storing and loading binary content like .html and .js. Current complete working time is approximately 6-7 Weeks. Runtime compatibility goal: Java Runtimes: 8–25 Android Runtimes: Android 10 API level 29 or newer JRE 8 Note: Modern SSL/TLS clients, such as current web browsers, prefer or require TLS 1.3 and updated TLS 1.2 cipher suites. These features seem to be available in JRE 8 distributions from version 8u261 onward (start of TLS 1.3 backport) and seem to be now complete/production ready backported since version 8u472 (released in October 2025) in builds that follow the OpenJDK upstream. (Testable with -Djavax.net.debug=ssl,handshake) API Example 1 (old) See older Zenodo publications/versions of this Software. API Example 2 - New MSimpleHttpServerApp app pattern to write preconfigured servers in derivation steps //------ abstract MSimpleHttpServerApp Base-Class ------ package com.marcoscherzer.msimpleserver.httpserverapp; import com.marcoscherzer.msimpleserver.genericserver.MSimpleMiniServer; import com.marcoscherzer.msimpleserver.http.requestresponse.MHttpContentMap; import javax.net.ssl.SSLContext; /** @version 0.0.1 preAlpha @author Marco Scherzer. Author, Ideas, APIs, Nomenclatures & Architectures: Marco Scherzer Copyright Marco Scherzer. All Rights Reserved */ public abstract class MSimpleHttpServerApp { public MSimpleHttpServerApp(){} public final void createAndStartServerOnDesktop(String ip, int httpPort, int httpsPort, MISSLConfig sslConfig); public final void createAndStartServerOnAndroid(Object context, String ip, int httpPort, int httpsPort, MISSLConfig sslConfig); protected abstract MSimpleMiniServer createAndStartServerImpl(SSLContext sslContext, String ip, int httpPort, int httpsPort, MHttpContentMap contentMap) throws Exception; protected abstract void createAndAddContent(MHttpContentMap contentMap) throws Exception; public final void stop(); } //------ preConfigured the Server Pattern ------ package com.marcoscherzer.msimpleserver.httpserverapp.preconfigured; import static com.marcoscherzer.msimpleserver.http.constants.MHttpMethod.POST; import static com.marcoscherzer.msimpleserver.http.constants.MHttpResponseStatusCodes._404_NOT_FOUND; import com.marcoscherzer.msimpleserver.httpserverapp.MSimpleHttpServerApp; import com.marcoscherzer.msimpleserver.genericserver.MServerSocketCreator; import com.marcoscherzer.msimpleserver.genericserver.MSimpleMiniServer; import com.marcoscherzer.msimpleserver.http.requestresponse.*; import com.marcoscherzer.msimpleserver.http.constants.MHttpVersion; import com.marcoscherzer.msimpleserver.http.constants.MHttp_1_1; import javax.net.ssl.SSLContext; /** @version 0.0.1 preAlpha. @author Marco Scherzer. Author, Ideas, APIs, Nomenclatures & Architectures: Marco Scherzer. Copyright Marco Scherzer. All Rights Reserved */ public abstract class MSimpleHttpServerApp_preConf1 extends MSimpleHttpServerApp { public MSimpleHttpServerApp_preConf1() {super();} protected final MSimpleMiniServer createAndStartServerImpl(SSLContext sslContext, String ip, int httpPort, int httpsPort, MHttpContentMap contentMap) throws Exception { MHttpVersion protocol = new MHttp_1_1(); MHttpRequestValidator v = new MHttpRequestValidator(POST, protocol) .setMaxHeaderSize(8192) .setUpgradeUnencrypted(true); MHttpRequestHandler content1RequestHandler = new MHttpRequestHandler(contentMap, v) .setAdressAndPortForHttpsRedirectResponses(ip, httpsPort) .setSendErrorPagesFor(_404_NOT_FOUND); MHttpRequestHandler content1RequestHandler2 = new MHttpRequestHandler(contentMap, v) .setAdressAndPortForHttpsRedirectResponses(ip, httpsPort) .setSendErrorPagesFor(_404_NOT_FOUND); MServerSocketCreator httpSocket1 = new MServerSocketCreator() .setAddress(ip) .setBiggestAllowedRequestSize(8192); MServerSocketCreator httpsSocket1 = new MServerSocketCreator() .setAddress(ip) .setSSLContext(sslContext) .setBiggestAllowedRequestSize(8192); MSimpleMiniServer server = new MSimpleMiniServer(); server.start(httpPort, httpSocket1, content1RequestHandler, 1, 65535); server.start(httpsPort, httpsSocket1, content1RequestHandler2, 1, 65535); return server; } //------ MSimpleHttpServerApp_preConf1 User Usage Pattern ------ package com.marcoscherzer.msimpleserverdebug; import com.marcoscherzer.msimpleserver.httpserverapp.preconfigured.MSimpleHttpServerApp_preConf1; import com.marcoscherzer.msimpleserver.http.requestresponse.MHttpContentMap; import com.marcoscherzer.msimpleserver.util.parallelitylogger.MRuntimeInfoFieldType; import com.marcoscherzer.msimpleserver.util.parallelitylogger.MRuntimeInfoFields; import java.util.Locale; import static com.marcoscherzer.msimpleserver.util.parallelitylogger.MOutSystem.outConfig; import static com.marcoscherzer.msimpleserver.util.parallelitylogger.preconfigured.MDefaultLevelTag.*; import static com.marcoscherzer.msimpleserver.util.parallelitylogger.MOutSystem.out; /** @version 0.0.1 preAlpha. @author Marco Scherzer. Author, Ideas, APIs, Nomenclatures & Architectures: Marco Scherzer. Copyright Marco Scherzer. All Rights Reserved */ public class MHttpServerAppMain { public static void main(String[] args) { outConfig.setLoggerDebugStream(System.err); outConfig.streams().setLogNotSetupedStreamsInfoToDebugStream(true, false); outConfig.tags().setLogNotSetupedTagsInfoToDebugStream(true); outConfig.streams().addStreams(System.err, System.out); outConfig.runtimeInfoFields().addRuntimeInfoFields(new MRuntimeInfoFields().addField("[", MRuntimeInfoFieldType.TIMEFIELD, "]")); outConfig.runtimeInfoFields().addRuntimeInfoFields(new MRuntimeInfoFields().addThreadField("[", "]").addField("[", MRuntimeInfoFieldType.TIMEFIELD, "] ")); outConfig.tags().addTags(INFO, ERROR, DEBUG); outConfig.start(); MSimpleHttpServerApp_preConf1 app = new MSimpleHttpServerApp_preConf1() { public final void createAndAddContent(MHttpContentMap contentMap) throws Exception { out.println("adding content...", 0, 1); MHtmlResourceWithBackend_1 r1 = new MHtmlResourceWithBackend_1(Locale.ENGLISH, "/test2__.html"); contentMap.addContent("/", r1, false) .addContent("/test2__", r1, false); contentMap.addContent("_404_NOT_FOUND", Locale.ENGLISH, "notFound.html", false) .addContent("/test.pdf", Locale.ENGLISH, "test.pdf", false); } }; app.createAndStartServerOnDesktop("192.168.0.2", 7777, 7733, new MSSLConfig1()); } } //------ MSimpleHttpServerApp_preConf1 User Usage Pattern: MHttpResource with Backend Endpoints ------ package com.marcoscherzer.msimpleserverdebug; import com.marcoscherzer.msimpleserver.genericserver.MIResourceMethod; import com.marcoscherzer.msimpleserver.genericserver.MParameterMap; import com.marcoscherzer.msimpleserver.http.requestresponse.MHttpContentMap; import com.marcoscherzer.msimpleserver.http.requestresponse.MHttpResource; import com.marcoscherzer.msimpleserver.http.requestresponse.MHttpResponseHeader; import java.util.Locale; import static com.marcoscherzer.msimpleserver.util.parallelitylogger.MOutSystem.out; /** @version 0.0.1 preAlpha. @author Marco Scherzer. Author, Ideas, APIs, Nomenclatures & Architectures: Marco Scherzer. Copyright Marco Scherzer. All Rights Reserved */ public class MHtmlResourceWithBackend_1 extends MHttpResource { public MHtmlResourceWithBackend_1(Locale language, String fileName) throws Exception {
No takes yet. Share an insight, caveat, or question.
Marco Scherzer (2026) studied this question.
Synapse has enriched 5 closely related papers on similar clinical questions. Consider them for comparative context: