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.
- package/LICENSE +10 -24
- package/dist/ai-stream.d.ts +18 -0
- package/dist/ai-stream.js +132 -0
- package/dist/ai-stream.mjs +13 -0
- package/dist/anthropic-stream.d.ts +5 -0
- package/dist/anthropic-stream.js +133 -0
- package/dist/anthropic-stream.mjs +8 -0
- package/dist/chunk-265FSSO4.mjs +91 -0
- package/dist/chunk-2L3ZO4UM.mjs +45 -0
- package/dist/chunk-GT4HKF2X.mjs +33 -0
- package/dist/chunk-JGDC3BXD.mjs +22 -0
- package/dist/chunk-NK2CVBLI.mjs +38 -0
- package/dist/chunk-PEYAHBDF.mjs +43 -0
- package/dist/chunk-TJMME6CL.mjs +24 -0
- package/dist/huggingface-stream.d.ts +5 -0
- package/dist/huggingface-stream.js +121 -0
- package/dist/huggingface-stream.mjs +8 -0
- package/dist/index.d.ts +131 -0
- package/dist/index.js +278 -0
- package/dist/index.mjs +35 -0
- package/dist/index.test.d.ts +2 -0
- package/dist/index.test.js +12 -0
- package/dist/index.test.mjs +10 -0
- package/dist/langchain-stream.d.ts +12 -0
- package/dist/langchain-stream.js +102 -0
- package/dist/langchain-stream.mjs +8 -0
- package/dist/openai-stream.d.ts +5 -0
- package/dist/openai-stream.js +144 -0
- package/dist/openai-stream.mjs +8 -0
- package/dist/streaming-text-response.d.ts +17 -0
- package/dist/streaming-text-response.js +75 -0
- package/dist/streaming-text-response.mjs +9 -0
- package/package.json +78 -29
- package/react/dist/chunk-5PP6W52J.mjs +202 -0
- package/react/dist/chunk-6EH3SWMP.mjs +55 -0
- package/react/dist/chunk-PW6HSU2N.mjs +154 -0
- package/react/dist/index.d.ts +3 -0
- package/react/dist/index.js +424 -0
- package/react/dist/index.mjs +12 -0
- package/react/dist/types-f862f74a.d.ts +123 -0
- package/react/dist/use-chat.d.ts +42 -0
- package/react/dist/use-chat.js +276 -0
- package/react/dist/use-chat.mjs +8 -0
- package/react/dist/use-completion.d.ts +47 -0
- package/react/dist/use-completion.js +229 -0
- package/react/dist/use-completion.mjs +8 -0
- package/svelte/dist/chunk-6USBQIV6.mjs +177 -0
- package/svelte/dist/chunk-BQ64GHZ3.mjs +136 -0
- package/svelte/dist/chunk-CENOSGDG.mjs +493 -0
- package/svelte/dist/index.d.ts +4 -0
- package/svelte/dist/index.js +808 -0
- package/svelte/dist/index.mjs +11 -0
- package/svelte/dist/types-f862f74a.d.ts +123 -0
- package/svelte/dist/use-chat.d.ts +39 -0
- package/svelte/dist/use-chat.js +680 -0
- package/svelte/dist/use-chat.mjs +7 -0
- package/svelte/dist/use-completion.d.ts +38 -0
- package/svelte/dist/use-completion.js +640 -0
- package/svelte/dist/use-completion.mjs +7 -0
- package/.npmignore +0 -15
- package/.travis.yml +0 -4
- package/README.md +0 -21
- package/bin/ai.js +0 -22
- package/index.js +0 -37
- package/node_modules/request/.npmignore +0 -2
- package/node_modules/request/.travis.yml +0 -12
- package/node_modules/request/CHANGELOG.md +0 -954
- package/node_modules/request/LICENSE +0 -55
- package/node_modules/request/README.md +0 -421
- package/node_modules/request/index.js +0 -166
- package/node_modules/request/lib/cookies.js +0 -40
- package/node_modules/request/lib/copy.js +0 -8
- package/node_modules/request/lib/debug.js +0 -7
- package/node_modules/request/lib/getSafe.js +0 -34
- package/node_modules/request/lib/optional.js +0 -5
- package/node_modules/request/node_modules/aws-sign2/LICENSE +0 -55
- package/node_modules/request/node_modules/aws-sign2/README.md +0 -4
- package/node_modules/request/node_modules/aws-sign2/index.js +0 -202
- package/node_modules/request/node_modules/aws-sign2/package.json +0 -47
- package/node_modules/request/node_modules/forever-agent/LICENSE +0 -55
- package/node_modules/request/node_modules/forever-agent/README.md +0 -4
- package/node_modules/request/node_modules/forever-agent/index.js +0 -119
- package/node_modules/request/node_modules/forever-agent/package.json +0 -46
- package/node_modules/request/node_modules/form-data/License +0 -19
- package/node_modules/request/node_modules/form-data/Readme.md +0 -175
- package/node_modules/request/node_modules/form-data/lib/form_data.js +0 -351
- package/node_modules/request/node_modules/form-data/node_modules/async/.travis.yml +0 -3
- package/node_modules/request/node_modules/form-data/node_modules/async/LICENSE +0 -19
- package/node_modules/request/node_modules/form-data/node_modules/async/README.md +0 -1646
- package/node_modules/request/node_modules/form-data/node_modules/async/component.json +0 -11
- package/node_modules/request/node_modules/form-data/node_modules/async/lib/async.js +0 -1123
- package/node_modules/request/node_modules/form-data/node_modules/async/package.json +0 -60
- package/node_modules/request/node_modules/form-data/node_modules/combined-stream/License +0 -19
- package/node_modules/request/node_modules/form-data/node_modules/combined-stream/Readme.md +0 -132
- package/node_modules/request/node_modules/form-data/node_modules/combined-stream/lib/combined_stream.js +0 -186
- package/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/.npmignore +0 -2
- package/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/License +0 -19
- package/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Makefile +0 -7
- package/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/Readme.md +0 -154
- package/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js +0 -99
- package/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/package.json +0 -42
- package/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/common.js +0 -6
- 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
- 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
- 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
- package/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-delayed-stream.js +0 -48
- 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
- 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
- package/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-pipe-resumes.js +0 -13
- package/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-proxy-readable.js +0 -13
- package/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/run.js +0 -7
- package/node_modules/request/node_modules/form-data/node_modules/combined-stream/package.json +0 -61
- package/node_modules/request/node_modules/form-data/node_modules/mime/LICENSE +0 -19
- package/node_modules/request/node_modules/form-data/node_modules/mime/README.md +0 -66
- package/node_modules/request/node_modules/form-data/node_modules/mime/mime.js +0 -114
- package/node_modules/request/node_modules/form-data/node_modules/mime/package.json +0 -59
- package/node_modules/request/node_modules/form-data/node_modules/mime/test.js +0 -84
- package/node_modules/request/node_modules/form-data/node_modules/mime/types/mime.types +0 -1588
- package/node_modules/request/node_modules/form-data/node_modules/mime/types/node.types +0 -77
- package/node_modules/request/node_modules/form-data/package.json +0 -80
- package/node_modules/request/node_modules/hawk/.npmignore +0 -18
- package/node_modules/request/node_modules/hawk/.travis.yml +0 -5
- package/node_modules/request/node_modules/hawk/LICENSE +0 -24
- package/node_modules/request/node_modules/hawk/Makefile +0 -10
- package/node_modules/request/node_modules/hawk/README.md +0 -625
- package/node_modules/request/node_modules/hawk/example/usage.js +0 -78
- package/node_modules/request/node_modules/hawk/images/hawk.png +0 -0
- package/node_modules/request/node_modules/hawk/images/logo.png +0 -0
- package/node_modules/request/node_modules/hawk/index.js +0 -1
- package/node_modules/request/node_modules/hawk/lib/browser.js +0 -507
- package/node_modules/request/node_modules/hawk/lib/client.js +0 -371
- package/node_modules/request/node_modules/hawk/lib/crypto.js +0 -118
- package/node_modules/request/node_modules/hawk/lib/index.js +0 -15
- package/node_modules/request/node_modules/hawk/lib/server.js +0 -523
- package/node_modules/request/node_modules/hawk/lib/utils.js +0 -183
- package/node_modules/request/node_modules/hawk/node_modules/boom/.npmignore +0 -18
- package/node_modules/request/node_modules/hawk/node_modules/boom/.travis.yml +0 -5
- package/node_modules/request/node_modules/hawk/node_modules/boom/LICENSE +0 -24
- package/node_modules/request/node_modules/hawk/node_modules/boom/Makefile +0 -11
- package/node_modules/request/node_modules/hawk/node_modules/boom/README.md +0 -6
- package/node_modules/request/node_modules/hawk/node_modules/boom/images/boom.png +0 -0
- package/node_modules/request/node_modules/hawk/node_modules/boom/index.js +0 -1
- package/node_modules/request/node_modules/hawk/node_modules/boom/lib/index.js +0 -207
- package/node_modules/request/node_modules/hawk/node_modules/boom/package.json +0 -64
- package/node_modules/request/node_modules/hawk/node_modules/boom/test/index.js +0 -245
- package/node_modules/request/node_modules/hawk/node_modules/cryptiles/.npmignore +0 -18
- package/node_modules/request/node_modules/hawk/node_modules/cryptiles/.travis.yml +0 -5
- package/node_modules/request/node_modules/hawk/node_modules/cryptiles/LICENSE +0 -24
- package/node_modules/request/node_modules/hawk/node_modules/cryptiles/Makefile +0 -11
- package/node_modules/request/node_modules/hawk/node_modules/cryptiles/README.md +0 -6
- package/node_modules/request/node_modules/hawk/node_modules/cryptiles/index.js +0 -1
- package/node_modules/request/node_modules/hawk/node_modules/cryptiles/lib/index.js +0 -68
- package/node_modules/request/node_modules/hawk/node_modules/cryptiles/package.json +0 -65
- package/node_modules/request/node_modules/hawk/node_modules/cryptiles/test/index.js +0 -101
- package/node_modules/request/node_modules/hawk/node_modules/hoek/.npmignore +0 -18
- package/node_modules/request/node_modules/hawk/node_modules/hoek/.travis.yml +0 -5
- package/node_modules/request/node_modules/hawk/node_modules/hoek/LICENSE +0 -33
- package/node_modules/request/node_modules/hawk/node_modules/hoek/Makefile +0 -10
- package/node_modules/request/node_modules/hawk/node_modules/hoek/README.md +0 -436
- package/node_modules/request/node_modules/hawk/node_modules/hoek/images/hoek.png +0 -0
- package/node_modules/request/node_modules/hawk/node_modules/hoek/index.js +0 -1
- package/node_modules/request/node_modules/hawk/node_modules/hoek/lib/escape.js +0 -132
- package/node_modules/request/node_modules/hawk/node_modules/hoek/lib/index.js +0 -585
- package/node_modules/request/node_modules/hawk/node_modules/hoek/package.json +0 -70
- package/node_modules/request/node_modules/hawk/node_modules/hoek/test/escaper.js +0 -86
- package/node_modules/request/node_modules/hawk/node_modules/hoek/test/index.js +0 -1078
- package/node_modules/request/node_modules/hawk/node_modules/hoek/test/modules/test1.js +0 -1
- package/node_modules/request/node_modules/hawk/node_modules/hoek/test/modules/test2.js +0 -1
- package/node_modules/request/node_modules/hawk/node_modules/hoek/test/modules/test3.js +0 -1
- package/node_modules/request/node_modules/hawk/node_modules/sntp/.npmignore +0 -18
- package/node_modules/request/node_modules/hawk/node_modules/sntp/.travis.yml +0 -5
- package/node_modules/request/node_modules/hawk/node_modules/sntp/LICENSE +0 -24
- package/node_modules/request/node_modules/hawk/node_modules/sntp/Makefile +0 -11
- package/node_modules/request/node_modules/hawk/node_modules/sntp/README.md +0 -68
- package/node_modules/request/node_modules/hawk/node_modules/sntp/examples/offset.js +0 -16
- package/node_modules/request/node_modules/hawk/node_modules/sntp/examples/time.js +0 -25
- package/node_modules/request/node_modules/hawk/node_modules/sntp/index.js +0 -1
- package/node_modules/request/node_modules/hawk/node_modules/sntp/lib/index.js +0 -409
- package/node_modules/request/node_modules/hawk/node_modules/sntp/package.json +0 -65
- package/node_modules/request/node_modules/hawk/node_modules/sntp/test/index.js +0 -359
- package/node_modules/request/node_modules/hawk/package.json +0 -70
- package/node_modules/request/node_modules/hawk/test/browser.js +0 -817
- package/node_modules/request/node_modules/hawk/test/client.js +0 -206
- package/node_modules/request/node_modules/hawk/test/crypto.js +0 -86
- package/node_modules/request/node_modules/hawk/test/index.js +0 -316
- package/node_modules/request/node_modules/hawk/test/message.js +0 -246
- package/node_modules/request/node_modules/hawk/test/readme.js +0 -98
- package/node_modules/request/node_modules/hawk/test/server.js +0 -686
- package/node_modules/request/node_modules/hawk/test/uri.js +0 -456
- package/node_modules/request/node_modules/hawk/test/utils.js +0 -120
- package/node_modules/request/node_modules/http-signature/.dir-locals.el +0 -6
- package/node_modules/request/node_modules/http-signature/.npmignore +0 -7
- package/node_modules/request/node_modules/http-signature/LICENSE +0 -18
- package/node_modules/request/node_modules/http-signature/README.md +0 -75
- package/node_modules/request/node_modules/http-signature/http_signing.md +0 -296
- package/node_modules/request/node_modules/http-signature/lib/index.js +0 -25
- package/node_modules/request/node_modules/http-signature/lib/parser.js +0 -304
- package/node_modules/request/node_modules/http-signature/lib/signer.js +0 -179
- package/node_modules/request/node_modules/http-signature/lib/util.js +0 -249
- package/node_modules/request/node_modules/http-signature/lib/verify.js +0 -42
- package/node_modules/request/node_modules/http-signature/node_modules/asn1/.npmignore +0 -2
- package/node_modules/request/node_modules/http-signature/node_modules/asn1/LICENSE +0 -19
- package/node_modules/request/node_modules/http-signature/node_modules/asn1/README.md +0 -50
- package/node_modules/request/node_modules/http-signature/node_modules/asn1/lib/ber/errors.js +0 -13
- package/node_modules/request/node_modules/http-signature/node_modules/asn1/lib/ber/index.js +0 -27
- package/node_modules/request/node_modules/http-signature/node_modules/asn1/lib/ber/reader.js +0 -267
- package/node_modules/request/node_modules/http-signature/node_modules/asn1/lib/ber/types.js +0 -36
- package/node_modules/request/node_modules/http-signature/node_modules/asn1/lib/ber/writer.js +0 -317
- package/node_modules/request/node_modules/http-signature/node_modules/asn1/lib/index.js +0 -20
- package/node_modules/request/node_modules/http-signature/node_modules/asn1/package.json +0 -63
- package/node_modules/request/node_modules/http-signature/node_modules/asn1/tst/ber/reader.test.js +0 -172
- package/node_modules/request/node_modules/http-signature/node_modules/asn1/tst/ber/writer.test.js +0 -296
- package/node_modules/request/node_modules/http-signature/node_modules/assert-plus/README.md +0 -126
- package/node_modules/request/node_modules/http-signature/node_modules/assert-plus/assert.js +0 -196
- package/node_modules/request/node_modules/http-signature/node_modules/assert-plus/package.json +0 -38
- package/node_modules/request/node_modules/http-signature/node_modules/ctype/CHANGELOG +0 -71
- package/node_modules/request/node_modules/http-signature/node_modules/ctype/LICENSE +0 -24
- package/node_modules/request/node_modules/http-signature/node_modules/ctype/README +0 -82
- package/node_modules/request/node_modules/http-signature/node_modules/ctype/README.old +0 -298
- package/node_modules/request/node_modules/http-signature/node_modules/ctype/ctf.js +0 -245
- package/node_modules/request/node_modules/http-signature/node_modules/ctype/ctio.js +0 -1485
- package/node_modules/request/node_modules/http-signature/node_modules/ctype/ctype.js +0 -944
- package/node_modules/request/node_modules/http-signature/node_modules/ctype/man/man3ctype/ctio.3ctype +0 -241
- package/node_modules/request/node_modules/http-signature/node_modules/ctype/package.json +0 -36
- package/node_modules/request/node_modules/http-signature/node_modules/ctype/tools/jsl.conf +0 -129
- package/node_modules/request/node_modules/http-signature/node_modules/ctype/tools/jsstyle +0 -839
- package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/float.json +0 -13
- package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/int.json +0 -13
- package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/psinfo.json +0 -104
- package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/struct.json +0 -19
- package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/tst.fail.js +0 -39
- package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/tst.float.js +0 -14
- package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/tst.int.js +0 -14
- package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/tst.psinfo.js +0 -17
- package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/tst.struct.js +0 -18
- package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/tst.typedef.js +0 -15
- package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctf/typedef.json +0 -14
- package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/float/tst.rfloat.js +0 -767
- package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/float/tst.wfloat.js +0 -753
- package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/int/tst.64.js +0 -638
- package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/int/tst.rint.js +0 -101
- package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/int/tst.wbounds.js +0 -53
- package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/int/tst.wint.js +0 -92
- package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/uint/tst.64.js +0 -451
- package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/uint/tst.roundtrip.js +0 -81
- package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/uint/tst.ruint.js +0 -95
- package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctio/uint/tst.wuint.js +0 -156
- package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.basicr.js +0 -50
- package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.basicw.js +0 -44
- package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.char.js +0 -42
- package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.endian.js +0 -45
- package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.oldwrite.js +0 -28
- package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.readSize.js +0 -128
- package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.structw.js +0 -28
- package/node_modules/request/node_modules/http-signature/node_modules/ctype/tst/ctype/tst.writeStruct.js +0 -31
- package/node_modules/request/node_modules/http-signature/package.json +0 -54
- package/node_modules/request/node_modules/json-stringify-safe/LICENSE +0 -27
- package/node_modules/request/node_modules/json-stringify-safe/README.md +0 -49
- package/node_modules/request/node_modules/json-stringify-safe/package.json +0 -51
- package/node_modules/request/node_modules/json-stringify-safe/stringify.js +0 -39
- package/node_modules/request/node_modules/json-stringify-safe/test.js +0 -128
- package/node_modules/request/node_modules/mime-types/.npmignore +0 -14
- package/node_modules/request/node_modules/mime-types/.travis.yml +0 -12
- package/node_modules/request/node_modules/mime-types/LICENSE +0 -22
- package/node_modules/request/node_modules/mime-types/Makefile +0 -9
- package/node_modules/request/node_modules/mime-types/README.md +0 -101
- package/node_modules/request/node_modules/mime-types/SOURCES.md +0 -17
- package/node_modules/request/node_modules/mime-types/component.json +0 -16
- package/node_modules/request/node_modules/mime-types/lib/custom.json +0 -27
- package/node_modules/request/node_modules/mime-types/lib/index.js +0 -75
- package/node_modules/request/node_modules/mime-types/lib/mime.json +0 -3317
- package/node_modules/request/node_modules/mime-types/lib/node.json +0 -55
- package/node_modules/request/node_modules/mime-types/package.json +0 -69
- package/node_modules/request/node_modules/node-uuid/.npmignore +0 -2
- package/node_modules/request/node_modules/node-uuid/LICENSE.md +0 -2
- package/node_modules/request/node_modules/node-uuid/README.md +0 -207
- package/node_modules/request/node_modules/node-uuid/benchmark/README.md +0 -53
- package/node_modules/request/node_modules/node-uuid/benchmark/bench.gnu +0 -174
- package/node_modules/request/node_modules/node-uuid/benchmark/bench.sh +0 -34
- package/node_modules/request/node_modules/node-uuid/benchmark/benchmark-native.c +0 -34
- package/node_modules/request/node_modules/node-uuid/benchmark/benchmark.js +0 -84
- package/node_modules/request/node_modules/node-uuid/component.json +0 -18
- package/node_modules/request/node_modules/node-uuid/package.json +0 -54
- package/node_modules/request/node_modules/node-uuid/test/compare_v1.js +0 -63
- package/node_modules/request/node_modules/node-uuid/test/test.html +0 -17
- package/node_modules/request/node_modules/node-uuid/test/test.js +0 -228
- package/node_modules/request/node_modules/node-uuid/uuid.js +0 -245
- package/node_modules/request/node_modules/oauth-sign/LICENSE +0 -55
- package/node_modules/request/node_modules/oauth-sign/README.md +0 -4
- package/node_modules/request/node_modules/oauth-sign/index.js +0 -43
- package/node_modules/request/node_modules/oauth-sign/package.json +0 -49
- package/node_modules/request/node_modules/oauth-sign/test.js +0 -49
- package/node_modules/request/node_modules/qs/.jshintignore +0 -1
- package/node_modules/request/node_modules/qs/.jshintrc +0 -10
- package/node_modules/request/node_modules/qs/.npmignore +0 -18
- package/node_modules/request/node_modules/qs/.travis.yml +0 -4
- package/node_modules/request/node_modules/qs/LICENSE +0 -28
- package/node_modules/request/node_modules/qs/Makefile +0 -8
- package/node_modules/request/node_modules/qs/Readme.md +0 -120
- package/node_modules/request/node_modules/qs/index.js +0 -1
- package/node_modules/request/node_modules/qs/lib/index.js +0 -15
- package/node_modules/request/node_modules/qs/lib/parse.js +0 -151
- package/node_modules/request/node_modules/qs/lib/stringify.js +0 -52
- package/node_modules/request/node_modules/qs/lib/utils.js +0 -131
- package/node_modules/request/node_modules/qs/package.json +0 -61
- package/node_modules/request/node_modules/qs/test/parse.js +0 -236
- package/node_modules/request/node_modules/qs/test/stringify.js +0 -123
- package/node_modules/request/node_modules/stringstream/.npmignore +0 -15
- package/node_modules/request/node_modules/stringstream/.travis.yml +0 -4
- package/node_modules/request/node_modules/stringstream/LICENSE.txt +0 -4
- package/node_modules/request/node_modules/stringstream/README.md +0 -38
- package/node_modules/request/node_modules/stringstream/example.js +0 -27
- package/node_modules/request/node_modules/stringstream/package.json +0 -48
- package/node_modules/request/node_modules/stringstream/stringstream.js +0 -102
- package/node_modules/request/node_modules/tough-cookie/.jshintrc +0 -70
- package/node_modules/request/node_modules/tough-cookie/.npmignore +0 -3
- package/node_modules/request/node_modules/tough-cookie/.travis.yml +0 -8
- package/node_modules/request/node_modules/tough-cookie/LICENSE +0 -78
- package/node_modules/request/node_modules/tough-cookie/README.md +0 -412
- package/node_modules/request/node_modules/tough-cookie/generate-pubsuffix.js +0 -239
- package/node_modules/request/node_modules/tough-cookie/lib/cookie.js +0 -1107
- package/node_modules/request/node_modules/tough-cookie/lib/memstore.js +0 -123
- package/node_modules/request/node_modules/tough-cookie/lib/pubsuffix.js +0 -69
- package/node_modules/request/node_modules/tough-cookie/lib/store.js +0 -37
- package/node_modules/request/node_modules/tough-cookie/node_modules/punycode/LICENSE-MIT.txt +0 -20
- package/node_modules/request/node_modules/tough-cookie/node_modules/punycode/README.md +0 -176
- package/node_modules/request/node_modules/tough-cookie/node_modules/punycode/package.json +0 -87
- package/node_modules/request/node_modules/tough-cookie/node_modules/punycode/punycode.js +0 -528
- package/node_modules/request/node_modules/tough-cookie/package.json +0 -67
- package/node_modules/request/node_modules/tough-cookie/public-suffix.txt +0 -5229
- package/node_modules/request/node_modules/tough-cookie/test.js +0 -1625
- package/node_modules/request/node_modules/tunnel-agent/.jshintrc +0 -5
- package/node_modules/request/node_modules/tunnel-agent/LICENSE +0 -55
- package/node_modules/request/node_modules/tunnel-agent/README.md +0 -4
- package/node_modules/request/node_modules/tunnel-agent/index.js +0 -236
- package/node_modules/request/node_modules/tunnel-agent/package.json +0 -46
- package/node_modules/request/package.json +0 -77
- package/node_modules/request/request.js +0 -1428
- package/test/fixtures/github-response.json +0 -1367
- 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
|