1/**
2 *  Copyright 2014 Paul Querna
3 *
4 *  Licensed under the Apache License, Version 2.0 (the "License");
5 *  you may not use this file except in compliance with the License.
6 *  You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 *  Unless required by applicable law or agreed to in writing, software
11 *  distributed under the License is distributed on an "AS IS" BASIS,
12 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 *  See the License for the specific language governing permissions and
14 *  limitations under the License.
15 *
16 */
17
18/* Portions of this file are on Go stdlib's encoding/json/encode.go */
19// Copyright 2010 The Go Authors.  All rights reserved.
20// Use of this source code is governed by a BSD-style
21// license that can be found in the LICENSE file.
22
23package v1
24
25import (
26	"io"
27	"unicode/utf8"
28	"strconv"
29	"unicode/utf16"
30	"unicode"
31)
32
33const hex = "0123456789abcdef"
34
35type JsonStringWriter interface {
36	io.Writer
37	io.ByteWriter
38	stringWriter
39}
40
41func WriteJsonString(buf JsonStringWriter, s string) {
42	WriteJson(buf, []byte(s))
43}
44
45/**
46 * Function ported from encoding/json: func (e *encodeState) string(s string) (int, error)
47 */
48func WriteJson(buf JsonStringWriter, s []byte) {
49	buf.WriteByte('"')
50	start := 0
51	for i := 0; i < len(s); {
52		if b := s[i]; b < utf8.RuneSelf {
53			/*
54				if 0x20 <= b && b != '\\' && b != '"' && b != '<' && b != '>' && b != '&' {
55					i++
56					continue
57				}
58			*/
59			if lt[b] == true {
60				i++
61				continue
62			}
63
64			if start < i {
65				buf.Write(s[start:i])
66			}
67			switch b {
68			case '\\', '"':
69				buf.WriteByte('\\')
70				buf.WriteByte(b)
71			case '\n':
72				buf.WriteByte('\\')
73				buf.WriteByte('n')
74			case '\r':
75				buf.WriteByte('\\')
76				buf.WriteByte('r')
77			default:
78				// This encodes bytes < 0x20 except for \n and \r,
79				// as well as < and >. The latter are escaped because they
80				// can lead to security holes when user-controlled strings
81				// are rendered into JSON and served to some browsers.
82				buf.WriteString(`\u00`)
83				buf.WriteByte(hex[b>>4])
84				buf.WriteByte(hex[b&0xF])
85			}
86			i++
87			start = i
88			continue
89		}
90		c, size := utf8.DecodeRune(s[i:])
91		if c == utf8.RuneError && size == 1 {
92			if start < i {
93				buf.Write(s[start:i])
94			}
95			buf.WriteString(`\ufffd`)
96			i += size
97			start = i
98			continue
99		}
100		// U+2028 is LINE SEPARATOR.
101		// U+2029 is PARAGRAPH SEPARATOR.
102		// They are both technically valid characters in JSON strings,
103		// but don't work in JSONP, which has to be evaluated as JavaScript,
104		// and can lead to security holes there. It is valid JSON to
105		// escape them, so we do so unconditionally.
106		// See http://timelessrepo.com/json-isnt-a-javascript-subset for discussion.
107		if c == '\u2028' || c == '\u2029' {
108			if start < i {
109				buf.Write(s[start:i])
110			}
111			buf.WriteString(`\u202`)
112			buf.WriteByte(hex[c&0xF])
113			i += size
114			start = i
115			continue
116		}
117		i += size
118	}
119	if start < len(s) {
120		buf.Write(s[start:])
121	}
122	buf.WriteByte('"')
123}
124
125// UnquoteBytes will decode []byte containing json string to go string
126// ported from encoding/json/decode.go
127func UnquoteBytes(s []byte) (t []byte, ok bool) {
128	if len(s) < 2 || s[0] != '"' || s[len(s)-1] != '"' {
129		return
130	}
131	s = s[1 : len(s)-1]
132
133	// Check for unusual characters. If there are none,
134	// then no unquoting is needed, so return a slice of the
135	// original bytes.
136	r := 0
137	for r < len(s) {
138		c := s[r]
139		if c == '\\' || c == '"' || c < ' ' {
140			break
141		}
142		if c < utf8.RuneSelf {
143			r++
144			continue
145		}
146		rr, size := utf8.DecodeRune(s[r:])
147		if rr == utf8.RuneError && size == 1 {
148			break
149		}
150		r += size
151	}
152	if r == len(s) {
153		return s, true
154	}
155
156	b := make([]byte, len(s)+2*utf8.UTFMax)
157	w := copy(b, s[0:r])
158	for r < len(s) {
159		// Out of room?  Can only happen if s is full of
160		// malformed UTF-8 and we're replacing each
161		// byte with RuneError.
162		if w >= len(b)-2*utf8.UTFMax {
163			nb := make([]byte, (len(b)+utf8.UTFMax)*2)
164			copy(nb, b[0:w])
165			b = nb
166		}
167		switch c := s[r]; {
168		case c == '\\':
169			r++
170			if r >= len(s) {
171				return
172			}
173			switch s[r] {
174			default:
175				return
176			case '"', '\\', '/', '\'':
177				b[w] = s[r]
178				r++
179				w++
180			case 'b':
181				b[w] = '\b'
182				r++
183				w++
184			case 'f':
185				b[w] = '\f'
186				r++
187				w++
188			case 'n':
189				b[w] = '\n'
190				r++
191				w++
192			case 'r':
193				b[w] = '\r'
194				r++
195				w++
196			case 't':
197				b[w] = '\t'
198				r++
199				w++
200			case 'u':
201				r--
202				rr := getu4(s[r:])
203				if rr < 0 {
204					return
205				}
206				r += 6
207				if utf16.IsSurrogate(rr) {
208					rr1 := getu4(s[r:])
209					if dec := utf16.DecodeRune(rr, rr1); dec != unicode.ReplacementChar {
210						// A valid pair; consume.
211						r += 6
212						w += utf8.EncodeRune(b[w:], dec)
213						break
214					}
215					// Invalid surrogate; fall back to replacement rune.
216					rr = unicode.ReplacementChar
217				}
218				w += utf8.EncodeRune(b[w:], rr)
219			}
220
221		// Quote, control characters are invalid.
222		case c == '"', c < ' ':
223			return
224
225		// ASCII
226		case c < utf8.RuneSelf:
227			b[w] = c
228			r++
229			w++
230
231		// Coerce to well-formed UTF-8.
232		default:
233			rr, size := utf8.DecodeRune(s[r:])
234			r += size
235			w += utf8.EncodeRune(b[w:], rr)
236		}
237	}
238	return b[0:w], true
239}
240
241// getu4 decodes \uXXXX from the beginning of s, returning the hex value,
242// or it returns -1.
243func getu4(s []byte) rune {
244	if len(s) < 6 || s[0] != '\\' || s[1] != 'u' {
245		return -1
246	}
247	r, err := strconv.ParseUint(string(s[2:6]), 16, 64)
248	if err != nil {
249		return -1
250	}
251	return rune(r)
252}
253
254// TODO(pquerna): consider combining wibth the normal byte mask.
255var lt [256]bool = [256]bool{
256	false, /* 0 */
257	false, /* 1 */
258	false, /* 2 */
259	false, /* 3 */
260	false, /* 4 */
261	false, /* 5 */
262	false, /* 6 */
263	false, /* 7 */
264	false, /* 8 */
265	false, /* 9 */
266	false, /* 10 */
267	false, /* 11 */
268	false, /* 12 */
269	false, /* 13 */
270	false, /* 14 */
271	false, /* 15 */
272	false, /* 16 */
273	false, /* 17 */
274	false, /* 18 */
275	false, /* 19 */
276	false, /* 20 */
277	false, /* 21 */
278	false, /* 22 */
279	false, /* 23 */
280	false, /* 24 */
281	false, /* 25 */
282	false, /* 26 */
283	false, /* 27 */
284	false, /* 28 */
285	false, /* 29 */
286	false, /* 30 */
287	false, /* 31 */
288	true,  /* 32 */
289	true,  /* 33 */
290	false, /* 34 */
291	true,  /* 35 */
292	true,  /* 36 */
293	true,  /* 37 */
294	false, /* 38 */
295	true,  /* 39 */
296	true,  /* 40 */
297	true,  /* 41 */
298	true,  /* 42 */
299	true,  /* 43 */
300	true,  /* 44 */
301	true,  /* 45 */
302	true,  /* 46 */
303	true,  /* 47 */
304	true,  /* 48 */
305	true,  /* 49 */
306	true,  /* 50 */
307	true,  /* 51 */
308	true,  /* 52 */
309	true,  /* 53 */
310	true,  /* 54 */
311	true,  /* 55 */
312	true,  /* 56 */
313	true,  /* 57 */
314	true,  /* 58 */
315	true,  /* 59 */
316	false, /* 60 */
317	true,  /* 61 */
318	false, /* 62 */
319	true,  /* 63 */
320	true,  /* 64 */
321	true,  /* 65 */
322	true,  /* 66 */
323	true,  /* 67 */
324	true,  /* 68 */
325	true,  /* 69 */
326	true,  /* 70 */
327	true,  /* 71 */
328	true,  /* 72 */
329	true,  /* 73 */
330	true,  /* 74 */
331	true,  /* 75 */
332	true,  /* 76 */
333	true,  /* 77 */
334	true,  /* 78 */
335	true,  /* 79 */
336	true,  /* 80 */
337	true,  /* 81 */
338	true,  /* 82 */
339	true,  /* 83 */
340	true,  /* 84 */
341	true,  /* 85 */
342	true,  /* 86 */
343	true,  /* 87 */
344	true,  /* 88 */
345	true,  /* 89 */
346	true,  /* 90 */
347	true,  /* 91 */
348	false, /* 92 */
349	true,  /* 93 */
350	true,  /* 94 */
351	true,  /* 95 */
352	true,  /* 96 */
353	true,  /* 97 */
354	true,  /* 98 */
355	true,  /* 99 */
356	true,  /* 100 */
357	true,  /* 101 */
358	true,  /* 102 */
359	true,  /* 103 */
360	true,  /* 104 */
361	true,  /* 105 */
362	true,  /* 106 */
363	true,  /* 107 */
364	true,  /* 108 */
365	true,  /* 109 */
366	true,  /* 110 */
367	true,  /* 111 */
368	true,  /* 112 */
369	true,  /* 113 */
370	true,  /* 114 */
371	true,  /* 115 */
372	true,  /* 116 */
373	true,  /* 117 */
374	true,  /* 118 */
375	true,  /* 119 */
376	true,  /* 120 */
377	true,  /* 121 */
378	true,  /* 122 */
379	true,  /* 123 */
380	true,  /* 124 */
381	true,  /* 125 */
382	true,  /* 126 */
383	true,  /* 127 */
384	true,  /* 128 */
385	true,  /* 129 */
386	true,  /* 130 */
387	true,  /* 131 */
388	true,  /* 132 */
389	true,  /* 133 */
390	true,  /* 134 */
391	true,  /* 135 */
392	true,  /* 136 */
393	true,  /* 137 */
394	true,  /* 138 */
395	true,  /* 139 */
396	true,  /* 140 */
397	true,  /* 141 */
398	true,  /* 142 */
399	true,  /* 143 */
400	true,  /* 144 */
401	true,  /* 145 */
402	true,  /* 146 */
403	true,  /* 147 */
404	true,  /* 148 */
405	true,  /* 149 */
406	true,  /* 150 */
407	true,  /* 151 */
408	true,  /* 152 */
409	true,  /* 153 */
410	true,  /* 154 */
411	true,  /* 155 */
412	true,  /* 156 */
413	true,  /* 157 */
414	true,  /* 158 */
415	true,  /* 159 */
416	true,  /* 160 */
417	true,  /* 161 */
418	true,  /* 162 */
419	true,  /* 163 */
420	true,  /* 164 */
421	true,  /* 165 */
422	true,  /* 166 */
423	true,  /* 167 */
424	true,  /* 168 */
425	true,  /* 169 */
426	true,  /* 170 */
427	true,  /* 171 */
428	true,  /* 172 */
429	true,  /* 173 */
430	true,  /* 174 */
431	true,  /* 175 */
432	true,  /* 176 */
433	true,  /* 177 */
434	true,  /* 178 */
435	true,  /* 179 */
436	true,  /* 180 */
437	true,  /* 181 */
438	true,  /* 182 */
439	true,  /* 183 */
440	true,  /* 184 */
441	true,  /* 185 */
442	true,  /* 186 */
443	true,  /* 187 */
444	true,  /* 188 */
445	true,  /* 189 */
446	true,  /* 190 */
447	true,  /* 191 */
448	true,  /* 192 */
449	true,  /* 193 */
450	true,  /* 194 */
451	true,  /* 195 */
452	true,  /* 196 */
453	true,  /* 197 */
454	true,  /* 198 */
455	true,  /* 199 */
456	true,  /* 200 */
457	true,  /* 201 */
458	true,  /* 202 */
459	true,  /* 203 */
460	true,  /* 204 */
461	true,  /* 205 */
462	true,  /* 206 */
463	true,  /* 207 */
464	true,  /* 208 */
465	true,  /* 209 */
466	true,  /* 210 */
467	true,  /* 211 */
468	true,  /* 212 */
469	true,  /* 213 */
470	true,  /* 214 */
471	true,  /* 215 */
472	true,  /* 216 */
473	true,  /* 217 */
474	true,  /* 218 */
475	true,  /* 219 */
476	true,  /* 220 */
477	true,  /* 221 */
478	true,  /* 222 */
479	true,  /* 223 */
480	true,  /* 224 */
481	true,  /* 225 */
482	true,  /* 226 */
483	true,  /* 227 */
484	true,  /* 228 */
485	true,  /* 229 */
486	true,  /* 230 */
487	true,  /* 231 */
488	true,  /* 232 */
489	true,  /* 233 */
490	true,  /* 234 */
491	true,  /* 235 */
492	true,  /* 236 */
493	true,  /* 237 */
494	true,  /* 238 */
495	true,  /* 239 */
496	true,  /* 240 */
497	true,  /* 241 */
498	true,  /* 242 */
499	true,  /* 243 */
500	true,  /* 244 */
501	true,  /* 245 */
502	true,  /* 246 */
503	true,  /* 247 */
504	true,  /* 248 */
505	true,  /* 249 */
506	true,  /* 250 */
507	true,  /* 251 */
508	true,  /* 252 */
509	true,  /* 253 */
510	true,  /* 254 */
511	true,  /* 255 */
512}
513