[ 
https://issues.apache.org/jira/browse/SOLR-2878?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13146354#comment-13146354
 ] 

Nick Veenhof edited comment on SOLR-2878 at 11/8/11 3:26 PM:
-------------------------------------------------------------

New try!

Almost the same CharResponseWrapper is used except that I've thrown away the 
getString method.
I took your comments into account and no strings are used anymore. Could you 
verify if this is what you were pointing at?

{code}
CharResponseWrapper newResponse = new CharResponseWrapper(
    (HttpServletResponse) response);

// CharResponseWrapper is responsable for the getWriter and
// getOutputStream support.
chain.doFilter(request, newResponse);

// The response works with byteArrays so we do to
byte[] responseBody = newResponse.getBytes();

// Write the outgoing header with the ByteArray (Performance)
response.addHeader("pragma", "auth=" +
    buildAuthentication(responseBody) + ";");
// Force the encoding to UTF-8 since we know Drupal works with UTF-8
response.setCharacterEncoding("UTF-8");
response.getOutputStream().write(responseBody);
response.getOutputStream().flush();
{code}
                
      was (Author: nick.veenhof):
    New try!

Almost the same CharResponseWrapper is used except that I've thrown away the 
getString method.
I took your comments into account and no strings are used anymore. Could you 
verify if this is what you were pointing at?

{code}
CharResponseWrapper newResponse = new CharResponseWrapper(
    (HttpServletResponse) response);

// CharResponseWrapper is responsable for the getWriter and
// getOutputStream support.
chain.doFilter(request, newResponse);

// The response works with byteArrays so we do to
byte[] responseBody = newResponse.getBytes();

// Write the outgoing header with the ByteArray (Performance)
response.addHeader("pragma", "hmac_digest=" +
    buildResponseHmac(authenticator, responseBody, s) + ";");
// Force the encoding to UTF-8 since we know Drupal works with UTF-8
response.setCharacterEncoding("UTF-8");
response.getOutputStream().write(responseBody);
response.getOutputStream().flush();
{code}
                  
> Regression in SolrDispatchFilter.java concerning the getOutputStream vs 
> getWriter
> ---------------------------------------------------------------------------------
>
>                 Key: SOLR-2878
>                 URL: https://issues.apache.org/jira/browse/SOLR-2878
>             Project: Solr
>          Issue Type: Bug
>          Components: Build, Response Writers
>    Affects Versions: 3.4
>         Environment: Any unix system, it's a  global problem
>            Reporter: Nick Veenhof
>
> In solr 1.4 we used getWriter in the writeResponse for 
> solrDispatchFilter::doFilter which invoked writeResponse.
> This code looked in summary like this :
> {code:title=solrDispatchFilter.java|borderStyle=solid}
> private void writeResponse(SolrQueryResponse solrRsp, ServletResponse 
> response, 
>    QueryResponseWriter responseWriter, SolrQueryRequest solrReq, Method 
> reqMethod) 
>    throws IOException {
> ...
>  PrintWriter out = response.getWriter();
>  responseWriter.write(out, solrReq, solrRsp);
> ...
> {code}
> In solr 3.x this has changed to something like this 
> {code:title=solrDispatchFilter.java|borderStyle=solid}
> private void writeResponse(SolrQueryResponse solrRsp, ServletResponse 
> response,
>   QueryResponseWriter responseWriter, SolrQueryRequest solrReq, Method 
> reqMethod) 
>   throws IOException {
> ...
> String charset = ContentStreamBase.getCharsetFromContentType(ct);
> Writer out = (charset == null || charset.equalsIgnoreCase("UTF-8"))
>   ? new OutputStreamWriter(response.getOutputStream(), UTF8)
>   : new OutputStreamWriter(response.getOutputStream(), charset);
> out = new FastWriter(out);
> responseWriter.write(out, solrReq, solrRsp);
> out.flush();
> ...
> {code}
> Now, when we add another filter that tries to modify the output it is being 
> blocked by the out.flush(). 
> flush() is telling our outputstream that it can write directly to the 
> destination (similar to the out.close()), since this normally happens 
> automatically there shouldn't be a need to execute this flush.
> In our case this secondary filter is trying to add headers to the response 
> object. When we were using getwriter() it was not closing the writer so we 
> could still modify this output. Since the flush happens now we are no longer 
> able to modify the headers accordingly. 
> It would be an easy fix if the flush could be commented out and everything 
> would work but that is not the case. The headers are working when this 
> happens but there is no more output.
> When I modify both classes to use getWriter() everything is working as 
> expected.
> This is a severe regression for our use of solr.
> Our code that is used in the filter
> {code:title=solrCustomFilter.java|borderStyle=solid}
> public void doFilter(ServletRequest req, ServletResponse res,FilterChain 
> chain) 
>   throws IOException, ServletException {
> ...
> Writer out = new OutputStreamWriter(response.getOutputStream(), "UTF8"); 
> //auto flush
> out = new FastWriter(out);
> // convert to a chartext
> CharResponseWrapper wrapper = new CharResponseWrapper((HttpServletResponse) 
> response);
> chain.doFilter(request, wrapper);
> String responseBody = wrapper.toString();
> //write the outgoing header. Only succeeds when flush of solrDispatchFilter 
> is commented out
> response.addHeader("pragma", "somevalue;");
> out.write(responseBody);
> ...
> {code}
> Sources :
> {quote}
> SRV.5.5 Closure of Response Object
> When a response is closed, the container must immediately flush all remaining 
> content in the response buffer to the client. The following events indicate 
> that the servlet has satisfied the request and that the response object is to 
> be closed:
> • The termination of the service method of the servlet. 
> • The amount of content specified in the setContentLength method of the 
> response has been written to the response. 
> • The sendError method is called. 
> • The sendRedirect method is called.
> {quote}
> Solr 1.4 
> https://svn.apache.org/repos/asf/lucene/solr/branches/branch-1.4/src/webapp/src/org/apache/solr/servlet/SolrDispatchFilter.java
> Solr 3.4 
> https://svn.apache.org/repos/asf/lucene/dev/branches/lucene_solr_3_4/solr/core/src/java/org/apache/solr/servlet/SolrDispatchFilter.java

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to