2012-11-28 15 views
6

sto cercando di modificare la risposta http in un filtro e sto ottenendo il seguente eccezioneJetty di filtro per modificare la risposta - java.lang.IllegalStateException: SCRITTORE

java.lang.IllegalStateException: SCRITTORE a org .eclipse.jetty.server.Response.getOutputStream (Response.java:657) a javax.servlet.ServletResponseWrapper.getOutputStream (ServletResponseWrapper.java:142) a org.eclipse.jetty.servlets.ProxyServlet.service (ProxyServlet .java: 414) a org.eclipse.jetty.servlet.ServletHolder.handle (ServletHolder.jav un: 643) a org.eclipse.jetty.servlet.ServletHandler $ CachedChain.doFilter (ServletHandler.java:1331) a com.cisco.vsx.node.proxy.http.RegexFilter.doFilter (RegexFilter.java: 36)

Sto utilizzando SelectChannelSelector e ProxyServlet.Transparent proxy.

riportano di seguito le frammento classe di test

ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); 
context.setContextPath("/"); 

ProxyServlet.Transparent p1 = new ProxyServlet.Transparent("/proxy", 
    "www.cisco.com", 80); 
ServletHolder servletHolder = new ServletHolder(p1); 
context.addServlet(servletHolder, "/proxy/*"); 
context.addFilter(new FilterHolder(RegexFilter.class), "/*", null); 

server.setHandler(context); 

server.start(); 
server.join(); 

Questo è il codice dalla classe filtro

PrintWriter out = response.getWriter(); 
CharResponseWrapper wrapper = new CharResponseWrapper((HttpServletResponse) response); 

chain.doFilter(request, wrapper); 

String html = wrapper.toString(); 
if (regex != null && response.getContentType() != null 
     && response.getContentType().startsWith("text/html")) { 
    Matcher matcher = regex.matcher(html); 
    Map<Integer, Integer> matches = new LinkedHashMap<Integer, Integer>(); 
    while (matcher.find()) { 
     int start = matcher.start(1); 
     System.out.println("START" + start); 
     int end = matcher.end(1); 
     System.out.println("END" + end); 
     matches.put(start, end - start); 
    } 
    StringBuffer sb = new StringBuffer(); 
    int start = 0; 
    for (int startIndex : matches.keySet()) { 
     String str = html.substring(start, startIndex) + "/proxy/"; 
     sb.append(str); 
     start = startIndex + matches.get(startIndex); 
    } 
    html = sb.toString(); 
} 

response.setContentLength(html.getBytes().length); 
out.write(html); 

Non sai da dove roba sta andando male.

risposta

11

Il tuo Jetty Response può essere in due (tecnicamente tre) modalità distinte. Uno è la modalità di scrittura, l'altra è la modalità di streaming (e la terza è fondamentalmente la modalità indecisa).

Se si chiama getWriter() su una risposta "indecisa", lo si inserisce in modalità scrittura, che non può essere annullata. Se qualcosa in seguito tenta di utilizzare questa risposta in modalità streaming (chiamando lo getOutputStream()) viene generata l'eccezione che vedi.

Per risolvere questo problema, non utilizzare questa risposta in modalità di scrittura e "fai le tue cose" su OutputStream. Se stavi accedendo lo scrittore in un secondo momento (dopo doChain), si otterrebbe l'eccezione inversa

java.lang.IllegalStateException: STREAM

invece.

Problemi correlati