ai 1.1.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (340) hide show
  1. package/LICENSE +10 -24
  2. package/dist/ai-stream.d.ts +18 -0
  3. package/dist/ai-stream.js +132 -0
  4. package/dist/ai-stream.mjs +13 -0
  5. package/dist/anthropic-stream.d.ts +5 -0
  6. package/dist/anthropic-stream.js +133 -0
  7. package/dist/anthropic-stream.mjs +8 -0
  8. package/dist/chunk-265FSSO4.mjs +91 -0
  9. package/dist/chunk-2L3ZO4UM.mjs +45 -0
  10. package/dist/chunk-GT4HKF2X.mjs +33 -0
  11. package/dist/chunk-JGDC3BXD.mjs +22 -0
  12. package/dist/chunk-NK2CVBLI.mjs +38 -0
  13. package/dist/chunk-PEYAHBDF.mjs +43 -0
  14. package/dist/chunk-TJMME6CL.mjs +24 -0
  15. package/dist/huggingface-stream.d.ts +5 -0
  16. package/dist/huggingface-stream.js +121 -0
  17. package/dist/huggingface-stream.mjs +8 -0
  18. package/dist/index.d.ts +131 -0
  19. package/dist/index.js +278 -0
  20. package/dist/index.mjs +35 -0
  21. package/dist/index.test.d.ts +2 -0
  22. package/dist/index.test.js +12 -0
  23. package/dist/index.test.mjs +10 -0
  24. package/dist/langchain-stream.d.ts +12 -0
  25. package/dist/langchain-stream.js +102 -0
  26. package/dist/langchain-stream.mjs +8 -0
  27. package/dist/openai-stream.d.ts +5 -0
  28. package/dist/openai-stream.js +144 -0
  29. package/dist/openai-stream.mjs +8 -0
  30. package/dist/streaming-text-response.d.ts +17 -0
  31. package/dist/streaming-text-response.js +75 -0
  32. package/dist/streaming-text-response.mjs +9 -0
  33. package/package.json +78 -29
  34. package/react/dist/chunk-5PP6W52J.mjs +202 -0
  35. package/react/dist/chunk-6EH3SWMP.mjs +55 -0
  36. package/react/dist/chunk-PW6HSU2N.mjs +154 -0
  37. package/react/dist/index.d.ts +3 -0
  38. package/react/dist/index.js +424 -0
  39. package/react/dist/index.mjs +12 -0
  40. package/react/dist/types-f862f74a.d.ts +123 -0
  41. package/react/dist/use-chat.d.ts +42 -0
  42. package/react/dist/use-chat.js +276 -0
  43. package/react/dist/use-chat.mjs +8 -0
  44. package/react/dist/use-completion.d.ts +47 -0
  45. package/react/dist/use-completion.js +229 -0
  46. package/react/dist/use-completion.mjs +8 -0
  47. package/svelte/dist/chunk-6USBQIV6.mjs +177 -0
  48. package/svelte/dist/chunk-BQ64GHZ3.mjs +136 -0
  49. package/svelte/dist/chunk-CENOSGDG.mjs +493 -0
  50. package/svelte/dist/index.d.ts +4 -0
  51. package/svelte/dist/index.js +808 -0
  52. package/svelte/dist/index.mjs +11 -0
  53. package/svelte/dist/types-f862f74a.d.ts +123 -0
  54. package/svelte/dist/use-chat.d.ts +39 -0
  55. package/svelte/dist/use-chat.js +680 -0
  56. package/svelte/dist/use-chat.mjs +7 -0
  57. package/svelte/dist/use-completion.d.ts +38 -0
  58. package/svelte/dist/use-completion.js +640 -0
  59. package/svelte/dist/use-completion.mjs +7 -0
  60. package/.npmignore +0 -15
  61. package/.travis.yml +0 -4
  62. package/README.md +0 -21
  63. package/bin/ai.js +0 -22
  64. package/index.js +0 -37
  65. package/node_modules/request/.npmignore +0 -2
  66. package/node_modules/request/.travis.yml +0 -12
  67. package/node_modules/request/CHANGELOG.md +0 -954
  68. package/node_modules/request/LICENSE +0 -55
  69. package/node_modules/request/README.md +0 -421
  70. package/node_modules/request/index.js +0 -166
  71. package/node_modules/request/lib/cookies.js +0 -40
  72. package/node_modules/request/lib/copy.js +0 -8
  73. package/node_modules/request/lib/debug.js +0 -7
  74. package/node_modules/request/lib/getSafe.js +0 -34
  75. package/node_modules/request/lib/optional.js +0 -5
  76. package/node_modules/request/node_modules/aws-sign2/LICENSE +0 -55
  77. package/node_modules/request/node_modules/aws-sign2/README.md +0 -4
  78. package/node_modules/request/node_modules/aws-sign2/index.js +0 -202
  79. package/node_modules/request/node_modules/aws-sign2/package.json +0 -47
  80. package/node_modules/request/node_modules/forever-agent/LICENSE +0 -55
  81. package/node_modules/request/node_modules/forever-agent/README.md +0 -4
  82. package/node_modules/request/node_modules/forever-agent/index.js +0 -119
  83. package/node_modules/request/node_modules/forever-agent/package.json +0 -46
  84. package/node_modules/request/node_modules/form-data/License +0 -19
  85. package/node_modules/request/node_modules/form-data/Readme.md +0 -175
  86. package/node_modules/request/node_modules/form-data/lib/form_data.js +0 -351
  87. package/node_modules/request/node_modules/form-data/node_modules/async/.travis.yml +0 -3
  88. package/node_modules/request/node_modules/form-data/node_modules/async/LICENSE +0 -19
  89. package/node_modules/request/node_modules/form-data/node_modules/async/README.md +0 -1646
  90. package/node_modules/request/node_modules/form-data/node_modules/async/component.json +0 -11
  91. package/node_modules/request/node_modules/form-data/node_modules/async/lib/async.js +0 -1123
  92. package/node_modules/request/node_modules/form-data/node_modules/async/package.json +0 -60
  93. package/node_modules/request/node_modules/form-data/node_modules/combined-stream/License +0 -19
  94. package/node_modules/request/node_modules/form-data/node_modules/combined-stream/Readme.md +0 -132
  95. package/node_modules/request/node_modules/form-data/node_modules/combined-stream/lib/combined_stream.js +0 -186
  96. package/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/.npmignore +0 -2
  97. package/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/License +0 -19
  98. package/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Makefile +0 -7
  99. package/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Readme.md +0 -154
  100. package/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js +0 -99
  101. package/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/package.json +0 -42
  102. package/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/common.js +0 -6
  103. package/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-http-upload.js +0 -38
  104. package/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-auto-pause.js +0 -21
  105. package/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream-pause.js +0 -14
  106. package/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream.js +0 -48
  107. package/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-handle-source-errors.js +0 -15
  108. package/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-max-data-size.js +0 -18
  109. package/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-pipe-resumes.js +0 -13
  110. package/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-proxy-readable.js +0 -13
  111. package/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/run.js +0 -7
  112. package/node_modules/request/node_modules/form-data/node_modules/combined-stream/package.json +0 -61
  113. package/node_modules/request/node_modules/form-data/node_modules/mime/LICENSE +0 -19
  114. package/node_modules/request/node_modules/form-data/node_modules/mime/README.md +0 -66
  115. package/node_modules/request/node_modules/form-data/node_modules/mime/mime.js +0 -114
  116. package/node_modules/request/node_modules/form-data/node_modules/mime/package.json +0 -59
  117. package/node_modules/request/node_modules/form-data/node_modules/mime/test.js +0 -84
  118. package/node_modules/request/node_modules/form-data/node_modules/mime/types/mime.types +0 -1588
  119. package/node_modules/request/node_modules/form-data/node_modules/mime/types/node.types +0 -77
  120. package/node_modules/request/node_modules/form-data/package.json +0 -80
  121. package/node_modules/request/node_modules/hawk/.npmignore +0 -18
  122. package/node_modules/request/node_modules/hawk/.travis.yml +0 -5
  123. package/node_modules/request/node_modules/hawk/LICENSE +0 -24
  124. package/node_modules/request/node_modules/hawk/Makefile +0 -10
  125. package/node_modules/request/node_modules/hawk/README.md +0 -625
  126. package/node_modules/request/node_modules/hawk/example/usage.js +0 -78
  127. package/node_modules/request/node_modules/hawk/images/hawk.png +0 -0
  128. package/node_modules/request/node_modules/hawk/images/logo.png +0 -0
  129. package/node_modules/request/node_modules/hawk/index.js +0 -1
  130. package/node_modules/request/node_modules/hawk/lib/browser.js +0 -507
  131. package/node_modules/request/node_modules/hawk/lib/client.js +0 -371
  132. package/node_modules/request/node_modules/hawk/lib/crypto.js +0 -118
  133. package/node_modules/request/node_modules/hawk/lib/index.js +0 -15
  134. package/node_modules/request/node_modules/hawk/lib/server.js +0 -523
  135. package/node_modules/request/node_modules/hawk/lib/utils.js +0 -183
  136. package/node_modules/request/node_modules/hawk/node_modules/boom/.npmignore +0 -18
  137. package/node_modules/request/node_modules/hawk/node_modules/boom/.travis.yml +0 -5
  138. package/node_modules/request/node_modules/hawk/node_modules/boom/LICENSE +0 -24
  139. package/node_modules/request/node_modules/hawk/node_modules/boom/Makefile +0 -11
  140. package/node_modules/request/node_modules/hawk/node_modules/boom/README.md +0 -6
  141. package/node_modules/request/node_modules/hawk/node_modules/boom/images/boom.png +0 -0
  142. package/node_modules/request/node_modules/hawk/node_modules/boom/index.js +0 -1
  143. package/node_modules/request/node_modules/hawk/node_modules/boom/lib/index.js +0 -207
  144. package/node_modules/request/node_modules/hawk/node_modules/boom/package.json +0 -64
  145. package/node_modules/request/node_modules/hawk/node_modules/boom/test/index.js +0 -245
  146. package/node_modules/request/node_modules/hawk/node_modules/cryptiles/.npmignore +0 -18
  147. package/node_modules/request/node_modules/hawk/node_modules/cryptiles/.travis.yml +0 -5
  148. package/node_modules/request/node_modules/hawk/node_modules/cryptiles/LICENSE +0 -24
  149. package/node_modules/request/node_modules/hawk/node_modules/cryptiles/Makefile +0 -11
  150. package/node_modules/request/node_modules/hawk/node_modules/cryptiles/README.md +0 -6
  151. package/node_modules/request/node_modules/hawk/node_modules/cryptiles/index.js +0 -1
  152. package/node_modules/request/node_modules/hawk/node_modules/cryptiles/lib/index.js +0 -68
  153. package/node_modules/request/node_modules/hawk/node_modules/cryptiles/package.json +0 -65
  154. package/node_modules/request/node_modules/hawk/node_modules/cryptiles/test/index.js +0 -101
  155. package/node_modules/request/node_modules/hawk/node_modules/hoek/.npmignore +0 -18
  156. package/node_modules/request/node_modules/hawk/node_modules/hoek/.travis.yml +0 -5
  157. package/node_modules/request/node_modules/hawk/node_modules/hoek/LICENSE +0 -33
  158. package/node_modules/request/node_modules/hawk/node_modules/hoek/Makefile +0 -10
  159. package/node_modules/request/node_modules/hawk/node_modules/hoek/README.md +0 -436
  160. package/node_modules/request/node_modules/hawk/node_modules/hoek/images/hoek.png +0 -0
  161. package/node_modules/request/node_modules/hawk/node_modules/hoek/index.js +0 -1
  162. package/node_modules/request/node_modules/hawk/node_modules/hoek/lib/escape.js +0 -132
  163. package/node_modules/request/node_modules/hawk/node_modules/hoek/lib/index.js +0 -585
  164. package/node_modules/request/node_modules/hawk/node_modules/hoek/package.json +0 -70
  165. package/node_modules/request/node_modules/hawk/node_modules/hoek/test/escaper.js +0 -86
  166. package/node_modules/request/node_modules/hawk/node_modules/hoek/test/index.js +0 -1078
  167. package/node_modules/request/node_modules/hawk/node_modules/hoek/test/modules/test1.js +0 -1
  168. package/node_modules/request/node_modules/hawk/node_modules/hoek/test/modules/test2.js +0 -1
  169. package/node_modules/request/node_modules/hawk/node_modules/hoek/test/modules/test3.js +0 -1
  170. package/node_modules/request/node_modules/hawk/node_modules/sntp/.npmignore +0 -18
  171. package/node_modules/request/node_modules/hawk/node_modules/sntp/.travis.yml +0 -5
  172. package/node_modules/request/node_modules/hawk/node_modules/sntp/LICENSE +0 -24
  173. package/node_modules/request/node_modules/hawk/node_modules/sntp/Makefile +0 -11
  174. package/node_modules/request/node_modules/hawk/node_modules/sntp/README.md +0 -68
  175. package/node_modules/request/node_modules/hawk/node_modules/sntp/examples/offset.js +0 -16
  176. package/node_modules/request/node_modules/hawk/node_modules/sntp/examples/time.js +0 -25
  177. package/node_modules/request/node_modules/hawk/node_modules/sntp/index.js +0 -1
  178. package/node_modules/request/node_modules/hawk/node_modules/sntp/lib/index.js +0 -409
  179. package/node_modules/request/node_modules/hawk/node_modules/sntp/package.json +0 -65
  180. package/node_modules/request/node_modules/hawk/node_modules/sntp/test/index.js +0 -359
  181. package/node_modules/request/node_modules/hawk/package.json +0 -70
  182. package/node_modules/request/node_modules/hawk/test/browser.js +0 -817
  183. package/node_modules/request/node_modules/hawk/test/client.js +0 -206
  184. package/node_modules/request/node_modules/hawk/test/crypto.js +0 -86
  185. package/node_modules/request/node_modules/hawk/test/index.js +0 -316
  186. package/node_modules/request/node_modules/hawk/test/message.js +0 -246
  187. package/node_modules/request/node_modules/hawk/test/readme.js +0 -98
  188. package/node_modules/request/node_modules/hawk/test/server.js +0 -686
  189. package/node_modules/request/node_modules/hawk/test/uri.js +0 -456
  190. package/node_modules/request/node_modules/hawk/test/utils.js +0 -120
  191. package/node_modules/request/node_modules/http-signature/.dir-locals.el +0 -6
  192. package/node_modules/request/node_modules/http-signature/.npmignore +0 -7
  193. package/node_modules/request/node_modules/http-signature/LICENSE +0 -18
  194. package/node_modules/request/node_modules/http-signature/README.md +0 -75
  195. package/node_modules/request/node_modules/http-signature/http_signing.md +0 -296
  196. package/node_modules/request/node_modules/http-signature/lib/index.js +0 -25
  197. package/node_modules/request/node_modules/http-signature/lib/parser.js +0 -304
  198. package/node_modules/request/node_modules/http-signature/lib/signer.js +0 -179
  199. package/node_modules/request/node_modules/http-signature/lib/util.js +0 -249
  200. package/node_modules/request/node_modules/http-signature/lib/verify.js +0 -42
  201. package/node_modules/request/node_modules/http-signature/node_modules/asn1/.npmignore +0 -2
  202. package/node_modules/request/node_modules/http-signature/node_modules/asn1/LICENSE +0 -19
  203. package/node_modules/request/node_modules/http-signature/node_modules/asn1/README.md +0 -50
  204. package/node_modules/request/node_modules/http-signature/node_modules/asn1/lib/ber/errors.js +0 -13
  205. package/node_modules/request/node_modules/http-signature/node_modules/asn1/lib/ber/index.js +0 -27
  206. package/node_modules/request/node_modules/http-signature/node_modules/asn1/lib/ber/reader.js +0 -267
  207. package/node_modules/request/node_modules/http-signature/node_modules/asn1/lib/ber/types.js +0 -36
  208. package/node_modules/request/node_modules/http-signature/node_modules/asn1/lib/ber/writer.js +0 -317
  209. package/node_modules/request/node_modules/http-signature/node_modules/asn1/lib/index.js +0 -20
  210. package/node_modules/request/node_modules/http-signature/node_modules/asn1/package.json +0 -63
  211. package/node_modules/request/node_modules/http-signature/node_modules/asn1/tst/ber/reader.test.js +0 -172
  212. package/node_modules/request/node_modules/http-signature/node_modules/asn1/tst/ber/writer.test.js +0 -296
  213. package/node_modules/request/node_modules/http-signature/node_modules/assert-plus/README.md +0 -126
  214. package/node_modules/request/node_modules/http-signature/node_modules/assert-plus/assert.js +0 -196
  215. package/node_modules/request/node_modules/http-signature/node_modules/assert-plus/package.json +0 -38
  216. package/node_modules/request/node_modules/http-signature/node_modules/ctype/CHANGELOG +0 -71
  217. package/node_modules/request/node_modules/http-signature/node_modules/ctype/LICENSE +0 -24
  218. package/node_modules/request/node_modules/http-signature/node_modules/ctype/README +0 -82
  219. package/node_modules/request/node_modules/http-signature/node_modules/ctype/README.old +0 -298
  220. package/node_modules/request/node_modules/http-signature/node_modules/ctype/ctf.js +0 -245
  221. package/node_modules/request/node_modules/http-signature/node_modules/ctype/ctio.js +0 -1485
  222. package/node_modules/request/node_modules/http-signature/node_modules/ctype/ctype.js +0 -944
  223. package/node_modules/request/node_modules/http-signature/node_modules/ctype/man/man3ctype/ctio.3ctype +0 -241
  224. package/node_modules/request/node_modules/http-signature/node_modules/ctype/package.json +0 -36
  225. package/node_modules/request/node_modules/http-signature/node_modules/ctype/tools/jsl.conf +0 -129
  226. package/node_modules/request/node_modules/http-signature/node_modules/ctype/tools/jsstyle +0 -839
  227. package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/float.json +0 -13
  228. package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/int.json +0 -13
  229. package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/psinfo.json +0 -104
  230. package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/struct.json +0 -19
  231. package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/tst.fail.js +0 -39
  232. package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/tst.float.js +0 -14
  233. package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/tst.int.js +0 -14
  234. package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/tst.psinfo.js +0 -17
  235. package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/tst.struct.js +0 -18
  236. package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/tst.typedef.js +0 -15
  237. package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/typedef.json +0 -14
  238. package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/float/tst.rfloat.js +0 -767
  239. package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/float/tst.wfloat.js +0 -753
  240. package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/int/tst.64.js +0 -638
  241. package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/int/tst.rint.js +0 -101
  242. package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/int/tst.wbounds.js +0 -53
  243. package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/int/tst.wint.js +0 -92
  244. package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/uint/tst.64.js +0 -451
  245. package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/uint/tst.roundtrip.js +0 -81
  246. package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/uint/tst.ruint.js +0 -95
  247. package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/uint/tst.wuint.js +0 -156
  248. package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.basicr.js +0 -50
  249. package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.basicw.js +0 -44
  250. package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.char.js +0 -42
  251. package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.endian.js +0 -45
  252. package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.oldwrite.js +0 -28
  253. package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.readSize.js +0 -128
  254. package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.structw.js +0 -28
  255. package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.writeStruct.js +0 -31
  256. package/node_modules/request/node_modules/http-signature/package.json +0 -54
  257. package/node_modules/request/node_modules/json-stringify-safe/LICENSE +0 -27
  258. package/node_modules/request/node_modules/json-stringify-safe/README.md +0 -49
  259. package/node_modules/request/node_modules/json-stringify-safe/package.json +0 -51
  260. package/node_modules/request/node_modules/json-stringify-safe/stringify.js +0 -39
  261. package/node_modules/request/node_modules/json-stringify-safe/test.js +0 -128
  262. package/node_modules/request/node_modules/mime-types/.npmignore +0 -14
  263. package/node_modules/request/node_modules/mime-types/.travis.yml +0 -12
  264. package/node_modules/request/node_modules/mime-types/LICENSE +0 -22
  265. package/node_modules/request/node_modules/mime-types/Makefile +0 -9
  266. package/node_modules/request/node_modules/mime-types/README.md +0 -101
  267. package/node_modules/request/node_modules/mime-types/SOURCES.md +0 -17
  268. package/node_modules/request/node_modules/mime-types/component.json +0 -16
  269. package/node_modules/request/node_modules/mime-types/lib/custom.json +0 -27
  270. package/node_modules/request/node_modules/mime-types/lib/index.js +0 -75
  271. package/node_modules/request/node_modules/mime-types/lib/mime.json +0 -3317
  272. package/node_modules/request/node_modules/mime-types/lib/node.json +0 -55
  273. package/node_modules/request/node_modules/mime-types/package.json +0 -69
  274. package/node_modules/request/node_modules/node-uuid/.npmignore +0 -2
  275. package/node_modules/request/node_modules/node-uuid/LICENSE.md +0 -2
  276. package/node_modules/request/node_modules/node-uuid/README.md +0 -207
  277. package/node_modules/request/node_modules/node-uuid/benchmark/README.md +0 -53
  278. package/node_modules/request/node_modules/node-uuid/benchmark/bench.gnu +0 -174
  279. package/node_modules/request/node_modules/node-uuid/benchmark/bench.sh +0 -34
  280. package/node_modules/request/node_modules/node-uuid/benchmark/benchmark-native.c +0 -34
  281. package/node_modules/request/node_modules/node-uuid/benchmark/benchmark.js +0 -84
  282. package/node_modules/request/node_modules/node-uuid/component.json +0 -18
  283. package/node_modules/request/node_modules/node-uuid/package.json +0 -54
  284. package/node_modules/request/node_modules/node-uuid/test/compare_v1.js +0 -63
  285. package/node_modules/request/node_modules/node-uuid/test/test.html +0 -17
  286. package/node_modules/request/node_modules/node-uuid/test/test.js +0 -228
  287. package/node_modules/request/node_modules/node-uuid/uuid.js +0 -245
  288. package/node_modules/request/node_modules/oauth-sign/LICENSE +0 -55
  289. package/node_modules/request/node_modules/oauth-sign/README.md +0 -4
  290. package/node_modules/request/node_modules/oauth-sign/index.js +0 -43
  291. package/node_modules/request/node_modules/oauth-sign/package.json +0 -49
  292. package/node_modules/request/node_modules/oauth-sign/test.js +0 -49
  293. package/node_modules/request/node_modules/qs/.jshintignore +0 -1
  294. package/node_modules/request/node_modules/qs/.jshintrc +0 -10
  295. package/node_modules/request/node_modules/qs/.npmignore +0 -18
  296. package/node_modules/request/node_modules/qs/.travis.yml +0 -4
  297. package/node_modules/request/node_modules/qs/LICENSE +0 -28
  298. package/node_modules/request/node_modules/qs/Makefile +0 -8
  299. package/node_modules/request/node_modules/qs/Readme.md +0 -120
  300. package/node_modules/request/node_modules/qs/index.js +0 -1
  301. package/node_modules/request/node_modules/qs/lib/index.js +0 -15
  302. package/node_modules/request/node_modules/qs/lib/parse.js +0 -151
  303. package/node_modules/request/node_modules/qs/lib/stringify.js +0 -52
  304. package/node_modules/request/node_modules/qs/lib/utils.js +0 -131
  305. package/node_modules/request/node_modules/qs/package.json +0 -61
  306. package/node_modules/request/node_modules/qs/test/parse.js +0 -236
  307. package/node_modules/request/node_modules/qs/test/stringify.js +0 -123
  308. package/node_modules/request/node_modules/stringstream/.npmignore +0 -15
  309. package/node_modules/request/node_modules/stringstream/.travis.yml +0 -4
  310. package/node_modules/request/node_modules/stringstream/LICENSE.txt +0 -4
  311. package/node_modules/request/node_modules/stringstream/README.md +0 -38
  312. package/node_modules/request/node_modules/stringstream/example.js +0 -27
  313. package/node_modules/request/node_modules/stringstream/package.json +0 -48
  314. package/node_modules/request/node_modules/stringstream/stringstream.js +0 -102
  315. package/node_modules/request/node_modules/tough-cookie/.jshintrc +0 -70
  316. package/node_modules/request/node_modules/tough-cookie/.npmignore +0 -3
  317. package/node_modules/request/node_modules/tough-cookie/.travis.yml +0 -8
  318. package/node_modules/request/node_modules/tough-cookie/LICENSE +0 -78
  319. package/node_modules/request/node_modules/tough-cookie/README.md +0 -412
  320. package/node_modules/request/node_modules/tough-cookie/generate-pubsuffix.js +0 -239
  321. package/node_modules/request/node_modules/tough-cookie/lib/cookie.js +0 -1107
  322. package/node_modules/request/node_modules/tough-cookie/lib/memstore.js +0 -123
  323. package/node_modules/request/node_modules/tough-cookie/lib/pubsuffix.js +0 -69
  324. package/node_modules/request/node_modules/tough-cookie/lib/store.js +0 -37
  325. package/node_modules/request/node_modules/tough-cookie/node_modules/punycode/LICENSE-MIT.txt +0 -20
  326. package/node_modules/request/node_modules/tough-cookie/node_modules/punycode/README.md +0 -176
  327. package/node_modules/request/node_modules/tough-cookie/node_modules/punycode/package.json +0 -87
  328. package/node_modules/request/node_modules/tough-cookie/node_modules/punycode/punycode.js +0 -528
  329. package/node_modules/request/node_modules/tough-cookie/package.json +0 -67
  330. package/node_modules/request/node_modules/tough-cookie/public-suffix.txt +0 -5229
  331. package/node_modules/request/node_modules/tough-cookie/test.js +0 -1625
  332. package/node_modules/request/node_modules/tunnel-agent/.jshintrc +0 -5
  333. package/node_modules/request/node_modules/tunnel-agent/LICENSE +0 -55
  334. package/node_modules/request/node_modules/tunnel-agent/README.md +0 -4
  335. package/node_modules/request/node_modules/tunnel-agent/index.js +0 -236
  336. package/node_modules/request/node_modules/tunnel-agent/package.json +0 -46
  337. package/node_modules/request/package.json +0 -77
  338. package/node_modules/request/request.js +0 -1428
  339. package/test/fixtures/github-response.json +0 -1367
  340. package/test/index.js +0 -55
@@ -1,1428 +0,0 @@
1
- var optional = require('./lib/optional')
2
- , http = require('http')
3
- , https = optional('https')
4
- , tls = optional('tls')
5
- , url = require('url')
6
- , util = require('util')
7
- , stream = require('stream')
8
- , qs = require('qs')
9
- , querystring = require('querystring')
10
- , crypto = require('crypto')
11
- , zlib = require('zlib')
12
-
13
- , oauth = optional('oauth-sign')
14
- , hawk = optional('hawk')
15
- , aws = optional('aws-sign2')
16
- , httpSignature = optional('http-signature')
17
- , uuid = require('node-uuid')
18
- , mime = require('mime-types')
19
- , tunnel = optional('tunnel-agent')
20
- , _safeStringify = require('json-stringify-safe')
21
- , stringstream = optional('stringstream')
22
-
23
- , ForeverAgent = require('forever-agent')
24
- , FormData = optional('form-data')
25
-
26
- , cookies = require('./lib/cookies')
27
- , globalCookieJar = cookies.jar()
28
-
29
- , copy = require('./lib/copy')
30
- , debug = require('./lib/debug')
31
- , getSafe = require('./lib/getSafe')
32
- , net = require('net')
33
- ;
34
-
35
- function safeStringify (obj) {
36
- var ret
37
- try { ret = JSON.stringify(obj) }
38
- catch (e) { ret = _safeStringify(obj) }
39
- return ret
40
- }
41
-
42
- var globalPool = {}
43
- var isUrl = /^https?:|^unix:/
44
-
45
-
46
- // Hacky fix for pre-0.4.4 https
47
- if (https && !https.Agent) {
48
- https.Agent = function (options) {
49
- http.Agent.call(this, options)
50
- }
51
- util.inherits(https.Agent, http.Agent)
52
- https.Agent.prototype._getConnection = function (host, port, cb) {
53
- var s = tls.connect(port, host, this.options, function () {
54
- // do other checks here?
55
- if (cb) cb()
56
- })
57
- return s
58
- }
59
- }
60
-
61
- function isReadStream (rs) {
62
- return rs.readable && rs.path && rs.mode;
63
- }
64
-
65
- function toBase64 (str) {
66
- return (new Buffer(str || "", "ascii")).toString("base64")
67
- }
68
-
69
- function md5 (str) {
70
- return crypto.createHash('md5').update(str).digest('hex')
71
- }
72
-
73
- function Request (options) {
74
- stream.Stream.call(this)
75
- this.readable = true
76
- this.writable = true
77
-
78
- if (typeof options === 'string') {
79
- options = {uri:options}
80
- }
81
-
82
- var reserved = Object.keys(Request.prototype)
83
- for (var i in options) {
84
- if (reserved.indexOf(i) === -1) {
85
- this[i] = options[i]
86
- } else {
87
- if (typeof options[i] === 'function') {
88
- delete options[i]
89
- }
90
- }
91
- }
92
-
93
- if (options.method) {
94
- this.explicitMethod = true
95
- }
96
-
97
- this.canTunnel = options.tunnel !== false && tunnel;
98
-
99
- this.init(options)
100
- }
101
- util.inherits(Request, stream.Stream)
102
- Request.prototype.init = function (options) {
103
- // init() contains all the code to setup the request object.
104
- // the actual outgoing request is not started until start() is called
105
- // this function is called from both the constructor and on redirect.
106
- var self = this
107
- if (!options) options = {}
108
-
109
- if (!self.method) self.method = options.method || 'GET'
110
- self.localAddress = options.localAddress
111
-
112
- debug(options)
113
- if (!self.pool && self.pool !== false) self.pool = globalPool
114
- self.dests = self.dests || []
115
- self.__isRequestRequest = true
116
-
117
- // Protect against double callback
118
- if (!self._callback && self.callback) {
119
- self._callback = self.callback
120
- self.callback = function () {
121
- if (self._callbackCalled) return // Print a warning maybe?
122
- self._callbackCalled = true
123
- self._callback.apply(self, arguments)
124
- }
125
- self.on('error', self.callback.bind())
126
- self.on('complete', self.callback.bind(self, null))
127
- }
128
-
129
- if (self.url && !self.uri) {
130
- // People use this property instead all the time so why not just support it.
131
- self.uri = self.url
132
- delete self.url
133
- }
134
-
135
- if (!self.uri) {
136
- // this will throw if unhandled but is handleable when in a redirect
137
- return self.emit('error', new Error("options.uri is a required argument"))
138
- } else {
139
- if (typeof self.uri == "string") self.uri = url.parse(self.uri)
140
- }
141
-
142
- if (self.strictSSL === false) {
143
- self.rejectUnauthorized = false
144
- }
145
-
146
- if(!self.hasOwnProperty('proxy')) {
147
- // check for HTTP(S)_PROXY environment variables
148
- if(self.uri.protocol == "http:") {
149
- self.proxy = process.env.HTTP_PROXY || process.env.http_proxy || null;
150
- } else if(self.uri.protocol == "https:") {
151
- self.proxy = process.env.HTTPS_PROXY || process.env.https_proxy ||
152
- process.env.HTTP_PROXY || process.env.http_proxy || null;
153
- }
154
- }
155
-
156
- if (self.proxy) {
157
- if (typeof self.proxy == 'string') self.proxy = url.parse(self.proxy)
158
-
159
- // do the HTTP CONNECT dance using koichik/node-tunnel
160
- if (http.globalAgent && self.uri.protocol === "https:" && self.canTunnel) {
161
- var tunnelFn = self.proxy.protocol === "http:"
162
- ? tunnel.httpsOverHttp : tunnel.httpsOverHttps
163
-
164
- var tunnelOptions = { proxy: { host: self.proxy.hostname
165
- , port: +self.proxy.port
166
- , proxyAuth: self.proxy.auth
167
- , headers: { Host: self.uri.hostname + ':' +
168
- (self.uri.port || self.uri.protocol === 'https:' ? 443 : 80) }}
169
- , rejectUnauthorized: self.rejectUnauthorized
170
- , ca: this.ca
171
- , cert:this.cert
172
- , key: this.key}
173
-
174
- self.agent = tunnelFn(tunnelOptions)
175
- self.tunnel = true
176
- }
177
- }
178
-
179
- if (!self.uri.pathname) {self.uri.pathname = '/'}
180
-
181
- if (!self.uri.host && !self.protocol=='unix:') {
182
- // Invalid URI: it may generate lot of bad errors, like "TypeError: Cannot call method 'indexOf' of undefined" in CookieJar
183
- // Detect and reject it as soon as possible
184
- var faultyUri = url.format(self.uri)
185
- var message = 'Invalid URI "' + faultyUri + '"'
186
- if (Object.keys(options).length === 0) {
187
- // No option ? This can be the sign of a redirect
188
- // As this is a case where the user cannot do anything (they didn't call request directly with this URL)
189
- // they should be warned that it can be caused by a redirection (can save some hair)
190
- message += '. This can be caused by a crappy redirection.'
191
- }
192
- self.emit('error', new Error(message))
193
- return // This error was fatal
194
- }
195
-
196
- self._redirectsFollowed = self._redirectsFollowed || 0
197
- self.maxRedirects = (self.maxRedirects !== undefined) ? self.maxRedirects : 10
198
- self.followRedirect = (self.followRedirect !== undefined) ? self.followRedirect : true
199
- self.followAllRedirects = (self.followAllRedirects !== undefined) ? self.followAllRedirects : false
200
- if (self.followRedirect || self.followAllRedirects)
201
- self.redirects = self.redirects || []
202
-
203
- self.headers = self.headers ? copy(self.headers) : {}
204
-
205
- self.setHost = false
206
- if (!self.hasHeader('host')) {
207
- self.setHeader('host', self.uri.hostname)
208
- if (self.uri.port) {
209
- if ( !(self.uri.port === 80 && self.uri.protocol === 'http:') &&
210
- !(self.uri.port === 443 && self.uri.protocol === 'https:') )
211
- self.setHeader('host', self.getHeader('host') + (':'+self.uri.port) )
212
- }
213
- self.setHost = true
214
- }
215
-
216
- self.jar(self._jar || options.jar)
217
-
218
- if (!self.uri.port) {
219
- if (self.uri.protocol == 'http:') {self.uri.port = 80}
220
- else if (self.uri.protocol == 'https:') {self.uri.port = 443}
221
- }
222
-
223
- if (self.proxy && !self.tunnel) {
224
- self.port = self.proxy.port
225
- self.host = self.proxy.hostname
226
- } else {
227
- self.port = self.uri.port
228
- self.host = self.uri.hostname
229
- }
230
-
231
- self.clientErrorHandler = function (error) {
232
- if (self._aborted) return
233
- if (self.req && self.req._reusedSocket && error.code === 'ECONNRESET'
234
- && self.agent.addRequestNoreuse) {
235
- self.agent = { addRequest: self.agent.addRequestNoreuse.bind(self.agent) }
236
- self.start()
237
- self.req.end()
238
- return
239
- }
240
- if (self.timeout && self.timeoutTimer) {
241
- clearTimeout(self.timeoutTimer)
242
- self.timeoutTimer = null
243
- }
244
- self.emit('error', error)
245
- }
246
-
247
- self._parserErrorHandler = function (error) {
248
- if (this.res) {
249
- if (this.res.request) {
250
- this.res.request.emit('error', error)
251
- } else {
252
- this.res.emit('error', error)
253
- }
254
- } else {
255
- this._httpMessage.emit('error', error)
256
- }
257
- }
258
-
259
- self._buildRequest = function(){
260
- var self = this;
261
-
262
- if (options.form) {
263
- self.form(options.form)
264
- }
265
-
266
- if (options.qs) self.qs(options.qs)
267
-
268
- if (self.uri.path) {
269
- self.path = self.uri.path
270
- } else {
271
- self.path = self.uri.pathname + (self.uri.search || "")
272
- }
273
-
274
- if (self.path.length === 0) self.path = '/'
275
-
276
-
277
- // Auth must happen last in case signing is dependent on other headers
278
- if (options.oauth) {
279
- self.oauth(options.oauth)
280
- }
281
-
282
- if (options.aws) {
283
- self.aws(options.aws)
284
- }
285
-
286
- if (options.hawk) {
287
- self.hawk(options.hawk)
288
- }
289
-
290
- if (options.httpSignature) {
291
- self.httpSignature(options.httpSignature)
292
- }
293
-
294
- if (options.auth) {
295
- if (Object.prototype.hasOwnProperty.call(options.auth, 'username')) options.auth.user = options.auth.username
296
- if (Object.prototype.hasOwnProperty.call(options.auth, 'password')) options.auth.pass = options.auth.password
297
-
298
- self.auth(
299
- options.auth.user,
300
- options.auth.pass,
301
- options.auth.sendImmediately,
302
- options.auth.bearer
303
- )
304
- }
305
-
306
- if (self.gzip && !self.hasHeader('accept-encoding')) {
307
- self.setHeader('accept-encoding', 'gzip')
308
- }
309
-
310
- if (self.uri.auth && !self.hasHeader('authorization')) {
311
- var authPieces = self.uri.auth.split(':').map(function(item){ return querystring.unescape(item) })
312
- self.auth(authPieces[0], authPieces.slice(1).join(':'), true)
313
- }
314
- if (self.proxy && self.proxy.auth && !self.hasHeader('proxy-authorization') && !self.tunnel) {
315
- self.setHeader('proxy-authorization', "Basic " + toBase64(self.proxy.auth.split(':').map(function(item){ return querystring.unescape(item)}).join(':')))
316
- }
317
-
318
-
319
- if (self.proxy && !self.tunnel) self.path = (self.uri.protocol + '//' + self.uri.host + self.path)
320
-
321
- if (options.json) {
322
- self.json(options.json)
323
- } else if (options.multipart) {
324
- self.boundary = uuid()
325
- self.multipart(options.multipart)
326
- }
327
-
328
- if (self.body) {
329
- var length = 0
330
- if (!Buffer.isBuffer(self.body)) {
331
- if (Array.isArray(self.body)) {
332
- for (var i = 0; i < self.body.length; i++) {
333
- length += self.body[i].length
334
- }
335
- } else {
336
- self.body = new Buffer(self.body)
337
- length = self.body.length
338
- }
339
- } else {
340
- length = self.body.length
341
- }
342
- if (length) {
343
- if (!self.hasHeader('content-length')) self.setHeader('content-length', length)
344
- } else {
345
- throw new Error('Argument error, options.body.')
346
- }
347
- }
348
-
349
- var protocol = self.proxy && !self.tunnel ? self.proxy.protocol : self.uri.protocol
350
- , defaultModules = {'http:':http, 'https:':https, 'unix:':http}
351
- , httpModules = self.httpModules || {}
352
- ;
353
- self.httpModule = httpModules[protocol] || defaultModules[protocol]
354
-
355
- if (!self.httpModule) return this.emit('error', new Error("Invalid protocol: " + protocol))
356
-
357
- if (options.ca) self.ca = options.ca
358
-
359
- if (!self.agent) {
360
- if (options.agentOptions) self.agentOptions = options.agentOptions
361
-
362
- if (options.agentClass) {
363
- self.agentClass = options.agentClass
364
- } else if (options.forever) {
365
- self.agentClass = protocol === 'http:' ? ForeverAgent : ForeverAgent.SSL
366
- } else {
367
- self.agentClass = self.httpModule.Agent
368
- }
369
- }
370
-
371
- if (self.pool === false) {
372
- self.agent = false
373
- } else {
374
- self.agent = self.agent || self.getAgent()
375
- if (self.maxSockets) {
376
- // Don't use our pooling if node has the refactored client
377
- self.agent.maxSockets = self.maxSockets
378
- }
379
- if (self.pool.maxSockets) {
380
- // Don't use our pooling if node has the refactored client
381
- self.agent.maxSockets = self.pool.maxSockets
382
- }
383
- }
384
-
385
- self.on('pipe', function (src) {
386
- if (self.ntick && self._started) throw new Error("You cannot pipe to this stream after the outbound request has started.")
387
- self.src = src
388
- if (isReadStream(src)) {
389
- if (!self.hasHeader('content-type')) self.setHeader('content-type', mime.lookup(src.path))
390
- } else {
391
- if (src.headers) {
392
- for (var i in src.headers) {
393
- if (!self.hasHeader(i)) {
394
- self.setHeader(i, src.headers[i])
395
- }
396
- }
397
- }
398
- if (self._json && !self.hasHeader('content-type'))
399
- self.setHeader('content-type', 'application/json')
400
- if (src.method && !self.explicitMethod) {
401
- self.method = src.method
402
- }
403
- }
404
-
405
- // self.on('pipe', function () {
406
- // console.error("You have already piped to this stream. Pipeing twice is likely to break the request.")
407
- // })
408
- })
409
-
410
- process.nextTick(function () {
411
- if (self._aborted) return
412
-
413
- var end = function () {
414
- if (self._form) {
415
- self._form.pipe(self)
416
- }
417
- if (self.body) {
418
- if (Array.isArray(self.body)) {
419
- self.body.forEach(function (part) {
420
- self.write(part)
421
- })
422
- } else {
423
- self.write(self.body)
424
- }
425
- self.end()
426
- } else if (self.requestBodyStream) {
427
- console.warn("options.requestBodyStream is deprecated, please pass the request object to stream.pipe.")
428
- self.requestBodyStream.pipe(self)
429
- } else if (!self.src) {
430
- if (self.method !== 'GET' && typeof self.method !== 'undefined') {
431
- self.setHeader('content-length', 0)
432
- }
433
- self.end()
434
- }
435
- }
436
-
437
- if (self._form && !self.hasHeader('content-length')) {
438
- // Before ending the request, we had to compute the length of the whole form, asyncly
439
- self.setHeaders(self._form.getHeaders())
440
- self._form.getLength(function (err, length) {
441
- if (!err) {
442
- self.setHeader('content-length', length)
443
- }
444
- end()
445
- })
446
- } else {
447
- end()
448
- }
449
-
450
- self.ntick = true
451
- })
452
-
453
- } // End _buildRequest
454
-
455
- self._handleUnixSocketURI = function(self){
456
- // Parse URI and extract a socket path (tested as a valid socket using net.connect), and a http style path suffix
457
- // Thus http requests can be made to a socket using the uri unix://tmp/my.socket/urlpath
458
- // and a request for '/urlpath' will be sent to the unix socket at /tmp/my.socket
459
-
460
- self.unixsocket = true;
461
-
462
- var full_path = self.uri.href.replace(self.uri.protocol+'/', '');
463
-
464
- var lookup = full_path.split('/');
465
- var error_connecting = true;
466
-
467
- var lookup_table = {};
468
- do { lookup_table[lookup.join('/')]={} } while(lookup.pop())
469
- for (r in lookup_table){
470
- try_next(r);
471
- }
472
-
473
- function try_next(table_row){
474
- var client = net.connect( table_row );
475
- client.path = table_row
476
- client.on('error', function(){ lookup_table[this.path].error_connecting=true; this.end(); });
477
- client.on('connect', function(){ lookup_table[this.path].error_connecting=false; this.end(); });
478
- table_row.client = client;
479
- }
480
-
481
- wait_for_socket_response();
482
-
483
- response_counter = 0;
484
-
485
- function wait_for_socket_response(){
486
- var detach;
487
- if('undefined' == typeof setImmediate ) detach = process.nextTick
488
- else detach = setImmediate;
489
- detach(function(){
490
- // counter to prevent infinite blocking waiting for an open socket to be found.
491
- response_counter++;
492
- var trying = false;
493
- for (r in lookup_table){
494
- //console.log(r, lookup_table[r], lookup_table[r].error_connecting)
495
- if('undefined' == typeof lookup_table[r].error_connecting)
496
- trying = true;
497
- }
498
- if(trying && response_counter<1000)
499
- wait_for_socket_response()
500
- else
501
- set_socket_properties();
502
- })
503
- }
504
-
505
- function set_socket_properties(){
506
- var host;
507
- for (r in lookup_table){
508
- if(lookup_table[r].error_connecting === false){
509
- host = r
510
- }
511
- }
512
- if(!host){
513
- self.emit('error', new Error("Failed to connect to any socket in "+full_path))
514
- }
515
- var path = full_path.replace(host, '')
516
-
517
- self.socketPath = host
518
- self.uri.pathname = path
519
- self.uri.href = path
520
- self.uri.path = path
521
- self.host = ''
522
- self.hostname = ''
523
- delete self.host
524
- delete self.hostname
525
- self._buildRequest();
526
- }
527
- }
528
-
529
- // Intercept UNIX protocol requests to change properties to match socket
530
- if(/^unix:/.test(self.uri.protocol)){
531
- self._handleUnixSocketURI(self);
532
- } else {
533
- self._buildRequest();
534
- }
535
-
536
- }
537
-
538
- // Must call this when following a redirect from https to http or vice versa
539
- // Attempts to keep everything as identical as possible, but update the
540
- // httpModule, Tunneling agent, and/or Forever Agent in use.
541
- Request.prototype._updateProtocol = function () {
542
- var self = this
543
- var protocol = self.uri.protocol
544
-
545
- if (protocol === 'https:') {
546
- // previously was doing http, now doing https
547
- // if it's https, then we might need to tunnel now.
548
- if (self.proxy && self.canTunnel) {
549
- self.tunnel = true
550
- var tunnelFn = self.proxy.protocol === 'http:'
551
- ? tunnel.httpsOverHttp : tunnel.httpsOverHttps
552
- var tunnelOptions = { proxy: { host: self.proxy.hostname
553
- , port: +self.proxy.port
554
- , proxyAuth: self.proxy.auth }
555
- , rejectUnauthorized: self.rejectUnauthorized
556
- , ca: self.ca }
557
- self.agent = tunnelFn(tunnelOptions)
558
- return
559
- }
560
-
561
- self.httpModule = https
562
- switch (self.agentClass) {
563
- case ForeverAgent:
564
- self.agentClass = ForeverAgent.SSL
565
- break
566
- case http.Agent:
567
- self.agentClass = https.Agent
568
- break
569
- default:
570
- // nothing we can do. Just hope for the best.
571
- return
572
- }
573
-
574
- // if there's an agent, we need to get a new one.
575
- if (self.agent) self.agent = self.getAgent()
576
-
577
- } else {
578
- // previously was doing https, now doing http
579
- // stop any tunneling.
580
- if (self.tunnel) self.tunnel = false
581
- self.httpModule = http
582
- switch (self.agentClass) {
583
- case ForeverAgent.SSL:
584
- self.agentClass = ForeverAgent
585
- break
586
- case https.Agent:
587
- self.agentClass = http.Agent
588
- break
589
- default:
590
- // nothing we can do. just hope for the best
591
- return
592
- }
593
-
594
- // if there's an agent, then get a new one.
595
- if (self.agent) {
596
- self.agent = null
597
- self.agent = self.getAgent()
598
- }
599
- }
600
- }
601
-
602
- Request.prototype.getAgent = function () {
603
- var Agent = this.agentClass
604
- var options = {}
605
- if (this.agentOptions) {
606
- for (var i in this.agentOptions) {
607
- options[i] = this.agentOptions[i]
608
- }
609
- }
610
- if (this.ca) options.ca = this.ca
611
- if (this.ciphers) options.ciphers = this.ciphers
612
- if (this.secureProtocol) options.secureProtocol = this.secureProtocol
613
- if (this.secureOptions) options.secureOptions = this.secureOptions
614
- if (typeof this.rejectUnauthorized !== 'undefined') options.rejectUnauthorized = this.rejectUnauthorized
615
-
616
- if (this.cert && this.key) {
617
- options.key = this.key
618
- options.cert = this.cert
619
- }
620
-
621
- var poolKey = ''
622
-
623
- // different types of agents are in different pools
624
- if (Agent !== this.httpModule.Agent) {
625
- poolKey += Agent.name
626
- }
627
-
628
- if (!this.httpModule.globalAgent) {
629
- // node 0.4.x
630
- options.host = this.host
631
- options.port = this.port
632
- if (poolKey) poolKey += ':'
633
- poolKey += this.host + ':' + this.port
634
- }
635
-
636
- // ca option is only relevant if proxy or destination are https
637
- var proxy = this.proxy
638
- if (typeof proxy === 'string') proxy = url.parse(proxy)
639
- var isHttps = (proxy && proxy.protocol === 'https:') || this.uri.protocol === 'https:'
640
- if (isHttps) {
641
- if (options.ca) {
642
- if (poolKey) poolKey += ':'
643
- poolKey += options.ca
644
- }
645
-
646
- if (typeof options.rejectUnauthorized !== 'undefined') {
647
- if (poolKey) poolKey += ':'
648
- poolKey += options.rejectUnauthorized
649
- }
650
-
651
- if (options.cert)
652
- poolKey += options.cert.toString('ascii') + options.key.toString('ascii')
653
-
654
- if (options.ciphers) {
655
- if (poolKey) poolKey += ':'
656
- poolKey += options.ciphers
657
- }
658
-
659
- if (options.secureProtocol) {
660
- if (poolKey) poolKey += ':'
661
- poolKey += options.secureProtocol
662
- }
663
-
664
- if (options.secureOptions) {
665
- if (poolKey) poolKey += ':'
666
- poolKey += options.secureOptions
667
- }
668
- }
669
-
670
- if (this.pool === globalPool && !poolKey && Object.keys(options).length === 0 && this.httpModule.globalAgent) {
671
- // not doing anything special. Use the globalAgent
672
- return this.httpModule.globalAgent
673
- }
674
-
675
- // we're using a stored agent. Make sure it's protocol-specific
676
- poolKey = this.uri.protocol + poolKey
677
-
678
- // already generated an agent for this setting
679
- if (this.pool[poolKey]) return this.pool[poolKey]
680
-
681
- return this.pool[poolKey] = new Agent(options)
682
- }
683
-
684
- Request.prototype.start = function () {
685
- // start() is called once we are ready to send the outgoing HTTP request.
686
- // this is usually called on the first write(), end() or on nextTick()
687
- var self = this
688
-
689
- if (self._aborted) return
690
-
691
- self._started = true
692
- self.method = self.method || 'GET'
693
- self.href = self.uri.href
694
-
695
- if (self.src && self.src.stat && self.src.stat.size && !self.hasHeader('content-length')) {
696
- self.setHeader('content-length', self.src.stat.size)
697
- }
698
- if (self._aws) {
699
- self.aws(self._aws, true)
700
- }
701
-
702
- // We have a method named auth, which is completely different from the http.request
703
- // auth option. If we don't remove it, we're gonna have a bad time.
704
- var reqOptions = copy(self)
705
- delete reqOptions.auth
706
-
707
- debug('make request', self.uri.href)
708
- self.req = self.httpModule.request(reqOptions, self.onResponse.bind(self))
709
-
710
- if (self.timeout && !self.timeoutTimer) {
711
- self.timeoutTimer = setTimeout(function () {
712
- self.req.abort()
713
- var e = new Error("ETIMEDOUT")
714
- e.code = "ETIMEDOUT"
715
- self.emit("error", e)
716
- }, self.timeout)
717
-
718
- // Set additional timeout on socket - in case if remote
719
- // server freeze after sending headers
720
- if (self.req.setTimeout) { // only works on node 0.6+
721
- self.req.setTimeout(self.timeout, function () {
722
- if (self.req) {
723
- self.req.abort()
724
- var e = new Error("ESOCKETTIMEDOUT")
725
- e.code = "ESOCKETTIMEDOUT"
726
- self.emit("error", e)
727
- }
728
- })
729
- }
730
- }
731
-
732
- self.req.on('error', self.clientErrorHandler)
733
- self.req.on('drain', function() {
734
- self.emit('drain')
735
- })
736
- self.on('end', function() {
737
- if ( self.req.connection ) self.req.connection.removeListener('error', self._parserErrorHandler)
738
- })
739
- self.emit('request', self.req)
740
- }
741
- Request.prototype.onResponse = function (response) {
742
- var self = this
743
- debug('onResponse', self.uri.href, response.statusCode, response.headers)
744
- response.on('end', function() {
745
- debug('response end', self.uri.href, response.statusCode, response.headers)
746
- });
747
-
748
- // The check on response.connection is a workaround for browserify.
749
- if (response.connection && response.connection.listeners('error').indexOf(self._parserErrorHandler) === -1) {
750
- response.connection.setMaxListeners(0)
751
- response.connection.once('error', self._parserErrorHandler)
752
- }
753
- if (self._aborted) {
754
- debug('aborted', self.uri.href)
755
- response.resume()
756
- return
757
- }
758
- if (self._paused) response.pause()
759
- // Check that response.resume is defined. Workaround for browserify.
760
- else response.resume && response.resume()
761
-
762
- self.response = response
763
- response.request = self
764
- response.toJSON = toJSON
765
-
766
- // XXX This is different on 0.10, because SSL is strict by default
767
- if (self.httpModule === https &&
768
- self.strictSSL &&
769
- !response.client.authorized) {
770
- debug('strict ssl error', self.uri.href)
771
- var sslErr = response.client.authorizationError
772
- self.emit('error', new Error('SSL Error: '+ sslErr))
773
- return
774
- }
775
-
776
- if (self.setHost && self.hasHeader('host')) delete self.headers[self.hasHeader('host')]
777
- if (self.timeout && self.timeoutTimer) {
778
- clearTimeout(self.timeoutTimer)
779
- self.timeoutTimer = null
780
- }
781
-
782
- var targetCookieJar = (self._jar && self._jar.setCookie)?self._jar:globalCookieJar;
783
- var addCookie = function (cookie) {
784
- //set the cookie if it's domain in the href's domain.
785
- try {
786
- targetCookieJar.setCookie(cookie, self.uri.href, {ignoreError: true});
787
- } catch (e) {
788
- self.emit('error', e);
789
- }
790
- }
791
-
792
- if (hasHeader('set-cookie', response.headers) && (!self._disableCookies)) {
793
- var headerName = hasHeader('set-cookie', response.headers)
794
- if (Array.isArray(response.headers[headerName])) response.headers[headerName].forEach(addCookie)
795
- else addCookie(response.headers[headerName])
796
- }
797
-
798
- var redirectTo = null
799
- if (response.statusCode >= 300 && response.statusCode < 400 && hasHeader('location', response.headers)) {
800
- var location = response.headers[hasHeader('location', response.headers)]
801
- debug('redirect', location)
802
-
803
- if (self.followAllRedirects) {
804
- redirectTo = location
805
- } else if (self.followRedirect) {
806
- switch (self.method) {
807
- case 'PATCH':
808
- case 'PUT':
809
- case 'POST':
810
- case 'DELETE':
811
- // Do not follow redirects
812
- break
813
- default:
814
- redirectTo = location
815
- break
816
- }
817
- }
818
- } else if (response.statusCode == 401 && self._hasAuth && !self._sentAuth) {
819
- var authHeader = response.headers[hasHeader('www-authenticate', response.headers)]
820
- var authVerb = authHeader && authHeader.split(' ')[0].toLowerCase()
821
- debug('reauth', authVerb)
822
-
823
- switch (authVerb) {
824
- case 'basic':
825
- self.auth(self._user, self._pass, true)
826
- redirectTo = self.uri
827
- break
828
-
829
- case 'bearer':
830
- self.auth(null, null, true, self._bearer)
831
- redirectTo = self.uri
832
- break
833
-
834
- case 'digest':
835
- // TODO: More complete implementation of RFC 2617.
836
- // - check challenge.algorithm
837
- // - support algorithm="MD5-sess"
838
- // - handle challenge.domain
839
- // - support qop="auth-int" only
840
- // - handle Authentication-Info (not necessarily?)
841
- // - check challenge.stale (not necessarily?)
842
- // - increase nc (not necessarily?)
843
- // For reference:
844
- // http://tools.ietf.org/html/rfc2617#section-3
845
- // https://github.com/bagder/curl/blob/master/lib/http_digest.c
846
-
847
- var challenge = {}
848
- var re = /([a-z0-9_-]+)=(?:"([^"]+)"|([a-z0-9_-]+))/gi
849
- for (;;) {
850
- var match = re.exec(authHeader)
851
- if (!match) break
852
- challenge[match[1]] = match[2] || match[3];
853
- }
854
-
855
- var ha1 = md5(self._user + ':' + challenge.realm + ':' + self._pass)
856
- var ha2 = md5(self.method + ':' + self.uri.path)
857
- var qop = /(^|,)\s*auth\s*($|,)/.test(challenge.qop) && 'auth'
858
- var nc = qop && '00000001'
859
- var cnonce = qop && uuid().replace(/-/g, '')
860
- var digestResponse = qop ? md5(ha1 + ':' + challenge.nonce + ':' + nc + ':' + cnonce + ':' + qop + ':' + ha2) : md5(ha1 + ':' + challenge.nonce + ':' + ha2)
861
- var authValues = {
862
- username: self._user,
863
- realm: challenge.realm,
864
- nonce: challenge.nonce,
865
- uri: self.uri.path,
866
- qop: qop,
867
- response: digestResponse,
868
- nc: nc,
869
- cnonce: cnonce,
870
- algorithm: challenge.algorithm,
871
- opaque: challenge.opaque
872
- }
873
-
874
- authHeader = []
875
- for (var k in authValues) {
876
- if (!authValues[k]) {
877
- //ignore
878
- } else if (k === 'qop' || k === 'nc' || k === 'algorithm') {
879
- authHeader.push(k + '=' + authValues[k])
880
- } else {
881
- authHeader.push(k + '="' + authValues[k] + '"')
882
- }
883
- }
884
- authHeader = 'Digest ' + authHeader.join(', ')
885
- self.setHeader('authorization', authHeader)
886
- self._sentAuth = true
887
-
888
- redirectTo = self.uri
889
- break
890
- }
891
- }
892
-
893
- if (redirectTo) {
894
- debug('redirect to', redirectTo)
895
-
896
- // ignore any potential response body. it cannot possibly be useful
897
- // to us at this point.
898
- if (self._paused) response.resume()
899
-
900
- if (self._redirectsFollowed >= self.maxRedirects) {
901
- self.emit('error', new Error("Exceeded maxRedirects. Probably stuck in a redirect loop "+self.uri.href))
902
- return
903
- }
904
- self._redirectsFollowed += 1
905
-
906
- if (!isUrl.test(redirectTo)) {
907
- redirectTo = url.resolve(self.uri.href, redirectTo)
908
- }
909
-
910
- var uriPrev = self.uri
911
- self.uri = url.parse(redirectTo)
912
-
913
- // handle the case where we change protocol from https to http or vice versa
914
- if (self.uri.protocol !== uriPrev.protocol) {
915
- self._updateProtocol()
916
- }
917
-
918
- self.redirects.push(
919
- { statusCode : response.statusCode
920
- , redirectUri: redirectTo
921
- }
922
- )
923
- if (self.followAllRedirects && response.statusCode != 401 && response.statusCode != 307) self.method = 'GET'
924
- // self.method = 'GET' // Force all redirects to use GET || commented out fixes #215
925
- delete self.src
926
- delete self.req
927
- delete self.agent
928
- delete self._started
929
- if (response.statusCode != 401 && response.statusCode != 307) {
930
- // Remove parameters from the previous response, unless this is the second request
931
- // for a server that requires digest authentication.
932
- delete self.body
933
- delete self._form
934
- if (self.headers) {
935
- if (self.hasHeader('host')) delete self.headers[self.hasHeader('host')]
936
- if (self.hasHeader('content-type')) delete self.headers[self.hasHeader('content-type')]
937
- if (self.hasHeader('content-length')) delete self.headers[self.hasHeader('content-length')]
938
- }
939
- }
940
-
941
- self.emit('redirect');
942
-
943
- self.init()
944
- return // Ignore the rest of the response
945
- } else {
946
- self._redirectsFollowed = self._redirectsFollowed || 0
947
- // Be a good stream and emit end when the response is finished.
948
- // Hack to emit end on close because of a core bug that never fires end
949
- response.on('close', function () {
950
- if (!self._ended) self.response.emit('end')
951
- })
952
-
953
- var dataStream
954
- if (self.gzip) {
955
- var contentEncoding = response.headers["content-encoding"] || "identity"
956
- contentEncoding = contentEncoding.trim().toLowerCase()
957
-
958
- if (contentEncoding === "gzip") {
959
- dataStream = zlib.createGunzip()
960
- response.pipe(dataStream)
961
- } else {
962
- // Since previous versions didn't check for Content-Encoding header,
963
- // ignore any invalid values to preserve backwards-compatibility
964
- if (contentEncoding !== "identity") {
965
- debug("ignoring unrecognized Content-Encoding " + contentEncoding)
966
- }
967
- dataStream = response
968
- }
969
- } else {
970
- dataStream = response
971
- }
972
-
973
- if (self.encoding) {
974
- if (self.dests.length !== 0) {
975
- console.error("Ignoring encoding parameter as this stream is being piped to another stream which makes the encoding option invalid.")
976
- } else if (dataStream.setEncoding) {
977
- dataStream.setEncoding(self.encoding)
978
- } else {
979
- // Should only occur on node pre-v0.9.4 (joyent/node@9b5abe5) with
980
- // zlib streams.
981
- // If/When support for 0.9.4 is dropped, this should be unnecessary.
982
- dataStream = dataStream.pipe(stringstream(self.encoding))
983
- }
984
- }
985
-
986
- self.emit('response', response)
987
-
988
- self.dests.forEach(function (dest) {
989
- self.pipeDest(dest)
990
- })
991
-
992
- dataStream.on("data", function (chunk) {
993
- self._destdata = true
994
- self.emit("data", chunk)
995
- })
996
- dataStream.on("end", function (chunk) {
997
- self._ended = true
998
- self.emit("end", chunk)
999
- })
1000
- dataStream.on("close", function () {self.emit("close")})
1001
-
1002
- if (self.callback) {
1003
- var buffer = []
1004
- var bodyLen = 0
1005
- self.on("data", function (chunk) {
1006
- buffer.push(chunk)
1007
- bodyLen += chunk.length
1008
- })
1009
- self.on("end", function () {
1010
- debug('end event', self.uri.href)
1011
- if (self._aborted) {
1012
- debug('aborted', self.uri.href)
1013
- return
1014
- }
1015
-
1016
- if (buffer.length && Buffer.isBuffer(buffer[0])) {
1017
- debug('has body', self.uri.href, bodyLen)
1018
- var body = new Buffer(bodyLen)
1019
- var i = 0
1020
- buffer.forEach(function (chunk) {
1021
- chunk.copy(body, i, 0, chunk.length)
1022
- i += chunk.length
1023
- })
1024
- if (self.encoding === null) {
1025
- response.body = body
1026
- } else {
1027
- response.body = body.toString(self.encoding)
1028
- }
1029
- } else if (buffer.length) {
1030
- // The UTF8 BOM [0xEF,0xBB,0xBF] is converted to [0xFE,0xFF] in the JS UTC16/UCS2 representation.
1031
- // Strip this value out when the encoding is set to 'utf8', as upstream consumers won't expect it and it breaks JSON.parse().
1032
- if (self.encoding === 'utf8' && buffer[0].length > 0 && buffer[0][0] === "\uFEFF") {
1033
- buffer[0] = buffer[0].substring(1)
1034
- }
1035
- response.body = buffer.join('')
1036
- }
1037
-
1038
- if (self._json) {
1039
- try {
1040
- response.body = JSON.parse(response.body)
1041
- } catch (e) {}
1042
- }
1043
- debug('emitting complete', self.uri.href)
1044
- if(response.body == undefined && !self._json) {
1045
- response.body = "";
1046
- }
1047
- self.emit('complete', response, response.body)
1048
- })
1049
- }
1050
- //if no callback
1051
- else{
1052
- self.on("end", function () {
1053
- if (self._aborted) {
1054
- debug('aborted', self.uri.href)
1055
- return
1056
- }
1057
- self.emit('complete', response);
1058
- });
1059
- }
1060
- }
1061
- debug('finish init function', self.uri.href)
1062
- }
1063
-
1064
- Request.prototype.abort = function () {
1065
- this._aborted = true
1066
-
1067
- if (this.req) {
1068
- this.req.abort()
1069
- }
1070
- else if (this.response) {
1071
- this.response.abort()
1072
- }
1073
-
1074
- this.emit("abort")
1075
- }
1076
-
1077
- Request.prototype.pipeDest = function (dest) {
1078
- var response = this.response
1079
- // Called after the response is received
1080
- if (dest.headers && !dest.headersSent) {
1081
- if (hasHeader('content-type', response.headers)) {
1082
- var ctname = hasHeader('content-type', response.headers)
1083
- if (dest.setHeader) dest.setHeader(ctname, response.headers[ctname])
1084
- else dest.headers[ctname] = response.headers[ctname]
1085
- }
1086
-
1087
- if (hasHeader('content-length', response.headers)) {
1088
- var clname = hasHeader('content-length', response.headers)
1089
- if (dest.setHeader) dest.setHeader(clname, response.headers[clname])
1090
- else dest.headers[clname] = response.headers[clname]
1091
- }
1092
- }
1093
- if (dest.setHeader && !dest.headersSent) {
1094
- for (var i in response.headers) {
1095
- // If the response content is being decoded, the Content-Encoding header
1096
- // of the response doesn't represent the piped content, so don't pass it.
1097
- if (!this.gzip || i !== 'content-encoding') {
1098
- dest.setHeader(i, response.headers[i])
1099
- }
1100
- }
1101
- dest.statusCode = response.statusCode
1102
- }
1103
- if (this.pipefilter) this.pipefilter(response, dest)
1104
- }
1105
-
1106
- // Composable API
1107
- Request.prototype.setHeader = function (name, value, clobber) {
1108
- if (clobber === undefined) clobber = true
1109
- if (clobber || !this.hasHeader(name)) this.headers[name] = value
1110
- else this.headers[this.hasHeader(name)] += ',' + value
1111
- return this
1112
- }
1113
- Request.prototype.setHeaders = function (headers) {
1114
- for (var i in headers) {this.setHeader(i, headers[i])}
1115
- return this
1116
- }
1117
- Request.prototype.hasHeader = function (header, headers) {
1118
- var headers = Object.keys(headers || this.headers)
1119
- , lheaders = headers.map(function (h) {return h.toLowerCase()})
1120
- ;
1121
- header = header.toLowerCase()
1122
- for (var i=0;i<lheaders.length;i++) {
1123
- if (lheaders[i] === header) return headers[i]
1124
- }
1125
- return false
1126
- }
1127
-
1128
- var hasHeader = Request.prototype.hasHeader
1129
-
1130
- Request.prototype.qs = function (q, clobber) {
1131
- var base
1132
- if (!clobber && this.uri.query) base = qs.parse(this.uri.query)
1133
- else base = {}
1134
-
1135
- for (var i in q) {
1136
- base[i] = q[i]
1137
- }
1138
-
1139
- if (qs.stringify(base) === ''){
1140
- return this
1141
- }
1142
-
1143
- this.uri = url.parse(this.uri.href.split('?')[0] + '?' + qs.stringify(base))
1144
- this.url = this.uri
1145
- this.path = this.uri.path
1146
-
1147
- return this
1148
- }
1149
- Request.prototype.form = function (form) {
1150
- if (form) {
1151
- this.setHeader('content-type', 'application/x-www-form-urlencoded; charset=utf-8')
1152
- this.body = (typeof form === 'string') ? form.toString('utf8') : qs.stringify(form).toString('utf8')
1153
- return this
1154
- }
1155
- // create form-data object
1156
- this._form = new FormData()
1157
- return this._form
1158
- }
1159
- Request.prototype.multipart = function (multipart) {
1160
- var self = this
1161
- self.body = []
1162
-
1163
- if (!self.hasHeader('content-type')) {
1164
- self.setHeader('content-type', 'multipart/related; boundary=' + self.boundary)
1165
- } else {
1166
- var headerName = self.hasHeader('content-type');
1167
- self.setHeader(headerName, self.headers[headerName].split(';')[0] + '; boundary=' + self.boundary)
1168
- }
1169
-
1170
- if (!multipart.forEach) throw new Error('Argument error, options.multipart.')
1171
-
1172
- if (self.preambleCRLF) {
1173
- self.body.push(new Buffer('\r\n'))
1174
- }
1175
-
1176
- multipart.forEach(function (part) {
1177
- var body = part.body
1178
- if(body == null) throw Error('Body attribute missing in multipart.')
1179
- delete part.body
1180
- var preamble = '--' + self.boundary + '\r\n'
1181
- Object.keys(part).forEach(function (key) {
1182
- preamble += key + ': ' + part[key] + '\r\n'
1183
- })
1184
- preamble += '\r\n'
1185
- self.body.push(new Buffer(preamble))
1186
- self.body.push(new Buffer(body))
1187
- self.body.push(new Buffer('\r\n'))
1188
- })
1189
- self.body.push(new Buffer('--' + self.boundary + '--'))
1190
- return self
1191
- }
1192
- Request.prototype.json = function (val) {
1193
- var self = this
1194
-
1195
- if (!self.hasHeader('accept')) self.setHeader('accept', 'application/json')
1196
-
1197
- this._json = true
1198
- if (typeof val === 'boolean') {
1199
- if (typeof this.body === 'object') {
1200
- this.body = safeStringify(this.body)
1201
- if (!self.hasHeader('content-type'))
1202
- self.setHeader('content-type', 'application/json')
1203
- }
1204
- } else {
1205
- this.body = safeStringify(val)
1206
- if (!self.hasHeader('content-type'))
1207
- self.setHeader('content-type', 'application/json')
1208
- }
1209
-
1210
- return this
1211
- }
1212
- Request.prototype.getHeader = function (name, headers) {
1213
- var result, re, match
1214
- if (!headers) headers = this.headers
1215
- Object.keys(headers).forEach(function (key) {
1216
- if (key.length !== name.length) return
1217
- re = new RegExp(name, 'i')
1218
- match = key.match(re)
1219
- if (match) result = headers[key]
1220
- })
1221
- return result
1222
- }
1223
- var getHeader = Request.prototype.getHeader
1224
-
1225
- Request.prototype.auth = function (user, pass, sendImmediately, bearer) {
1226
- if (bearer !== undefined) {
1227
- this._bearer = bearer
1228
- this._hasAuth = true
1229
- if (sendImmediately || typeof sendImmediately == 'undefined') {
1230
- if (typeof bearer === 'function') {
1231
- bearer = bearer()
1232
- }
1233
- this.setHeader('authorization', 'Bearer ' + bearer)
1234
- this._sentAuth = true
1235
- }
1236
- return this
1237
- }
1238
- if (typeof user !== 'string' || (pass !== undefined && typeof pass !== 'string')) {
1239
- throw new Error('auth() received invalid user or password')
1240
- }
1241
- this._user = user
1242
- this._pass = pass
1243
- this._hasAuth = true
1244
- var header = typeof pass !== 'undefined' ? user + ':' + pass : user
1245
- if (sendImmediately || typeof sendImmediately == 'undefined') {
1246
- this.setHeader('authorization', 'Basic ' + toBase64(header))
1247
- this._sentAuth = true
1248
- }
1249
- return this
1250
- }
1251
- Request.prototype.aws = function (opts, now) {
1252
- if (!now) {
1253
- this._aws = opts
1254
- return this
1255
- }
1256
- var date = new Date()
1257
- this.setHeader('date', date.toUTCString())
1258
- var auth =
1259
- { key: opts.key
1260
- , secret: opts.secret
1261
- , verb: this.method.toUpperCase()
1262
- , date: date
1263
- , contentType: this.getHeader('content-type') || ''
1264
- , md5: this.getHeader('content-md5') || ''
1265
- , amazonHeaders: aws.canonicalizeHeaders(this.headers)
1266
- }
1267
- if (opts.bucket && this.path) {
1268
- auth.resource = '/' + opts.bucket + this.path
1269
- } else if (opts.bucket && !this.path) {
1270
- auth.resource = '/' + opts.bucket
1271
- } else if (!opts.bucket && this.path) {
1272
- auth.resource = this.path
1273
- } else if (!opts.bucket && !this.path) {
1274
- auth.resource = '/'
1275
- }
1276
- auth.resource = aws.canonicalizeResource(auth.resource)
1277
- this.setHeader('authorization', aws.authorization(auth))
1278
-
1279
- return this
1280
- }
1281
- Request.prototype.httpSignature = function (opts) {
1282
- var req = this
1283
- httpSignature.signRequest({
1284
- getHeader: function(header) {
1285
- return getHeader(header, req.headers)
1286
- },
1287
- setHeader: function(header, value) {
1288
- req.setHeader(header, value)
1289
- },
1290
- method: this.method,
1291
- path: this.path
1292
- }, opts)
1293
- debug('httpSignature authorization', this.getHeader('authorization'))
1294
-
1295
- return this
1296
- }
1297
-
1298
- Request.prototype.hawk = function (opts) {
1299
- this.setHeader('Authorization', hawk.client.header(this.uri, this.method, opts).field)
1300
- }
1301
-
1302
- Request.prototype.oauth = function (_oauth) {
1303
- var form
1304
- if (this.hasHeader('content-type') &&
1305
- this.getHeader('content-type').slice(0, 'application/x-www-form-urlencoded'.length) ===
1306
- 'application/x-www-form-urlencoded'
1307
- ) {
1308
- form = qs.parse(this.body)
1309
- }
1310
- if (this.uri.query) {
1311
- form = qs.parse(this.uri.query)
1312
- }
1313
- if (!form) form = {}
1314
- var oa = {}
1315
- for (var i in form) oa[i] = form[i]
1316
- for (var i in _oauth) oa['oauth_'+i] = _oauth[i]
1317
- if (!oa.oauth_version) oa.oauth_version = '1.0'
1318
- if (!oa.oauth_timestamp) oa.oauth_timestamp = Math.floor( Date.now() / 1000 ).toString()
1319
- if (!oa.oauth_nonce) oa.oauth_nonce = uuid().replace(/-/g, '')
1320
-
1321
- oa.oauth_signature_method = 'HMAC-SHA1'
1322
-
1323
- var consumer_secret = oa.oauth_consumer_secret
1324
- delete oa.oauth_consumer_secret
1325
- var token_secret = oa.oauth_token_secret
1326
- delete oa.oauth_token_secret
1327
- var timestamp = oa.oauth_timestamp
1328
-
1329
- var baseurl = this.uri.protocol + '//' + this.uri.host + this.uri.pathname
1330
- var signature = oauth.hmacsign(this.method, baseurl, oa, consumer_secret, token_secret)
1331
-
1332
- // oa.oauth_signature = signature
1333
- for (var i in form) {
1334
- if ( i.slice(0, 'oauth_') in _oauth) {
1335
- // skip
1336
- } else {
1337
- delete oa['oauth_'+i]
1338
- if (i !== 'x_auth_mode') delete oa[i]
1339
- }
1340
- }
1341
- oa.oauth_timestamp = timestamp
1342
- var authHeader = 'OAuth '+Object.keys(oa).sort().map(function (i) {return i+'="'+oauth.rfc3986(oa[i])+'"'}).join(',')
1343
- authHeader += ',oauth_signature="' + oauth.rfc3986(signature) + '"'
1344
- this.setHeader('Authorization', authHeader)
1345
- return this
1346
- }
1347
- Request.prototype.jar = function (jar) {
1348
- var cookies
1349
-
1350
- if (this._redirectsFollowed === 0) {
1351
- this.originalCookieHeader = this.getHeader('cookie')
1352
- }
1353
-
1354
- if (!jar) {
1355
- // disable cookies
1356
- cookies = false
1357
- this._disableCookies = true
1358
- } else {
1359
- var targetCookieJar = (jar && jar.getCookieString)?jar:globalCookieJar;
1360
- var urihref = this.uri.href
1361
- //fetch cookie in the Specified host
1362
- if (targetCookieJar) {
1363
- cookies = targetCookieJar.getCookieString(urihref);
1364
- }
1365
- }
1366
-
1367
- //if need cookie and cookie is not empty
1368
- if (cookies && cookies.length) {
1369
- if (this.originalCookieHeader) {
1370
- // Don't overwrite existing Cookie header
1371
- this.setHeader('cookie', this.originalCookieHeader + '; ' + cookies)
1372
- } else {
1373
- this.setHeader('cookie', cookies)
1374
- }
1375
- }
1376
- this._jar = jar
1377
- return this
1378
- }
1379
-
1380
-
1381
- // Stream API
1382
- Request.prototype.pipe = function (dest, opts) {
1383
- if (this.response) {
1384
- if (this._destdata) {
1385
- throw new Error("You cannot pipe after data has been emitted from the response.")
1386
- } else if (this._ended) {
1387
- throw new Error("You cannot pipe after the response has been ended.")
1388
- } else {
1389
- stream.Stream.prototype.pipe.call(this, dest, opts)
1390
- this.pipeDest(dest)
1391
- return dest
1392
- }
1393
- } else {
1394
- this.dests.push(dest)
1395
- stream.Stream.prototype.pipe.call(this, dest, opts)
1396
- return dest
1397
- }
1398
- }
1399
- Request.prototype.write = function () {
1400
- if (!this._started) this.start()
1401
- return this.req.write.apply(this.req, arguments)
1402
- }
1403
- Request.prototype.end = function (chunk) {
1404
- if (chunk) this.write(chunk)
1405
- if (!this._started) this.start()
1406
- this.req.end()
1407
- }
1408
- Request.prototype.pause = function () {
1409
- if (!this.response) this._paused = true
1410
- else this.response.pause.apply(this.response, arguments)
1411
- }
1412
- Request.prototype.resume = function () {
1413
- if (!this.response) this._paused = false
1414
- else this.response.resume.apply(this.response, arguments)
1415
- }
1416
- Request.prototype.destroy = function () {
1417
- if (!this._ended) this.end()
1418
- else if (this.response) this.response.destroy()
1419
- }
1420
-
1421
- function toJSON () {
1422
- return getSafe(this, '__' + (((1+Math.random())*0x10000)|0).toString(16))
1423
- }
1424
-
1425
- Request.prototype.toJSON = toJSON
1426
-
1427
-
1428
- module.exports = Request