@@ -235,15 +235,36 @@ func (stream *Stream) WriteStringWithHTMLEscaped(s string) {
235235		stream .buf  =  append (stream .buf , '"' )
236236		return 
237237	}
238- 	writeStringSlowPathWithHTMLEscaped (stream , i , s , valLen )
238+ 	writeStringSlowPath (stream , i , s , valLen ,  true )
239239}
240240
241- func  writeStringSlowPathWithHTMLEscaped (stream  * Stream , i  int , s  string , valLen  int ) {
241+ // WriteString write string to stream without html escape 
242+ func  (stream  * Stream ) WriteString (s  string ) {
243+ 	valLen  :=  len (s )
244+ 	stream .buf  =  append (stream .buf , '"' )
245+ 	// write string, the fast path, without utf8 and escape support 
246+ 	i  :=  0 
247+ 	for  ; i  <  valLen ; i ++  {
248+ 		c  :=  s [i ]
249+ 		if  c  <  utf8 .RuneSelf  &&  safeSet [c ] {
250+ 			stream .buf  =  append (stream .buf , c )
251+ 		} else  {
252+ 			break 
253+ 		}
254+ 	}
255+ 	if  i  ==  valLen  {
256+ 		stream .buf  =  append (stream .buf , '"' )
257+ 		return 
258+ 	}
259+ 	writeStringSlowPath (stream , i , s , valLen , false )
260+ }
261+ 
262+ func  writeStringSlowPath (stream  * Stream , i  int , s  string , valLen  int , escapeHTML  bool ) {
242263	start  :=  i 
243264	// for the remaining parts, we process them char by char 
244265	for  i  <  valLen  {
245266		if  b  :=  s [i ]; b  <  utf8 .RuneSelf  {
246- 			if  htmlSafeSet [b ] {
267+ 			if  htmlSafeSet [b ] ||  ( ! escapeHTML   &&   safeSet [ b ])  {
247268				i ++ 
248269				continue 
249270			}
@@ -306,67 +327,3 @@ func writeStringSlowPathWithHTMLEscaped(stream *Stream, i int, s string, valLen
306327	}
307328	stream .writeByte ('"' )
308329}
309- 
310- // WriteString write string to stream without html escape 
311- func  (stream  * Stream ) WriteString (s  string ) {
312- 	valLen  :=  len (s )
313- 	stream .buf  =  append (stream .buf , '"' )
314- 	// write string, the fast path, without utf8 and escape support 
315- 	i  :=  0 
316- 	for  ; i  <  valLen ; i ++  {
317- 		c  :=  s [i ]
318- 		if  c  <  utf8 .RuneSelf  &&  safeSet [c ] {
319- 			stream .buf  =  append (stream .buf , c )
320- 		} else  {
321- 			break 
322- 		}
323- 	}
324- 	if  i  ==  valLen  {
325- 		stream .buf  =  append (stream .buf , '"' )
326- 		return 
327- 	}
328- 	writeStringSlowPath (stream , i , s , valLen )
329- }
330- 
331- func  writeStringSlowPath (stream  * Stream , i  int , s  string , valLen  int ) {
332- 	start  :=  i 
333- 	// for the remaining parts, we process them char by char 
334- 	for  i  <  valLen  {
335- 		if  b  :=  s [i ]; b  <  utf8 .RuneSelf  {
336- 			if  safeSet [b ] {
337- 				i ++ 
338- 				continue 
339- 			}
340- 			if  start  <  i  {
341- 				stream .WriteRaw (s [start :i ])
342- 			}
343- 			switch  b  {
344- 			case  '\\' , '"' :
345- 				stream .writeTwoBytes ('\\' , b )
346- 			case  '\n' :
347- 				stream .writeTwoBytes ('\\' , 'n' )
348- 			case  '\r' :
349- 				stream .writeTwoBytes ('\\' , 'r' )
350- 			case  '\t' :
351- 				stream .writeTwoBytes ('\\' , 't' )
352- 			default :
353- 				// This encodes bytes < 0x20 except for \t, \n and \r. 
354- 				// If escapeHTML is set, it also escapes <, >, and & 
355- 				// because they can lead to security holes when 
356- 				// user-controlled strings are rendered into JSON 
357- 				// and served to some browsers. 
358- 				stream .WriteRaw (`\u00` )
359- 				stream .writeTwoBytes (hex [b >> 4 ], hex [b & 0xF ])
360- 			}
361- 			i ++ 
362- 			start  =  i 
363- 			continue 
364- 		}
365- 		i ++ 
366- 		continue 
367- 	}
368- 	if  start  <  len (s ) {
369- 		stream .WriteRaw (s [start :])
370- 	}
371- 	stream .writeByte ('"' )
372- }
0 commit comments