1 package de.juplo.thymeproxy;
3 import de.juplo.thymeleaf.JuploDialect;
4 import java.util.HashMap;
6 import javax.servlet.http.HttpServletRequest;
7 import javax.servlet.http.HttpServletResponse;
8 import org.apache.http.impl.client.CloseableHttpClient;
9 import org.springframework.beans.factory.annotation.Autowired;
10 import org.springframework.boot.SpringApplication;
11 import org.springframework.boot.autoconfigure.SpringBootApplication;
12 import org.springframework.boot.autoconfigure.web.BasicErrorController;
13 import org.springframework.boot.autoconfigure.web.ErrorAttributes;
14 import org.springframework.boot.autoconfigure.web.ErrorController;
15 import org.springframework.boot.autoconfigure.web.ErrorProperties;
16 import org.springframework.boot.autoconfigure.web.ServerProperties;
17 import org.springframework.context.annotation.Bean;
18 import org.springframework.core.Ordered;
19 import org.springframework.core.env.Environment;
20 import org.springframework.http.MediaType;
21 import org.springframework.web.servlet.ModelAndView;
22 import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
23 import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
24 import org.springframework.web.servlet.mvc.UrlFilenameViewController;
25 import org.thymeleaf.resourceresolver.IResourceResolver;
26 import org.thymeleaf.resourceresolver.UrlResourceResolver;
27 import org.thymeleaf.templateresolver.TemplateResolver;
30 @SpringBootApplication
31 public class Application extends WebMvcConfigurerAdapter
34 private ServerProperties properties;
38 public RegexUrlHandlerMapping proxiedHandlerMapping(
39 ProxyHttpRequestHandler proxy,
40 UrlFilenameViewController views
43 RegexUrlHandlerMapping mapping = new RegexUrlHandlerMapping();
44 mapping.setOrder(Ordered.HIGHEST_PRECEDENCE);
45 Map<String, Object> mappings = new HashMap<>();
46 mappings.put("/thymeleaf/.*\\.html", proxy);
47 mappings.put("/img/.+", proxy);
48 mappings.put("/css/.+", proxy);
49 mappings.put("/js/.+", proxy);
50 mappings.put("/fonts/.+", proxy);
51 mappings.put("/.*\\.html", views);
52 mapping.setUrlMap(mappings);
57 public ProxyHttpRequestHandler proxyHttpRequestHandler(
58 CloseableHttpClient client,
62 ProxyHttpRequestHandler handler = new ProxyHttpRequestHandler();
63 handler.setClient(client);
64 handler.setOrigin(env.getProperty("thymeproxy.origin"));
65 handler.setTtl(30000l);
70 public UrlFilenameViewController urlFilenameViewController()
72 return new UrlFilenameViewController();
76 public TemplateResolver defaultTemplateResolver(
77 IResourceResolver resources,
81 TemplateResolver resolver = new TemplateResolver();
82 resolver.setResourceResolver(resources);
83 resolver.setPrefix("http://localhost:8080/thymeleaf/");
84 resolver.setSuffix(".html");
85 resolver.setTemplateMode("HTML5");
86 resolver.setCharacterEncoding("UTF-8");
87 resolver.setCacheable(Boolean.valueOf(env.getProperty("thymeproxy.cacheable")));
92 public TemplateResolver jsonTemplateResolver(
93 IResourceResolver resources,
97 TemplateResolver resolver = new TemplateResolver();
98 resolver.setResourceResolver(resources);
99 resolver.setPrefix("http://localhost:8080/thymeleaf/");
100 resolver.setSuffix(".json");
101 resolver.setTemplateMode("JSON");
102 resolver.setCharacterEncoding("UTF-8");
103 resolver.setCacheable(Boolean.valueOf(env.getProperty("thymeproxy.cacheable")));
108 public UrlResourceResolver thymeleafResourceResolver()
110 return new UrlResourceResolver();
114 public JuploDialect juploDialect()
116 return new JuploDialect();
120 public ErrorController errorController(ErrorAttributes errorAttributes)
122 return new CustomErrorController(errorAttributes, properties.getError());
127 public void addViewControllers(ViewControllerRegistry registry)
129 registry.addViewController("/").setViewName("forward:index.html");
133 public static void main(String[] args)
135 SpringApplication.run(Application.class, args);
139 static class CustomErrorController extends BasicErrorController
141 CustomErrorController(
142 ErrorAttributes errorAttributes,
143 ErrorProperties errorProperties
146 super(errorAttributes, errorProperties);
151 public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response)
153 response.setStatus(getStatus(request).value());
154 Map<String, Object> model =
157 isIncludeStackTrace(request, MediaType.TEXT_HTML)
159 return new ModelAndView("templates/error", model);