forked from rainycape/gondola
-
Notifications
You must be signed in to change notification settings - Fork 0
/
funcs.go
96 lines (95 loc) · 2.17 KB
/
funcs.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package json
const buffer_go = `var (
jsonBuffers = make(chan *bytes.Buffer, jsonBufferCount)
)
func jsonGetBuffer() *bytes.Buffer {
var buf *bytes.Buffer
select {
case buf = <-jsonBuffers:
buf.Reset()
default:
buf = new(bytes.Buffer)
buf.Grow(jsonBufSize)
}
return buf
}
func jsonPutBuffer(buf *bytes.Buffer) {
if buf.Len() <= jsonMaxBufSize {
select {
case jsonBuffers <- buf:
default:
}
}
}
`
const encode_go = `const jsonHex = "0123456789abcdef"
func jsonEncodeString(e *bytes.Buffer, s string) {
e.WriteByte('"')
start := 0
for i := 0; i < len(s); {
if b := s[i]; b < utf8.RuneSelf {
if 0x20 <= b && b != '\\' && b != '"' && b != '<' && b != '>' && b != '&' {
i++
continue
}
if start < i {
e.WriteString(s[start:i])
}
switch b {
case '\\', '"':
e.WriteByte('\\')
e.WriteByte(b)
case '\n':
e.WriteByte('\\')
e.WriteByte('n')
case '\r':
e.WriteByte('\\')
e.WriteByte('r')
default:
// This encodes bytes < 0x20 except for \n and \r,
// as well as < and >. The latter are escaped because they
// can lead to security holes when user-controlled strings
// are rendered into JSON and served to some browsers.
e.WriteString("\\u00")
e.WriteByte(jsonHex[b>>4])
e.WriteByte(jsonHex[b&0xF])
}
i++
start = i
continue
}
c, size := utf8.DecodeRuneInString(s[i:])
if c == utf8.RuneError && size == 1 {
if start < i {
e.WriteString(s[start:i])
}
e.WriteString("\\ufffd")
i += size
start = i
continue
}
// U+2028 is LINE SEPARATOR.
// U+2029 is PARAGRAPH SEPARATOR.
// They are both technically valid characters in JSON strings,
// but don't work in JSONP, which has to be evaluated as JavaScript,
// and can lead to security holes there. It is valid JSON to
// escape them, so we do so unconditionally.
// See http://timelessrepo.com/json-isnt-a-javascript-subset for discussion.
if c == '\u2028' || c == '\u2029' {
if start < i {
e.WriteString(s[start:i])
}
e.WriteString("\\u202")
e.WriteByte(jsonHex[c&0xF])
i += size
start = i
continue
}
i += size
}
if start < len(s) {
e.WriteString(s[start:])
}
e.WriteByte('"')
}
`