Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
8 changes: 5 additions & 3 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,10 @@ dependencies {
implementation 'ca.uhn.hapi.fhir:hapi-fhir-jpaserver-mdm:5.4.0'
implementation 'ca.uhn.hapi.fhir:hapi-fhir-testpage-overlay:5.4.0'
implementation('org.springframework.boot:spring-boot-starter-data-jpa')
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation ('org.springframework.boot:spring-boot-starter-web'){
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat'
}
implementation 'org.springframework.boot:spring-boot-starter-jetty'
implementation 'ch.qos.logback:logback-classic:1.2.3'
implementation 'org.thymeleaf:thymeleaf:3.0.11.RELEASE'
implementation 'org.springframework:spring-web'
Expand Down Expand Up @@ -94,9 +97,8 @@ dependencies {
//implementation 'ca.uhn.hapi.fhir:hapi-fhir-testpage-overlay:4.2.0:war'
implementation 'ca.uhn.hapi.fhir:hapi-fhir-testpage-overlay:4.2.0:classes'
// providedImplementation 'javax.servlet:javax.servlet-api:3.1.0'
implementation group:'org.apache.tomcat', name:'tomcat-juli', version:property('tomcat.version')
// implementation group:'org.apache.tomcat', name:'tomcat-juli', version:property('tomcat.version')
implementation 'javax.interceptor:javax.interceptor-api:1.2.2'

}

// To specify folder use -Dfhir_dir=<path>
Expand Down
13 changes: 13 additions & 0 deletions src/main/java/ca/uhn/fhir/jpa/starter/Application.java
Original file line number Diff line number Diff line change
Expand Up @@ -79,10 +79,23 @@ public ServletRegistrationBean overlayRegistrationBean() {
registrationBean.setServlet(dispatcherServlet);
registrationBean.addUrlMappings("/test-ehr/*");
registrationBean.setLoadOnStartup(1);

return registrationBean;

}

@Bean
public ServletRegistrationBean traceServletRegistration() {
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean();
TraceServlet trace = new TraceServlet();
beanFactory.autowireBean(trace);
servletRegistrationBean.setServlet(trace);
servletRegistrationBean.addUrlMappings("/");
servletRegistrationBean.setLoadOnStartup(1);

return servletRegistrationBean;
}

@Bean
@PostConstruct
public WebMvcConfigurer corsConfigurer() {
Expand Down
88 changes: 88 additions & 0 deletions src/main/java/ca/uhn/fhir/jpa/starter/JettyConfiguration.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
package ca.uhn.fhir.jpa.starter;

import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.nio.BufferOverflowException;
import java.nio.charset.StandardCharsets;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.eclipse.jetty.http.MimeTypes;
import org.eclipse.jetty.io.ByteBufferOutputStream;
import org.eclipse.jetty.server.Dispatcher;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.handler.AbstractHandler;
import org.eclipse.jetty.server.handler.ErrorHandler;
import org.eclipse.jetty.util.StringUtil;


import org.eclipse.jetty.server.Server;
import org.springframework.boot.web.embedded.jetty.JettyServerCustomizer;
import org.springframework.boot.web.embedded.jetty.JettyServletWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.context.annotation.Configuration;

@Configuration
public class JettyConfiguration
implements WebServerFactoryCustomizer<JettyServletWebServerFactory> {

@Override
public void customize(JettyServletWebServerFactory factory) {
JettyServerCustomizer customizer = new JettyServerCustomizer() {
@Override
public void customize(Server server) {
server.setErrorHandler(new CustomJettyErrorHandler());
}
};
factory.addServerCustomizers(customizer);
}


public class CustomJettyErrorHandler extends ErrorHandler {

@Override
public void handle(String target, Request baseRequest,
HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {


try {
// Get error message, sanitize it, just in case.
String message = StringUtil.sanitizeXmlString(
(String) request.getAttribute(Dispatcher.ERROR_MESSAGE)
);

// Get error code that will returned
int code = response.getStatus();

var charset = StandardCharsets.UTF_8;

// Get writer used
var buffer = baseRequest.getResponse().getHttpOutput().getBuffer();
var out = new ByteBufferOutputStream(buffer);
var writer = new PrintWriter(new OutputStreamWriter(out, charset));

// Set content type, encoding and write response
response.setContentType(MimeTypes.Type.TEXT_PLAIN.asString());
response.setCharacterEncoding(charset.name());
writer.print("HTTP ERROR ");
writer.print(code);
writer.print("\nMessage: ");
writer.print(message);
writer.print("\nURI: ");
writer.print(request.getRequestURI());


writer.flush();
} catch (BufferOverflowException e) {
baseRequest.getResponse().resetContent();
}

baseRequest.getHttpChannel().sendResponseAndComplete();
}
}
}
5 changes: 4 additions & 1 deletion src/main/java/ca/uhn/fhir/jpa/starter/JpaRestfulServer.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,10 @@ public class JpaRestfulServer extends BaseJpaRestfulServer {
Environment env;
private static final long serialVersionUID = 1L;
static final Logger logger = LoggerFactory.getLogger(JpaRestfulServer.class);

@Override
protected void doTrace(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setStatus(405);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

Expand Down
15 changes: 15 additions & 0 deletions src/main/java/ca/uhn/fhir/jpa/starter/TraceServlet.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package ca.uhn.fhir.jpa.starter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class TraceServlet extends HttpServlet {
@Override
protected void doTrace(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setStatus(405);
}

}