diff --git a/src/main/java/com/github/zxbu/webdavteambition/WebdavTeambitionApplication.java b/src/main/java/com/github/zxbu/webdavteambition/WebdavTeambitionApplication.java index e9dff8a..758ccee 100644 --- a/src/main/java/com/github/zxbu/webdavteambition/WebdavTeambitionApplication.java +++ b/src/main/java/com/github/zxbu/webdavteambition/WebdavTeambitionApplication.java @@ -1,12 +1,12 @@ package com.github.zxbu.webdavteambition; +import com.github.zxbu.webdavteambition.filter.ErrorFilter; import com.github.zxbu.webdavteambition.store.AliYunDriverFileSystemStore; import net.sf.webdav.WebdavServlet; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.boot.web.servlet.ServletRegistrationBean; -import org.springframework.boot.web.servlet.support.ErrorPageFilter; import org.springframework.context.annotation.Bean; import java.util.LinkedHashMap; @@ -31,16 +31,12 @@ public class WebdavTeambitionApplication { return servletRegistrationBean; } - @Bean - public ErrorPageFilter errorPageFilter() { - return new ErrorPageFilter(); - } @Bean - public FilterRegistrationBean disableSpringBootErrorFilter(ErrorPageFilter filter) { + public FilterRegistrationBean disableSpringBootErrorFilter() { FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); - filterRegistrationBean.setFilter(filter); - filterRegistrationBean.setEnabled(false); + filterRegistrationBean.setFilter(new ErrorFilter()); + filterRegistrationBean.setEnabled(true); return filterRegistrationBean; } diff --git a/src/main/java/com/github/zxbu/webdavteambition/client/AliYunDriverClient.java b/src/main/java/com/github/zxbu/webdavteambition/client/AliYunDriverClient.java index b4ee80c..b76f9fd 100644 --- a/src/main/java/com/github/zxbu/webdavteambition/client/AliYunDriverClient.java +++ b/src/main/java/com/github/zxbu/webdavteambition/client/AliYunDriverClient.java @@ -7,7 +7,6 @@ import okhttp3.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.Assert; -import org.springframework.util.StringUtils; import java.io.IOException; import java.io.InputStream; @@ -17,8 +16,8 @@ import java.nio.file.LinkOption; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Collections; -import java.util.LinkedHashMap; import java.util.Map; +import java.util.concurrent.TimeUnit; public class AliYunDriverClient { private static final Logger LOGGER = LoggerFactory.getLogger(AliYunDriverClient.class); @@ -57,7 +56,11 @@ public class AliYunDriverClient { } return null; } - }).build(); + }) + .readTimeout(1, TimeUnit.MINUTES) + .writeTimeout(1, TimeUnit.MINUTES) + .connectTimeout(1, TimeUnit.MINUTES) + .build(); this.okHttpClient = okHttpClient; this.aliYunDriveProperties = aliYunDriveProperties; init(); diff --git a/src/main/java/com/github/zxbu/webdavteambition/filter/ErrorFilter.java b/src/main/java/com/github/zxbu/webdavteambition/filter/ErrorFilter.java new file mode 100644 index 0000000..40f6a1e --- /dev/null +++ b/src/main/java/com/github/zxbu/webdavteambition/filter/ErrorFilter.java @@ -0,0 +1,79 @@ +package com.github.zxbu.webdavteambition.filter; + +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpServletResponseWrapper; +import java.io.IOException; +import java.io.PrintWriter; + +public class ErrorFilter extends OncePerRequestFilter { + + + @Override + protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException { + ErrorWrapperResponse wrapperResponse = new ErrorWrapperResponse(httpServletResponse); + + try { + filterChain.doFilter(httpServletRequest, wrapperResponse); + if (wrapperResponse.hasErrorToSend()) { + httpServletResponse.setStatus(wrapperResponse.getStatus()); + httpServletResponse.getWriter().write(wrapperResponse.getMessage()); + } + httpServletResponse.flushBuffer(); + } catch (Throwable t) { + httpServletResponse.setStatus(500); + httpServletResponse.getWriter().write(t.getMessage()); + httpServletResponse.flushBuffer(); + } + } + + private static class ErrorWrapperResponse extends HttpServletResponseWrapper { + private int status; + private String message; + private boolean hasErrorToSend = false; + + ErrorWrapperResponse(HttpServletResponse response) { + super(response); + } + + public void sendError(int status) throws IOException { + this.sendError(status, (String) null); + } + + public void sendError(int status, String message) throws IOException { + this.status = status; + this.message = message; + this.hasErrorToSend = true; + } + + public int getStatus() { + return this.hasErrorToSend ? this.status : super.getStatus(); + } + + public void flushBuffer() throws IOException { + super.flushBuffer(); + } + + + String getMessage() { + return this.message; + } + + boolean hasErrorToSend() { + return this.hasErrorToSend; + } + + public PrintWriter getWriter() throws IOException { + return super.getWriter(); + } + + public ServletOutputStream getOutputStream() throws IOException { + return super.getOutputStream(); + } + } +}