Skip to content

Commit

Permalink
Merge branch '2.3.x' into 2.4.x
Browse files Browse the repository at this point in the history
Conflicts:
	grails-encoder/src/main/groovy/org/codehaus/groovy/grails/web/util/StreamCharBuffer.java
	grails-test-suite-web/src/test/groovy/org/codehaus/groovy/grails/web/codecs/CodecSpec.groovy
  • Loading branch information
lhotari committed Jun 14, 2014
2 parents c05fc17 + 47253e0 commit f9e2f74
Show file tree
Hide file tree
Showing 6 changed files with 61 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@
* @since 2.3
*/
public abstract class AbstractEncodedAppender implements EncodedAppender {
private boolean ignoreEncodingState;

/**
* Append a portion of a char array to the buffer and attach the
* encodingState information to it
Expand Down Expand Up @@ -172,9 +174,9 @@ public void appendEncoded(Encoder encoder, EncodingState encodingState, CharSequ
* @return true, if should encode
*/
protected boolean shouldEncode(Encoder encoderToApply, EncodingState encodingState) {
return encoderToApply != null
return ignoreEncodingState || (encoderToApply != null
&& (encodingState == null || DefaultEncodingStateRegistry.shouldEncodeWith(encoderToApply,
encodingState));
encodingState)));
}

/**
Expand Down Expand Up @@ -272,4 +274,12 @@ public void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) {
System.arraycopy(chars, start + srcBegin, dst, dstBegin, srcEnd - srcBegin);
}
}

public boolean isIgnoreEncodingState() {
return ignoreEncodingState;
}

public void setIgnoreEncodingState(boolean ignoreEncodingState) {
this.ignoreEncodingState = ignoreEncodingState;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -125,4 +125,18 @@ void appendEncoded(Encoder encoder, EncodingState encodingState, CharSequence st
void flush() throws IOException;

public void close() throws IOException;


/**
* When enabled, will encode all input regardless of it's current state
* disables double-encoding prevention.
*
* @param ignoreEncodingState
*/
void setIgnoreEncodingState(boolean ignoreEncodingState);

/**
* @return current state of ignoreEncodingState setting
*/
public boolean isIgnoreEncodingState();
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,13 @@
public class CodecPrintWriter extends GrailsPrintWriter implements EncoderAware, EncodedAppenderFactory {
private final Encoder encoder;
private final StreamCharBuffer buffer;
private boolean ignoreEncodingState;

public CodecPrintWriter(Writer out, Encoder encoder, EncodingStateRegistry encodingStateRegistry) {
this(out, encoder, encodingStateRegistry, false);
}

public CodecPrintWriter(Writer out, Encoder encoder, EncodingStateRegistry encodingStateRegistry, boolean ignoreEncodingState) {
super(null);
this.encoder = encoder;
buffer=new StreamCharBuffer();
Expand All @@ -38,19 +43,21 @@ public CodecPrintWriter(Writer out, Encoder encoder, EncodingStateRegistry encod
buffer.setWriteDirectlyToConnectedMinSize(0);
buffer.setChunkMinSize(0);
}
setOut(buffer.getWriterForEncoder(encoder, encodingStateRegistry));
setOut(buffer.getWriterForEncoder(encoder, encodingStateRegistry, ignoreEncodingState));
}

public Encoder getEncoder() {
return encoder;
}

public EncodedAppender getEncodedAppender() {
return ((EncodedAppenderFactory)buffer.getWriter()).getEncodedAppender();
EncodedAppender encodedAppender = ((EncodedAppenderFactory)buffer.getWriter()).getEncodedAppender();
encodedAppender.setIgnoreEncodingState(ignoreEncodingState);
return encodedAppender;
}

@Override
public Writer getWriterForEncoder(Encoder encoder, EncodingStateRegistry encodingStateRegistry) {
return buffer.getWriterForEncoder(encoder, encodingStateRegistry);
return buffer.getWriterForEncoder(encoder, encodingStateRegistry, ignoreEncodingState);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2623,11 +2623,17 @@ public Writer getWriterForEncoder() {
public Writer getWriterForEncoder(Encoder encoder) {
EncodingStateRegistryLookup encodingStateRegistryLookup = EncodingStateRegistryLookupHolder.getEncodingStateRegistryLookup();
EncodingStateRegistry encodingStateRegistry = encodingStateRegistryLookup != null ? encodingStateRegistryLookup.lookup() : null;
return getWriterForEncoder(encoder, encodingStateRegistry);
return getWriterForEncoder(encoder, encodingStateRegistry, false);
}

public Writer getWriterForEncoder(Encoder encoder, EncodingStateRegistry encodingStateRegistry) {
return new EncodedAppenderWriter(writer.getEncodedAppender(), encoder, encodingStateRegistry);
return getWriterForEncoder(encoder, encodingStateRegistry, false);
}

public Writer getWriterForEncoder(Encoder encoder, EncodingStateRegistry encodingStateRegistry, boolean ignoreEncodingState) {
EncodedAppender encodedAppender = writer.getEncodedAppender();
encodedAppender.setIgnoreEncodingState(ignoreEncodingState);
return new EncodedAppenderWriter(encodedAppender, encoder, encodingStateRegistry);
}

public boolean isNotifyParentBuffersEnabled() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
package org.codehaus.groovy.grails.web.codecs

import grails.converters.XML
import grails.converters.JSON
import grails.test.mixin.TestMixin
import grails.test.mixin.web.GroovyPageUnitTestMixin

import org.codehaus.groovy.grails.web.util.StreamCharBuffer

import spock.lang.Issue
import spock.lang.Specification

Expand Down Expand Up @@ -93,6 +97,18 @@ class CodecSpec extends Specification {
public boolean equals(Object obj) {
throw new RuntimeException("equals shouldn't be called")
}
}

@Issue("GRAILS-11361")
void "JSON converter should not use encoding state"() {
given:
def buffer=new StreamCharBuffer()
buffer.writer.write('"Hello world"')
def content=buffer.encodeAsRaw()
when:
def json = [content: content] as JSON
then:
json.toString() == '{"content":"\\"Hello world\\""}'
}

void "output should be safe at the end"() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1129,7 +1129,7 @@ static void writeQuoted(Writer writer, Object value) throws IOException {
javascriptEncoderStateless.encodeToWriter((CharSequence)value, writer);
}
else {
CodecPrintWriter codecWriter = new CodecPrintWriter(writer, javascriptEncoder, null);
CodecPrintWriter codecWriter = new CodecPrintWriter(writer, javascriptEncoder, null, true);
codecWriter.print(value);
codecWriter.flush();
}
Expand Down

0 comments on commit f9e2f74

Please sign in to comment.