1 package de.juplo.thymeproxy;
3 import de.juplo.thymeleaf.JuploDialect;
4 import java.util.HashMap;
6 import java.util.Properties;
7 import org.apache.http.impl.client.CloseableHttpClient;
8 import org.springframework.beans.factory.annotation.Autowired;
9 import org.springframework.boot.SpringApplication;
10 import org.springframework.boot.autoconfigure.SpringBootApplication;
11 import org.springframework.boot.autoconfigure.web.ErrorAttributes;
12 import org.springframework.boot.autoconfigure.web.ErrorController;
13 import org.springframework.boot.autoconfigure.web.ServerProperties;
14 import org.springframework.context.ApplicationContext;
15 import org.springframework.context.annotation.Bean;
16 import org.springframework.core.Ordered;
17 import org.springframework.core.env.Environment;
18 import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
19 import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
20 import org.springframework.web.servlet.handler.SimpleMappingExceptionResolver;
21 import org.springframework.web.servlet.mvc.UrlFilenameViewController;
22 import org.thymeleaf.resourceresolver.IResourceResolver;
23 import org.thymeleaf.resourceresolver.UrlResourceResolver;
24 import org.thymeleaf.templateresolver.TemplateResolver;
27 @SpringBootApplication
28 public class Application extends WebMvcConfigurerAdapter
31 private ServerProperties properties;
35 public RegexUrlHandlerMapping proxiedHandlerMapping(
36 ProxyHttpRequestHandler proxy,
37 UrlFilenameViewController views
40 RegexUrlHandlerMapping mapping = new RegexUrlHandlerMapping();
41 mapping.setOrder(Ordered.HIGHEST_PRECEDENCE);
42 Map<String, Object> mappings = new HashMap<>();
43 mappings.put("/img/.+", proxy);
44 mappings.put("/css/.+", proxy);
45 mappings.put("/js/.+", proxy);
46 mappings.put("/fonts/.+", proxy);
47 mappings.put("/.*\\.html", views);
48 mapping.setUrlMap(mappings);
53 public ProxyHttpRequestHandler proxyHttpRequestHandler(
54 CloseableHttpClient client,
58 ProxyHttpRequestHandler handler = new ProxyHttpRequestHandler();
59 handler.setClient(client);
60 handler.setOrigin(env.getProperty("thymeproxy.origin"));
61 handler.setTtl(30000l);
66 public UrlFilenameViewController urlFilenameViewController()
68 return new UrlFilenameViewController();
72 public TemplateResolver defaultTemplateResolver(
73 IResourceResolver resources,
77 TemplateResolver resolver = new TemplateResolver();
78 resolver.setResourceResolver(resources);
79 resolver.setPrefix("http://localhost:8080/thymeleaf/");
80 resolver.setSuffix(".html");
81 resolver.setTemplateMode("HTML5");
82 resolver.setCharacterEncoding("UTF-8");
83 resolver.setCacheable(Boolean.valueOf(env.getProperty("thymeproxy.cacheable")));
88 public TemplateResolver jsonTemplateResolver(
89 IResourceResolver resources,
93 TemplateResolver resolver = new TemplateResolver();
94 resolver.setResourceResolver(resources);
95 resolver.setPrefix("http://localhost:8080/thymeleaf/");
96 resolver.setSuffix(".json");
97 resolver.setTemplateMode("JSON");
98 resolver.setCharacterEncoding("UTF-8");
99 resolver.setCacheable(Boolean.valueOf(env.getProperty("thymeproxy.cacheable")));
104 public UrlResourceResolver thymeleafResourceResolver()
106 return new UrlResourceResolver();
110 public JuploDialect juploDialect()
112 return new JuploDialect();
116 public SimpleMappingExceptionResolver simpleMappingExceptionResolver()
118 SimpleMappingExceptionResolver resolver =
119 new SimpleMappingExceptionResolver();
121 Properties mappings = new Properties();
122 mappings.setProperty("TemplateInputException", "templates/404");
124 resolver.setExceptionMappings(mappings);
125 resolver.setDefaultErrorView("templates/500");
126 resolver.setWarnLogCategory("exception");
131 public ErrorController errorController(
132 ApplicationContext context,
133 ErrorAttributes errorAttributes
136 return new ExceptionResolverErrorController(
139 properties.getError()
145 public void addViewControllers(ViewControllerRegistry registry)
147 registry.addViewController("/").setViewName("forward:index.html");
151 public static void main(String[] args)
153 SpringApplication.run(Application.class, args);