Detalhes do pacote

urllib-next

node-modules3.2kMIT3.22.4

Help in opening URLs (mostly HTTP) in a complex world — basic and digest authentication, redirections, cookies and more. Base undici fetch API.

urllib, http, urlopen, curl

readme (leia-me)

urllib

NPM version Node.js CI Test coverage Known Vulnerabilities npm download

Request HTTP URLs in a complex world — basic and digest authentication, redirections, timeout and more.

Install

npm install urllib

Usage

TypeScript and ESM

import { request } from 'urllib';

const { data, res } = await request('http://cnodejs.org/');
// result: { data: Buffer, res: Response }
console.log('status: %s, body size: %d, headers: %j', res.status, data.length, res.headers);

CommonJS

const { request } = require('urllib');

const { data, res } = await request('http://cnodejs.org/');
// result: { data: Buffer, res: Response }
console.log('status: %s, body size: %d, headers: %j', res.status, data.length, res.headers);

API Doc

Method: async request(url[, options])

Arguments

  • url String | Object - The URL to request, either a String or a Object that return by url.parse.
  • options Object - Optional
    • method String - Request method, defaults to GET. Could be GET, POST, DELETE or PUT. Alias 'type'.
    • data Object - Data to be sent. Will be stringify automatically.
    • content String | Buffer - Manually set the content of payload. If set, data will be ignored.
    • stream stream.Readable - Stream to be pipe to the remote. If set, data and content will be ignored.
    • writeStream stream.Writable - A writable stream to be piped by the response stream. Responding data will be write to this stream and callback will be called with data set null after finished writing.
    • files {Array<ReadStream|Buffer|String> | Object | ReadStream | Buffer | String - The files will send with multipart/form-data format, base on formstream. If method not set, will use POST method by default.
    • contentType String - Type of request data. Could be json (Notes: not use application/json here). If it's json, will auto set Content-Type: application/json header.
    • dataType String - Type of response data. Could be text or json. If it's text, the callbacked data would be a String. If it's json, the data of callback would be a parsed JSON Object and will auto set Accept: application/json header. Default callbacked data would be a Buffer.
    • fixJSONCtlChars Boolean - Fix the control characters (U+0000 through U+001F) before JSON parse response. Default is false.
    • headers Object - Request headers.
    • timeout Number | Array - Request timeout in milliseconds for connecting phase and response receiving phase. Default is 5000. You can use timeout: 5000 to tell urllib use same timeout on two phase or set them seperately such as timeout: [3000, 5000], which will set connecting timeout to 3s and response 5s.
    • keepAliveTimeout number | null - Default is 4000, 4 seconds - The timeout after which a socket without active requests will time out. Monitors time between activity on a connected socket. This value may be overridden by keep-alive hints from the server. See MDN: HTTP - Headers - Keep-Alive directives for more details.
    • auth String - username:password used in HTTP Basic Authorization.
    • digestAuth String - username:password used in HTTP Digest Authorization.
    • followRedirect Boolean - follow HTTP 3xx responses as redirects. defaults to true.
    • maxRedirects Number - The maximum number of redirects to follow, defaults to 10.
    • formatRedirectUrl Function - Format the redirect url by your self. Default is url.resolve(from, to).
    • beforeRequest Function - Before request hook, you can change every thing here.
    • streaming Boolean - let you get the res object when request connected, default false. alias customResponse
    • compressed Boolean - Accept gzip, br response content and auto decode it, default is true.
    • timing Boolean - Enable timing or not, default is true.
    • socketPath String | null - request a unix socket service, default is null.
    • highWaterMark Number - default is 67108864, 64 KiB.

Options: options.data

When making a request:

await request('https://example.com', {
  method: 'GET',
  data: {
    'a': 'hello',
    'b': 'world',
  },
});

For GET request, data will be stringify to query string, e.g. http://example.com/?a=hello&b=world.

For others like POST, PATCH or PUT request, in defaults, the data will be stringify into application/x-www-form-urlencoded format if content-type header is not set.

If content-type is application/json, the data will be JSON.stringify to JSON data format.

Options: options.content

options.content is useful when you wish to construct the request body by yourself, for example making a content-type: application/json request.

Notes that if you want to send a JSON body, you should stringify it yourself:

await request('https://example.com', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  content: JSON.stringify({
    a: 'hello',
    b: 'world',
  }),
});

It would make a HTTP request like:

POST / HTTP/1.1
host: example.com
content-type: application/json

{
  "a": "hello",
  "b": "world"
}

This exmaple can use options.data with application/json content type:

await request('https://example.com', {
  method: 'POST',
  headers: {
    'content-type': 'application/json'
  },
  data: {
    a: 'hello',
    b: 'world',
  }
});

Options: options.files

Upload a file with a hello field.

await request('https://example.com/upload', {
  method: 'POST',
  files: __filename,
  data: {
    hello: 'hello urllib',
  },
});

Upload multi files with a hello field.

await request('https://example.com/upload', {
  method: 'POST',
  files: [
    __filename,
    fs.createReadStream(__filename),
    Buffer.from('mock file content'),
  ],
  data: {
    hello: 'hello urllib with multi files',
  },
});

Custom file field name with uploadfile.

await request('https://example.com/upload', {
  method: 'POST',
  files: {
    uploadfile: __filename,
  },
});

Response Object

Response is normal object, it contains:

  • status or statusCode: response status code.
    • -1 meaning some network error like ENOTFOUND
    • -2 meaning ConnectionTimeoutError
  • headers: response http headers, default is {}
  • size: response size
  • aborted: response was aborted or not
  • rt: total request and response time in ms.
  • timing: timing object if timing enable.
  • socket: socket info

Run test with debug log

NODE_DEBUG=urllib:* npm test

Mocking Request

export from undici

import { strict as assert } from 'assert';
import { MockAgent, setGlobalDispatcher, request } from 'urllib';

const mockAgent = new MockAgent();
setGlobalDispatcher(mockAgent);

const mockPool = mockAgent.get('http://localhost:7001');

mockPool.intercept({
  path: '/foo',
  method: 'POST',
}).reply(400, {
  message: 'mock 400 bad request',
});

const response = await request('http://localhost:7001/foo', {
  method: 'POST',
  dataType: 'json',
});
assert.equal(response.status, 400);
assert.deepEqual(response.data, { message: 'mock 400 bad request' });

Request through a http proxy

export from undici

import { ProxyAgent, request } from 'urllib';

const proxyAgent = new ProxyAgent('http://my.proxy.com:8080');
const response = await request('https://www.npmjs.com/package/urllib', {
  dispatcher: proxyAgent,
});
console.log(response.status, response.headers);

Benchmarks

Fork undici benchmarks script

Connections 1

Tests Samples Result Tolerance Difference with slowest
http - no keepalive 15 6.38 req/sec ± 2.44 % -
http - keepalive 10 6.77 req/sec ± 2.35 % + 6.13 %
urllib2 - request 45 40.13 req/sec ± 2.88 % + 528.66 %
urllib3 - request 10 58.51 req/sec ± 2.52 % + 816.64 %
undici - pipeline 5 59.12 req/sec ± 2.47 % + 826.18 %
undici - fetch 15 60.42 req/sec ± 3.00 % + 846.60 %
undici - dispatch 5 60.58 req/sec ± 1.39 % + 848.99 %
undici - stream 5 61.30 req/sec ± 1.31 % + 860.39 %
undici - request 5 61.74 req/sec ± 2.03 % + 867.20 %

Connections 50

Tests Samples Result Tolerance Difference with slowest
urllib2 - request 51 1465.40 req/sec ± 14.40 % -
undici - fetch 40 3121.10 req/sec ± 2.82 % + 112.99 %
http - no keepalive 45 3355.42 req/sec ± 2.84 % + 128.98 %
http - keepalive 51 5179.55 req/sec ± 36.61 % + 253.46 %
urllib3 - request 30 7045.86 req/sec ± 2.93 % + 380.82 %
undici - pipeline 50 8306.92 req/sec ± 2.99 % + 466.87 %
undici - request 51 9552.59 req/sec ± 13.13 % + 551.88 %
undici - stream 45 12523.45 req/sec ± 2.97 % + 754.61 %
undici - dispatch 51 12970.18 req/sec ± 3.15 % + 785.10 %

Contributors


fengmk2


dead-horse


semantic-release-bot


xingrz


popomore


JacksonTian


ibigbug


greenkeeperio-bot


atian25


killagu


paambaati


tremby


denghongcai


gemwuu


XadillaX


alsotang


leoner


hyj1991


isayme


cyjake


whxaxes


chadxz


adapt0


danielwpz


danielsss


Jeff-Tian


nick-ng


rishavsharan


willizm


davidkhala


aleafs


Amunu


azure-pipelines[bot]


capsice


changzhiwin


yuzhigang33


elrrrrrrr


fishbar


gxcsoccer


mars-coder


rockdai


dickeylth


aladdin-add

This project follows the git-contributor spec, auto updated at Mon Dec 04 2023 00:13:39 GMT+0800.

License

MIT

changelog (log de mudanças)

Changelog

3.22.4 (2024-02-22)

Bug Fixes

  • options.method alias options.type is invalid (#490) (75c5989)

3.22.3 (2024-02-20)

Bug Fixes

3.22.2 (2024-01-15)

Bug Fixes

  • try to read opaque from handler property (#485) (5d543d9)

3.22.1 (2023-12-22)

Bug Fixes

3.22.0 (2023-12-21)

Features

3.21.0 (2023-12-04)

Features

  • print more socket info on UND_ERR_CONNECT_TIMEOUT error (#477) (366de1d)

3.20.0 (2023-12-04)

Features

3.19.3 (2023-09-21)

Bug Fixes

3.19.2 (2023-09-19)

Bug Fixes

  • change set-cookie type define to string | string[] (#471) (674915a)

3.19.1 (2023-09-17)

Bug Fixes

3.19.0 (2023-09-14)

Features

  • use tshy to support commonjs and esm both (#468) (b2576c0)

3.18.1 (2023-09-11)

Bug Fixes

3.18.0 (2023-08-18)

Features

  • support nestedQuerystring as urllib v2 (#462) (0f4abff)

3.17.2 (2023-08-17)

Bug Fixes

  • check writeStream destroyed before send request (#460) (78515b9)

3.17.1 (2023-06-15)

Bug Fixes

3.17.0 (2023-06-15)

Features

  • support tracing on diagnostics_channel (#452) (416b2ca)

3.16.1 (2023-05-24)

Bug Fixes

  • support request uds and tcp at the same time (#451) (3583219)

3.16.0 (2023-05-21)

Features

3.15.0 (2023-05-21)

Features

  • auto update USER_AGENT version to urllib package.version (#449) (d4e5f39)

3.14.1 (2023-05-17)

Bug Fixes

3.14.0 (2023-05-07)

Features

3.13.2 (2023-04-24)

Bug Fixes

  • force use undici@~5.21.2 to fix content-length error (#445) (331ed7e)

3.13.1 (2023-03-25)

Bug Fixes

  • ignore undefined value data on GET query (#441) (f40ce0a)

3.13.0 (2023-03-25)

Features

3.12.0 (2023-03-21)

Features

  • support reset to not reuse connection (#438) (3e12703)

3.11.0 (2023-02-18)

Features

3.10.2 (2023-02-13)

Bug Fixes

3.10.1 (2023-01-14)

Bug Fixes

  • keep urllib2 request with Type parameter (#432) (12f169e)

3.10.0 (2022-12-18)

Features


3.9.0 / 2022-12-17

features

3.8.1 / 2022-12-16

fixes

3.8.0 / 2022-12-14

features

3.7.0 / 2022-12-06

features

3.6.0 / 2022-12-05

features

3.5.2 / 2022-11-25

fixes

3.5.1 / 2022-11-19

fixes

others

3.5.0 / 2022-10-31

features

3.4.0 / 2022-10-29

features

others

3.3.1 / 2022-10-16

fixes

others

3.3.0 / 2022-10-05

features

3.2.3 / 2022-09-29

fixes

3.2.2 / 2022-09-28

fixes

3.2.1 / 2022-09-27

fixes

3.2.0 / 2022-09-26

others

3.1.3 / 2022-09-09

others

3.1.2 / 2022-08-24

others

3.1.1 / 2022-08-23

others

3.1.0 / 2022-08-01

others

3.0.4 / 2022-07-18

others

3.0.3 / 2022-07-17

others

3.0.2 / 2022-07-17

others

3.0.1 / 2022-07-17

others

3.0.0 / 2022-07-16

others

2.38.1 / 2022-07-05

fixes

others

2.38.0 / 2021-11-24

others

2.37.4 / 2021-09-07

fixes

others

2.37.3 / 2021-07-05

fixes

2.37.2 / 2021-06-07

fixes

2.37.1 / 2021-04-15

others

2.37.0 / 2021-04-02

features

others

2.36.1 / 2020-06-09

others

2.36.0 / 2020-06-08

fixes

others

2.35.0 / 2020-05-15

features

fixes

2.34.2 / 2019-12-09

fixes

2.34.1 / 2019-09-02

fixes

others

2.34.0 / 2019-05-07

features

others

2.33.4 / 2019-05-06

fixes

2.33.3 / 2019-04-11

others

2.33.2 / 2019-03-26

fixes

2.33.1 / 2019-03-21

fixes

2.33.0 / 2019-01-09

features

others

2.32.0 / 2019-01-07

features

2.31.3 / 2018-11-30

fixes

others

2.31.2 / 2018-11-13

fixes

2.31.1 / 2018-11-01

fixes

2.31.0 / 2018-10-24

features

2.30.0 / 2018-09-26

features

others

2.29.1 / 2018-07-26

fixes

2.29.0 / 2018-07-03

features

2.28.1 / 2018-06-01

fixes

others

2.28.0 / 2018-05-25

features

others

2.27.0 / 2018-03-26

features

2.26.0 / 2018-02-28

features

2.25.4 / 2018-01-18

fixes

2.25.3 / 2017-12-29

fixes

2.25.2 / 2017-12-28

fixes

2.25.1 / 2017-10-20

fixes

others

2.25.0 / 2017-09-08

features

2.24.0 / 2017-07-31

  • feat: support http(s) proxy (#226)

2.23.0 / 2017-07-18

  • test: skip test.webdav.org test cases
  • feat: add defaultArgs on HttpClient

2.22.0 / 2017-04-10

  • feat: add options.nestedQuerystring (#254)

2.21.2 / 2017-03-19

  • fix: don't listen response aborted on node > 0.12 (#252)

2.21.1 / 2017-03-16

  • fix: throw when write to stream timeout (#251)

2.21.0 / 2017-02-27

  • fix: should pass options to httpclient2 (#249)
  • test: fix Promise not defined on 0.10
  • test: use assert instead of should
  • feat: add retry delay on httpclient2

2.20.0 / 2017-02-06

  • deps: bump deps versions
  • fix: keep the same req object across request and response event

2.19.0 / 2016-12-14

  • feat: add dataAsQueryString params for convert data to query string (#240)

2.18.0 / 2016-12-07

  • fix: use nextTick to prevent promise handling error.
  • refactor: move to separated files
  • feat: add retry option

2.17.1 / 2016-11-25

  • add environment detection for connect timer, because no socket event in browser env (#236)

2.17.0 / 2016-10-13

  • feat: add -2 status for connect timeout (#224)

2.16.1 / 2016-10-10

  • fix: parse content-type (#221)

2.16.0 / 2016-09-27

  • feat: add custom dns lookup function (#220)

2.15.1 / 2016-09-26

  • fix: httpclient support set agent to false (#219)

2.15.0 / 2016-09-21

  • feat: export remoteAddress and remotePort (#216)

2.14.0 / 2016-09-19

  • feat: allow user to rewrite redirect url (#214)

2.13.2 / 2016-09-18

  • fix: response size should use last one (#213)

2.13.1 / 2016-09-10

  • fix: add missing ctx on request event (#210)

2.13.0 / 2016-08-09

  • feat: timing (#204)
  • docs: fix res.aborted description

2.12.0 / 2016-08-08

  • feat: support connect and response timeouts (#201)

2.11.1 / 2016-08-04

  • fix: catch http.request sync error (#199)

2.11.0 / 2016-06-26

  • deps: upgrade deps from ~ to ^ (#189)

2.10.0 / 2016-06-21

  • feat: add an options consumeWriteStream (#187)
  • chore(package): update statuses to version 1.3.0 (#174)

2.9.1 / 2016-05-09

  • fix: check url before request (#172)
  • chore(package): update any-promise to version 1.2.0 (#171)

2.9.0 / 2016-04-21

  • feat: log all requested urls (#169)
  • deps: agentkeepalive@2.1.1

2.8.0 / 2016-02-27

  • test: improve coverage
  • feat: http default protocol for URL argument

2.7.3 / 2016-02-27

  • deps: upgrade out of date deps

2.7.2 / 2016-02-25

  • test: support windows
  • fix: keep headers.Host on location: /foo redirect
  • test: use npmjs.com on travis ci
  • fix: jshint style
  • deps: any-promise instead of native-or-blubird

2.7.1 / 2016-02-02

  • fix: clean up headers.Host before redirect request start
  • chore: update authors

2.7.0 / 2016-01-14

  • feat: response event include data property
  • chore: Add host info into debug

2.6.0 / 2015-12-09

  • test: fix unstable test cases
  • feat: enhance global events
  • chore(package): update semver to version 5.1.0
  • chore(package): update should to version 7.1.1

2.5.0 / 2015-09-30

  • test: fix test url
  • feat: remove request# in error message
  • test: add streaming upload test
  • test: use codecov.io

2.4.0 / 2015-08-20

  • feat: add options.fixJSONCtlChars to fix JSON control characters
  • Fix a typo in comment

2.3.11 / 2015-08-12

  • fix: httpclient support curl too

2.3.10 / 2015-08-12

  • fix: add alias urllib.curl()
  • chore: add decodeBodyByCharset error debug log

2.3.9 / 2015-07-23

  • feat: show json format data when json parse error

2.3.8 / 2015-06-06

  • fix: need to clear timer after follow redirect

2.3.7 / 2015-06-04

  • test: use cnpmjs.org instead of taobao.com
  • fix: need to resume res before next redirect request start

2.3.6 / 2015-06-03

  • fix: support 303, 305, 307 redirect status code

2.3.5 / 2015-05-11

  • fix: followRedirect support customResponse.

2.3.4 / 2015-04-19

  • feat: show agent status message when request error

2.3.3 / 2015-03-30

  • fix: add ciphers and secureProtocol params support for https request

2.3.2 / 2015-03-29

  • refactor: httpclient custom agent property

2.3.1 / 2015-03-08

  • fix: auto decode gzip content

2.3.0 / 2015-02-16

  • feat: mark off connection state and response state

2.2.2 / 2015-01-21

  • remove unuse event handlers

2.2.1 / 2014-12-10

  • refactor and add more comments
  • add path to error (@coderhaoxin)
  • fix promise example in readme

2.2.0 / 2014-11-28

  • add customResponse option (@fishbar)

2.1.0 / 2014-11-15

  • humanize timeout

2.0.2 / 2014-11-01

  • chore: bump deps version and make test more stable
  • refactor: dont add new property on res object

2.0.1 / 2014-10-15

  • add args.contentType option (@coderhaoxin)
  • Simply the HTTPClient implementation (@JacksonTian)
  • refine urllib code (@JacksonTian)

2.0.0 / 2014-10-13

  • support auto decode charset when dataType set

1.5.2 / 2014-09-15

  • do not check ssl, fix hang up in some node version

1.5.1 / 2014-09-10

  • httpclient add requestThunk()

1.5.0 / 2014-09-10

  • add requestThunk to support co

1.4.1 / 2014-08-28

  • HttpClient support agent and httpsAgent

1.4.0 / 2014-08-27

  • add SocketAssignTimeoutError. #37

1.3.1 / 2014-08-27

  • convert data to string when dataType is text

1.3.0 / 2014-08-26

  • add urllib instance

1.2.1 / 2014-08-26

  • add args.ctx for response event easy logging

1.2.0 / 2014-08-26

  • format Response object fields

1.1.0 / 2014-08-25

  • global response event. fixed #35

1.0.0 / 2014-08-25

  • return Promise when callback missing. fixed #33
  • rm Makefile
  • use flat image

0.5.17 / 2014-08-08

  • Remove aborted. joyent/node#7457
  • missing I in urllib logo

0.5.16 / 2014-05-15

  • fix test cases
  • change .once to .on (@alsotang)

0.5.15 / 2014-05-04

  • make callback is optional. close #29
  • rm 0.8 from travis

0.5.14 / 2014-04-21

  • fix #28 user-agent logic bug

0.5.13 / 2014-03-31

  • use digest-header module

0.5.12 / 2014-03-29

  • support Digest access authentication. fix #27
  • add co-urllib desc

0.5.11 / 2014-03-13

  • improve user-agent, add node version and plaform detail

0.5.10 / 2014-03-11

  • if body not decode, dont touch it

0.5.9 / 2014-03-10

  • Support options.gzip = true to handle gzip response. fixed #26

0.5.8 / 2014-03-07

  • remove buffer-concat

0.5.7 / 2014-03-07

  • no more deps on buffer-concat
  • add default User-Agent: node-urllib/x.x.x
  • add jshint

0.5.6 / 2014-03-05

  • add data/res to error
  • fix typo (@coderhaoxin)
  • access npmjs.org https
  • fix test cases and use autod
  • install from cnpm
  • no more support on node 0.6.x

0.5.5 / 2013-12-10

  • should pass done instead of callback and end the writeStream
  • support args.writeStream with follow redirect (@dead-horse)

0.5.4 / 2013-11-09

  • fix timeout not effect bug

0.5.3 / 2013-10-18

  • add args.beforeRequest(options) hook to change options before http send

0.5.2 / 2013-09-23

  • add JSONResponseFormatError; append request url infomation to err.message

0.5.1 / 2013-08-23

  • detect connect timeout or response timeout fixed #18
  • update doc

0.5.0 / 2013-08-11

  • Support max redirects to protect loop redirect
  • Auto redirect handle (@ibigbug)

0.4.4 / 2013-08-10

  • handle json response to null when data size is zero

0.4.3 / 2013-08-10

  • Auto convert data to json string when content-type is 'json' fixed #15
  • add drone.io status build image

0.4.2 / 2013-08-10

  • fix SELF_SIGNED_CERT_IN_CHAIN test case on node 0.8 and 0.6
  • [√] https & self-signed certificate

0.4.1 / 2013-08-05

  • return RemoteSocketClosedError when Remote socket was terminated before response.end() was called

0.4.0 / 2013-08-05

  • If the underlaying connection was terminated before response.end() was called, res.aborted should be true. fixed #14
  • fixed test case for 0.6
  • add res.socket.end() test cases
  • remove 0.11 from travis

0.3.8 / 2013-08-02

  • add debug log

0.3.7 / 2013-07-11

  • PATCH method is also "application/x-www-form-urlencoded" by default
  • replace logo

0.3.6 / 2013-07-11

  • fixed bug in processing query string #13 (@xingrz)
  • updated readme example (@xingrz)
  • update authors
  • API docs (@xingrz)

0.3.5 / 2013-07-10

  • fixed writeSteam receive incomplete bug
  • update makefile
  • add coveralls
  • remove 0.11 from travis
  • add patch for node 0.6
  • fixed https request timeout tests
  • use blanket instead of jscover

0.3.4 / 2013-03-06

  • fixed #8 auto add application/x-www-form-urlencoded
  • fixed existsSync for node < 0.8

0.3.3 / 2012-12-14

  • support writeStream

0.3.2 / 2012-11-08

  • fixed #4 support urllib.request(options, args, callback)
  • fixed usage demo bug
  • fixed readme

0.3.1 / 2012-11-05

  • fixed #2 support stream and return the req object.
  • use jscover instead of jscoverage

0.3.0 / 2012-10-10

  • add coverage results
  • Bash auth support: http://user:password@http://demo.com .