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