package com.example.springdemo.aspect;

import org.apache.tomcat.util.http.MimeHeaders;
import org.springframework.util.StringUtils;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

@WebFilter
public class AuthHeaderSettingFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

        HttpServletRequest req = (HttpServletRequest) servletRequest;
        String type = req.getContentType();

        if (!StringUtils.isEmpty(type)) {
            Map<String, String> map = new HashMap<>();
            map.put("Content-Type", "image/jpeg");
            if (Objects.equals(req.getRequestURI(), "/uploadFile")) {
                modifyHeaders(map, req);
            }
        }
        String content = req.getContentType();
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {
        Filter.super.destroy();
    }

    private void modifyHeaders(Map<String, String> headerses, HttpServletRequest request){
        if (headerses == null || headerses.isEmpty()) {
            return;
        }
        Class<? extends HttpServletRequest> requestClass = request.getClass();
        try {
            Field requestFlied = requestClass.getDeclaredField("request");
            requestFlied.setAccessible(true);
            Object reqObject = requestFlied.get(request);
            Field coyoteRequest = reqObject.getClass().getDeclaredField("coyoteRequest");
            coyoteRequest.setAccessible(true);
            Object coyoteObject = coyoteRequest.get(reqObject);
            Field headers = coyoteObject.getClass().getDeclaredField("headers");
            headers.setAccessible(true);
            MimeHeaders header = (MimeHeaders)headers.get(coyoteObject);
            for (Map.Entry<String, String> entry : headerses.entrySet()) {
                header.removeHeader(entry.getKey());
                header.addValue(entry.getKey()).setString(entry.getValue());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
