jsonstring.go 9.8 KB

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