Research
Security News
Malicious npm Package Targets Solana Developers and Hijacks Funds
A malicious npm package targets Solana developers, rerouting funds in 2% of transactions to a hardcoded address.
urllib-next
Advanced tools
Help in opening URLs (mostly HTTP) in a complex world — basic and digest authentication, redirections, cookies and more. Base undici fetch API.
Request HTTP URLs in a complex world — basic and digest authentication, redirections, timeout and more.
npm install urllib
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);
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);
async request(url[, options])
GET
. Could be GET
, POST
, DELETE
or PUT
. Alias 'type'.data
will be ignored.data
and content
will be ignored.callback
will be called with data
set null
after finished writing.multipart/form-data
format, base on formstream
. If method
not set, will use POST
method by default.json
(Notes: not use application/json
here). If it's json
, will auto set Content-Type: application/json
header.text
or json
. If it's text
, the callback
ed 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 callback
ed data
would be a Buffer
.false
.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.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.username:password
used in HTTP Basic Authorization.username:password
used in HTTP Digest Authorization.url.resolve(from, to)
.res
object when request connected, default false
. alias customResponse
gzip, br
response content and auto decode it, default is true
.true
.null
.67108864
, 64 KiB.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.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.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 is normal object, it contains:
status
or statusCode
: response status code.
-1
meaning some network error like ENOTFOUND
-2
meaning ConnectionTimeoutErrorheaders
: response http headers, default is {}
size
: response sizeaborted
: response was aborted or notrt
: total request and response time in ms.timing
: timing object if timing enable.socket
: socket infoNODE_DEBUG=urllib:* npm test
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' });
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);
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 % |
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 % |
This project follows the git-contributor spec, auto updated at Mon Dec 04 2023 00:13:39 GMT+0800
.
FAQs
Help in opening URLs (mostly HTTP) in a complex world — basic and digest authentication, redirections, cookies and more. Base undici fetch API.
The npm package urllib-next receives a total of 829 weekly downloads. As such, urllib-next popularity was classified as not popular.
We found that urllib-next demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 12 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
Security News
A malicious npm package targets Solana developers, rerouting funds in 2% of transactions to a hardcoded address.
Security News
Research
Socket researchers have discovered malicious npm packages targeting crypto developers, stealing credentials and wallet data using spyware delivered through typosquats of popular cryptographic libraries.
Security News
Socket's package search now displays weekly downloads for npm packages, helping developers quickly assess popularity and make more informed decisions.