Giter Site home page Giter Site logo

urllib's Introduction

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

urllib's People

Contributors

alsotang avatar amunu avatar atian25 avatar azure-pipelines[bot] avatar changzhiwin avatar cyjake avatar dead-horse avatar denghongcai avatar elrrrrrrr avatar fengmk2 avatar fishbar avatar gemwuu avatar greenkeeperio-bot avatar gxcsoccer avatar hyj1991 avatar ibigbug avatar isayme avatar jacksontian avatar killagu avatar leoner avatar mars-coder avatar paambaati avatar popomore avatar renovate[bot] avatar rockdai avatar semantic-release-bot avatar tremby avatar xadillax avatar xingrz avatar yuzhigang33 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

urllib's Issues

Promise unit tests failed

AssertionError: expected {
  'accept-ranges': 'bytes',
  connection: 'Keep-Alive',
  'content-length': '6021',
  'content-type': 'text/html',
  date: 'Thu, 20 Nov 2014 04:32:02 GMT',
  'last-modified': 'Fri, 14 Nov 2014 22:18:43 GMT',
  'proxy-connection': 'Keep-Alive',
  server: 'nginx',
  via: '1.1 NET-CENTER'
} to have property connection of 'keep-alive' (got 'Keep-Alive')

Parse Error cause callback twice!!

'use strict';

var co = require('co');
var urllib = require('../');

co(function* () {
  var result = yield urllib.requestThunk('http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php');
  console.log('status: %s, body size: %d, headers: %j',
    result.res.statusCode, result.data.length, result.res.headers);
})();
$ DEBUG=urllib node --harmony examples/co_urllib.js 
  urllib Request#1 GET http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php with headers {"User-Agent":"node-urllib/2.0.1 node/v0.11.14 (darwin 14.0.0; x64)"}, options.path: /go/market/promotion-act/shengxian1111_mobile.php +0ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php `req response` event emit: status 200, headers: {"server":"Tengine","date":"Fri, 31 Oct 2014 15:06:04 GMT","content-type":"text/html; charset=GB2312","transfer-encoding":"chunked","connection":"keep-alive","vary":"Accept-Encoding","expires":"Fri, 31 Oct 2014 15:06:04 GMT","cache-control":"max-age=0"} +67ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1179 +3ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 11520 +0ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +0ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +6ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +0ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +1ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +2ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +0ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +1ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +2ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +1ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +0ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +2ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +0ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +1ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 790 +2ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 642 +0ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 2880 +1ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +1ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +1ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +4ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 2880 +0ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +1ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +1ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +1ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 2880 +1ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +2ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +0ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +1ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +1ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +1ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +1ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +0ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +1ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +1ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +1ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 325 +1ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1107 +0ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +0ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +1ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 2880 +1ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +2ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +0ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +2ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +0ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +1ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +1ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +2ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 2880 +0ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +1ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +2ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +0ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +1ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +1ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +1ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +1ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +0ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1210 +1ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 222 +0ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +2ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +0ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +1ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +1ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +1ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +0ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +3ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +1ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 2880 +1ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1440 +0ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 202 +1ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 1231 +0ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res data` event emit, size 117 +1ms
  urllib Request#1 /go/market/promotion-act/shengxian1111_mobile.php `req error` event emit, RequestError: Parse Error (req "error") +0ms
  urllib [143ms] 0 bytes HTTP -1 GET /go/market/promotion-act/shengxian1111_mobile.php +1ms
  urllib Request#1 /go/market/promotion-act/shengxian1111_mobile.php: `req close` event emit +1ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res aborted` event emit, total size 115025 +1ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res end` event emit, total size 115025, _dumped: false +0ms
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: Remote socket was terminated before `response.end()` was called +1ms
[urllib:warn] [Fri Oct 31 2014 23:06:04 GMT+0800 (CST)] [worker:3654] GET http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php callback twice!!!
  urllib Request#1 http://www.tmall.com/go/market/promotion-act/shengxian1111_mobile.php: `res close` event emit, total size 115025 +0ms
/Users/mk2/git/urllib/node_modules/co/index.js:292
    throw err;
          ^
Error: Parse Error
    at Error (native)
    at Socket.socketOnData (_http_client.js:309:20)
    at Socket.emit (events.js:107:17)
    at readableAddChunk (_stream_readable.js:162:16)
    at Socket.Readable.push (_stream_readable.js:125:10)
    at TCP.onread (net.js:514:20)

返回stream无法直接解压

var co = require('co');
var path = require('path');
var urllib = require('urllib');
var zlib = require('zlib');
var tar = require('tar');
co(function*() {
  var url = 'http://registry.npm.taobao.org/co/download/co-4.5.4.tgz';
  var stream = yield urllib.request(url, {
    streaming: true
  });
  yield unpack(path.join(__dirname, '/co'), stream.res);
})
.then(function() {
  console.log('end');
})
.catch(function(e) {
  console.log(e);
});

function unpack(dest, stream) {
  return function(callback) {
    stream
    .pipe(zlib.createGunzip())
    .pipe(tar.Extract({ path: dest }))
    .on('finish', callback)
    .once('end', callback);
  };
}

结果报错了:

events.js:141
      throw er; // Unhandled 'error' event
            ^
Error: incorrect header check
    at Zlib._handle.onerror (zlib.js:353:17)

上面的代码改成var stream = fs.createReadStream('./co-4.5.4.tgz');是没有问题的。

support promise

var urllib = require('urllib');

urllib.request('http://nodejs.org').then(function (result) {
  console.log('status: %s, body size: %d, headers: %j', result.res.statusCode, result.data.length, result.res.headers);
}).error(function (err) {
  console.error(err);
});

no support for proxy?

I ctrl+f in urllib's readme and source code, seems there is no any code for proxy?

POST空data会导致nginx报411 Length Required

lib/urllib.js 105-111行:

  if (body) {
    var length = body.length;
    if (!Buffer.isBuffer(body)) {
      length = Buffer.byteLength(body);
    }
    options.headers['Content-Length'] = length;
  }

后面应该加上

 else {
    options.headers['Content-Length'] = 0
  }

否则当没有data或content时,nginx会报错,因为没有Content-Length。

RequestError: Parse Error

我在Express里面有一个简单的返回,但是urllib似乎认为这个不是JSON。得到的error为

{ [RequestError: Parse Error, POST some_url]
  bytesParsed: 0,
  code: 'HPE_INVALID_CONSTANT',
  name: 'RequestError' }

回答方

app.all('/test', function(req, res) {
  var result = ["hello", "world"];
  res.end( JSON.stringify(result) ); //这个的确是JSON啊
});

请求方

urllib.request(url, {
  type: 'POST',
  data: {
    id: 1,
    type: 'text',
    text: 'hello'
  },
  timeout: 4500,
  dataType: 'json'
}, function(err, data) {
  console.log(err);
  console.log(data);
});

when will data in callback function be undefined?

urllib.request(url, options, function(err, body, resp){

        if(err){
            callback(err);
            return;
        }

        if(body.errcode){
            callback(body);
            return;
        }

        // logic
    });

we found body is undefined while err is null (means no error happend), then program crash because of "Cannot read property 'errcode' of null"

how to send https request with a .p12 certificate?

hello, my code is:

var url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack";

var options = {
    method: "POST",
    data: content,
    dataType: "text",
    pfx: p12_path,
    passphrase: params.mch_id,
    ca: ca_path,
    rejectUnauthorized: true
};

urllib.request(url, options, callback);

p12_path is .p12 file path, and params.mch_id is the password of the .p12 file

it seems not work

thanks very much

timing

  • dns lookup time
  • tcp socket connected time
  • ssl connected time
  • headers / response event time
  • first byte time (Time To First Byte)

README on Promise

The readme on Promise part is not proper. Actually, the project uses any-promise while not register bluebird. So people should be told to register their promise, otherwise the native promise would be used.

`req.end` should be called in any http request

server code:

require('http').createServer(function (req, res) {
  req.on('end', function () {
    res.end('hello world');
  });
}).listen(8124);

client code:

var urllib = require('urllib');

urllib.request('http://localhost:8124/hello', function (err, data, res) {
  console.log(err);
});

Differentce between node v0.8.14 and v0.10.21:

  • v0.8.14, http request ok
  • v0.10.21, RequestTimeoutError

Api not friendly

Only on method

  • http.request(url[, options][, callback])

But the options object is so big, That is very hard to config.

I think superagent provide api will more firendly.

上传文件时需要设置 agent 的 keepAliveTimeout 为 0

var fs = require('fs')
var Agent = require('agentkeepalive')
var HttpsAgent = Agent.HttpsAgent
var urllib = require('urllib')
var formstream = require('formstream')

var form = formstream();
form.stream('file', fs.createReadStream('./ddd.txt'), 'ddd.txt')

urllib.request('REMOTE', {
  method: 'POST',
  agent: new Agent(),
  httpsAgent: new HttpsAgent({
    //keepAliveTimeout: 0,  这行不设置的话,传一会儿会报错
  }),
  headers: form.headers(),
  stream: form,
  timeout: 1000 * 60 * 60,  // 60min
}).then(res => console.log(res), err => console.log(err))
{ [ResponseError: socket hang up (req "error"), POST

...

  status: -1,
  headers: {},
  res:
   { status: -1,
     statusCode: -1,
     headers: {},
     size: 0,
     aborted: false,
     rt: 35883,
     keepAliveSocket: false,
     data: undefined,

streaming support

var stream = yield urllib.request(url, {
  streaming: true
});

this.status = stream.status;
this.headers = stream.headers;
this.body = stream;

default user-agent

Should it be if (!options.headers['User-Agent'] && !options.headers['user-agent']) { rather than if (!options.headers['User-Agent'] || !options.headers['user-agent']) { in lib/urllib.js on line 280 ?

Error message triggered if callback not provided

If I call urllib.request() without specifying the optional callback parameter, I see this perplexing error in the console:

[urllib:warn] [Thu May 01 2014 10:03:27 GMT-0700 (PDT)] [worker:4225] POST http://localhost:4000/webhook_cb callback twice!!!

I certainly wasn't calling the callback twice, in fact I wasn't using the callback at all. From looking at the code, it looks like this console warning is completely superfluous.

support gzip response content decode

If the options.gzip = true, urllib will auto add options.headers["Accept-Encoding"] = 'gzip' and auto ungzip the gzip response content .

User also can disable gzip with options.gzip = false or ignore this argument.

Error: Hostname/IP doesn't match certificate's altnames while using https

I am getting below error if I try to use https urls having custom headers:

Error: Hostname/IP doesn't match certificate's altnames
at SecurePair. (tls.js:1379:23)
at SecurePair.EventEmitter.emit (events.js:92:17)
at SecurePair.maybeInitFinished (tls.js:982:10)
at CleartextStream.read as _read

This is my code:

urllib.request(urlToCall, { rejectUnauthorized:false, headers:requestHeaders }, function (err, data, response) {
if (err) {
throw err; // you need to handle error
}
});

As per documentation, I added rejectUnauthorized to false, but still I am getting same error. Can you please help me to know why this error occurs?Since I am comfortable with this library I don't want to switch to another library just because of this issue.

http default protocol for URL argument

Suggestion: Could we have "http" being default protocol if none is specified in the URL argument. Several libraries (curl, postman) follow this convention.

urllib.request('www.server.com');

Example: URL "www.server.com" will be rewritten as "http://www.server.com" since no protocol is specified.

provide remoteAddress info in global response event

var httpclient = require('urllib').create();

httpclient.on('response', function (info) {
  error: err,
  ctx: args.ctx,
  req: {
    url: url,
    remoteAddress: remoteAddress,
    options: options,
    size: requestSize,
  },
  res: res
});

httpclient.request('http://nodejs.org', function (err, body) {
  console.log('body size: %d', body.length);
});

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.