@contrast/agent 4.4.1 → 4.6.0
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/bin/VERSION +1 -1
- package/bin/linux/contrast-service +0 -0
- package/bin/mac/contrast-service +0 -0
- package/bin/windows/contrast-service.exe +0 -0
- package/lib/assess/hapi/route-coverage.js +3 -3
- package/lib/assess/membrane/index.js +2 -8
- package/lib/assess/membrane/source-membrane.js +3 -4
- package/lib/assess/models/base-event.js +2 -2
- package/lib/assess/models/call-context.js +0 -3
- package/lib/assess/policy/propagators.json +20 -0
- package/lib/assess/policy/signatures.json +103 -0
- package/lib/assess/propagators/path/common.js +165 -36
- package/lib/assess/propagators/path/join.js +5 -1
- package/lib/assess/propagators/path/normalize.js +5 -1
- package/lib/assess/propagators/path/resolve.js +11 -2
- package/lib/assess/response-scanning/autocomplete-missing.js +0 -2
- package/lib/assess/response-scanning/parameter-pollution.js +0 -2
- package/lib/core/arch-components/dynamodb.js +1 -2
- package/lib/core/arch-components/dynamodbv3.js +44 -0
- package/lib/core/arch-components/index.js +1 -0
- package/lib/core/async-storage/hooks/bluebird.js +20 -0
- package/lib/core/config/options.js +3 -2
- package/lib/core/express/utils.js +1 -1
- package/lib/core/logger/debug-logger.js +15 -17
- package/lib/core/stacktrace.js +3 -4
- package/lib/feature-set.js +2 -1
- package/lib/hooks/encoding.js +1 -1
- package/lib/hooks/frameworks/base.js +8 -2
- package/lib/hooks/frameworks/http.js +23 -16
- package/lib/hooks/frameworks/http2.js +73 -0
- package/lib/hooks/frameworks/index.js +8 -3
- package/lib/hooks/http.js +112 -128
- package/lib/hooks/patcher.js +10 -12
- package/lib/hooks/require.js +16 -22
- package/lib/instrumentation.js +0 -3
- package/lib/protect/analysis/aho-corasick.js +13 -30
- package/lib/protect/rules/cmd-injection-command-backdoors/backdoor-detector.js +3 -3
- package/lib/protect/rules/signatures/reflected-xss/helpers/function-call.js +1 -1
- package/lib/protect/rules/xss/helpers/function-call.js +1 -1
- package/lib/util/clean-stack.js +1 -1
- package/lib/util/clean-string/brackets.js +3 -3
- package/lib/util/clean-string/concatenations.js +1 -1
- package/lib/util/clean-string/util.js +1 -2
- package/lib/util/ip-analyzer.js +1 -1
- package/lib/util/some.js +27 -0
- package/lib/util/xml-analyzer/external-entity-finder.js +1 -1
- package/package.json +14 -15
- package/lib/hooks/frameworks/https.js +0 -42
- package/node_modules/bindings/LICENSE.md +0 -22
- package/node_modules/bindings/README.md +0 -98
- package/node_modules/bindings/bindings.js +0 -221
- package/node_modules/bindings/package.json +0 -32
- package/node_modules/file-uri-to-path/.npmignore +0 -1
- package/node_modules/file-uri-to-path/.travis.yml +0 -30
- package/node_modules/file-uri-to-path/History.md +0 -21
- package/node_modules/file-uri-to-path/LICENSE +0 -20
- package/node_modules/file-uri-to-path/README.md +0 -74
- package/node_modules/file-uri-to-path/index.d.ts +0 -2
- package/node_modules/file-uri-to-path/index.js +0 -66
- package/node_modules/file-uri-to-path/package.json +0 -36
- package/node_modules/file-uri-to-path/test/test.js +0 -24
- package/node_modules/file-uri-to-path/test/tests.json +0 -13
- package/node_modules/glossy/LICENSE +0 -19
- package/node_modules/glossy/README.md +0 -129
- package/node_modules/glossy/index.js +0 -12
- package/node_modules/glossy/lib/glossy/parse.js +0 -520
- package/node_modules/glossy/lib/glossy/produce.js +0 -459
- package/node_modules/glossy/package.json +0 -47
- package/node_modules/glossy/test/decide.js +0 -7
- package/node_modules/glossy/test/decode_pri.js +0 -24
- package/node_modules/glossy/test/parse_3164.js +0 -104
- package/node_modules/glossy/test/parse_5424.js +0 -106
- package/node_modules/glossy/test/parse_5848.js +0 -40
- package/node_modules/glossy/test/parse_8601.js +0 -14
- package/node_modules/glossy/test/parse_rfc3339.js +0 -9
- package/node_modules/glossy/test/produce.js +0 -162
- package/node_modules/glossy/test/runner.js +0 -40
- package/node_modules/glossy/test/structure_data.js +0 -24
- package/node_modules/nan/CHANGELOG.md +0 -537
- package/node_modules/nan/LICENSE.md +0 -13
- package/node_modules/nan/README.md +0 -455
- package/node_modules/nan/doc/asyncworker.md +0 -146
- package/node_modules/nan/doc/buffers.md +0 -54
- package/node_modules/nan/doc/callback.md +0 -76
- package/node_modules/nan/doc/converters.md +0 -41
- package/node_modules/nan/doc/errors.md +0 -226
- package/node_modules/nan/doc/json.md +0 -62
- package/node_modules/nan/doc/maybe_types.md +0 -583
- package/node_modules/nan/doc/methods.md +0 -664
- package/node_modules/nan/doc/new.md +0 -147
- package/node_modules/nan/doc/node_misc.md +0 -123
- package/node_modules/nan/doc/object_wrappers.md +0 -263
- package/node_modules/nan/doc/persistent.md +0 -296
- package/node_modules/nan/doc/scopes.md +0 -73
- package/node_modules/nan/doc/script.md +0 -38
- package/node_modules/nan/doc/string_bytes.md +0 -62
- package/node_modules/nan/doc/v8_internals.md +0 -199
- package/node_modules/nan/doc/v8_misc.md +0 -85
- package/node_modules/nan/include_dirs.js +0 -1
- package/node_modules/nan/nan.h +0 -2898
- package/node_modules/nan/nan_callbacks.h +0 -88
- package/node_modules/nan/nan_callbacks_12_inl.h +0 -514
- package/node_modules/nan/nan_callbacks_pre_12_inl.h +0 -520
- package/node_modules/nan/nan_converters.h +0 -72
- package/node_modules/nan/nan_converters_43_inl.h +0 -68
- package/node_modules/nan/nan_converters_pre_43_inl.h +0 -42
- package/node_modules/nan/nan_define_own_property_helper.h +0 -29
- package/node_modules/nan/nan_implementation_12_inl.h +0 -430
- package/node_modules/nan/nan_implementation_pre_12_inl.h +0 -263
- package/node_modules/nan/nan_json.h +0 -166
- package/node_modules/nan/nan_maybe_43_inl.h +0 -356
- package/node_modules/nan/nan_maybe_pre_43_inl.h +0 -268
- package/node_modules/nan/nan_new.h +0 -340
- package/node_modules/nan/nan_object_wrap.h +0 -156
- package/node_modules/nan/nan_persistent_12_inl.h +0 -132
- package/node_modules/nan/nan_persistent_pre_12_inl.h +0 -242
- package/node_modules/nan/nan_private.h +0 -73
- package/node_modules/nan/nan_string_bytes.h +0 -305
- package/node_modules/nan/nan_typedarray_contents.h +0 -96
- package/node_modules/nan/nan_weak.h +0 -437
- package/node_modules/nan/package.json +0 -41
- package/node_modules/nan/tools/1to2.js +0 -412
- package/node_modules/nan/tools/README.md +0 -14
- package/node_modules/nan/tools/package.json +0 -19
- package/node_modules/unix-dgram/LICENSE +0 -13
- package/node_modules/unix-dgram/README.md +0 -107
- package/node_modules/unix-dgram/binding.gyp +0 -20
- package/node_modules/unix-dgram/build/Makefile +0 -324
- package/node_modules/unix-dgram/build/Release/.deps/Release/obj.target/unix_dgram/src/unix_dgram.o.d +0 -58
- package/node_modules/unix-dgram/build/Release/.deps/Release/obj.target/unix_dgram.node.d +0 -1
- package/node_modules/unix-dgram/build/Release/.deps/Release/unix_dgram.node.d +0 -1
- package/node_modules/unix-dgram/build/Release/obj.target/unix_dgram/src/unix_dgram.o +0 -0
- package/node_modules/unix-dgram/build/Release/obj.target/unix_dgram.node +0 -0
- package/node_modules/unix-dgram/build/Release/unix_dgram.node +0 -0
- package/node_modules/unix-dgram/build/binding.Makefile +0 -6
- package/node_modules/unix-dgram/build/config.gypi +0 -213
- package/node_modules/unix-dgram/build/unix_dgram.target.mk +0 -159
- package/node_modules/unix-dgram/lib/unix_dgram.js +0 -168
- package/node_modules/unix-dgram/package.json +0 -36
- package/node_modules/unix-dgram/src/unix_dgram.cc +0 -404
- package/node_modules/unix-dgram/src/win_dummy.cc +0 -7
- package/node_modules/unix-dgram/test/test-connect-callback.js +0 -68
- package/node_modules/unix-dgram/test/test-connect.js +0 -53
- package/node_modules/unix-dgram/test/test-dgram-unix.js +0 -58
- package/node_modules/unix-dgram/test/test-send-error.js +0 -26
- package/node_modules/winston-syslog/.eslintrc +0 -7
- package/node_modules/winston-syslog/.travis.yml +0 -14
- package/node_modules/winston-syslog/CHANGELOG.md +0 -9
- package/node_modules/winston-syslog/LICENSE +0 -20
- package/node_modules/winston-syslog/README.md +0 -135
- package/node_modules/winston-syslog/lib/utils.js +0 -26
- package/node_modules/winston-syslog/lib/winston-syslog.js +0 -385
- package/node_modules/winston-syslog/package.json +0 -56
- package/node_modules/winston-syslog/test/format-test.js +0 -122
- package/node_modules/winston-syslog/test/syslog-test.js +0 -95
- package/node_modules/winston-syslog/test/unix-connect-test.js +0 -133
|
@@ -1,404 +0,0 @@
|
|
|
1
|
-
// -D_GNU_SOURCE makes SOCK_NONBLOCK etc. available on linux
|
|
2
|
-
#undef _GNU_SOURCE
|
|
3
|
-
#define _GNU_SOURCE
|
|
4
|
-
|
|
5
|
-
#include <nan.h>
|
|
6
|
-
|
|
7
|
-
#include <errno.h>
|
|
8
|
-
#include <stddef.h>
|
|
9
|
-
#include <unistd.h>
|
|
10
|
-
#include <fcntl.h>
|
|
11
|
-
|
|
12
|
-
#include <sys/types.h>
|
|
13
|
-
#include <sys/stat.h>
|
|
14
|
-
|
|
15
|
-
#include <sys/socket.h>
|
|
16
|
-
#include <sys/un.h>
|
|
17
|
-
|
|
18
|
-
#include <map>
|
|
19
|
-
|
|
20
|
-
#define offset_of(type, member) \
|
|
21
|
-
((intptr_t) ((char *) &(((type *) 8)->member) - 8))
|
|
22
|
-
|
|
23
|
-
#define container_of(ptr, type, member) \
|
|
24
|
-
((type *) ((char *) (ptr) - offset_of(type, member)))
|
|
25
|
-
|
|
26
|
-
namespace {
|
|
27
|
-
|
|
28
|
-
void OnEvent(uv_poll_t* handle, int status, int events);
|
|
29
|
-
|
|
30
|
-
using v8::Context;
|
|
31
|
-
using v8::Function;
|
|
32
|
-
using v8::FunctionTemplate;
|
|
33
|
-
using v8::Integer;
|
|
34
|
-
using v8::Local;
|
|
35
|
-
using v8::Null;
|
|
36
|
-
using v8::Object;
|
|
37
|
-
using v8::Persistent;
|
|
38
|
-
using v8::String;
|
|
39
|
-
using v8::Value;
|
|
40
|
-
|
|
41
|
-
struct SocketContext {
|
|
42
|
-
Nan::Callback recv_cb_;
|
|
43
|
-
Nan::Callback writable_cb_;
|
|
44
|
-
uv_poll_t handle_;
|
|
45
|
-
int fd_;
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
typedef std::map<int, SocketContext*> watchers_t;
|
|
49
|
-
|
|
50
|
-
watchers_t watchers;
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
inline void SetNonBlock(int fd) {
|
|
54
|
-
int flags;
|
|
55
|
-
int r;
|
|
56
|
-
|
|
57
|
-
flags = fcntl(fd, F_GETFL);
|
|
58
|
-
assert(flags != -1);
|
|
59
|
-
|
|
60
|
-
r = fcntl(fd, F_SETFL, flags | O_NONBLOCK);
|
|
61
|
-
assert(r != -1);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
inline void SetCloExec(int fd) {
|
|
66
|
-
int flags;
|
|
67
|
-
int r;
|
|
68
|
-
|
|
69
|
-
flags = fcntl(fd, F_GETFD);
|
|
70
|
-
assert(flags != -1);
|
|
71
|
-
|
|
72
|
-
r = fcntl(fd, F_SETFD, flags | FD_CLOEXEC);
|
|
73
|
-
assert(r != -1);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
void OnRecv(SocketContext* sc) {
|
|
77
|
-
Nan::HandleScope scope;
|
|
78
|
-
Local<Value> argv[3];
|
|
79
|
-
msghdr msg;
|
|
80
|
-
iovec iov;
|
|
81
|
-
ssize_t err;
|
|
82
|
-
char scratch[65536];
|
|
83
|
-
|
|
84
|
-
/* Union to avoid breaking strict-aliasing rules */
|
|
85
|
-
union {
|
|
86
|
-
struct sockaddr_un s;
|
|
87
|
-
struct sockaddr_storage ss;
|
|
88
|
-
} u_addr;
|
|
89
|
-
|
|
90
|
-
argv[0] = argv[1] = argv[2] = Nan::Null();
|
|
91
|
-
|
|
92
|
-
iov.iov_base = scratch;
|
|
93
|
-
iov.iov_len = sizeof scratch;
|
|
94
|
-
|
|
95
|
-
u_addr.s.sun_path[0] = '\0';
|
|
96
|
-
|
|
97
|
-
memset(&msg, 0, sizeof msg);
|
|
98
|
-
msg.msg_iovlen = 1;
|
|
99
|
-
msg.msg_iov = &iov;
|
|
100
|
-
msg.msg_name = &u_addr.ss;
|
|
101
|
-
msg.msg_namelen = sizeof u_addr.ss;
|
|
102
|
-
|
|
103
|
-
do
|
|
104
|
-
err = recvmsg(sc->fd_, &msg, 0);
|
|
105
|
-
while (err == -1 && errno == EINTR);
|
|
106
|
-
|
|
107
|
-
if (err == -1) {
|
|
108
|
-
err = -errno;
|
|
109
|
-
} else {
|
|
110
|
-
argv[1] = Nan::CopyBuffer(scratch, err).ToLocalChecked();
|
|
111
|
-
if (u_addr.s.sun_path[0] != '\0') {
|
|
112
|
-
argv[2] = Nan::New<String>(u_addr.s.sun_path).ToLocalChecked();
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
argv[0] = Nan::New<Integer>(static_cast<int32_t>(err));
|
|
117
|
-
|
|
118
|
-
Nan::Call(sc->recv_cb_, sizeof(argv) / sizeof(argv[0]), argv);
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
void OnWritable(SocketContext* sc) {
|
|
122
|
-
Nan::HandleScope scope;
|
|
123
|
-
uv_poll_start(&sc->handle_, UV_READABLE, OnEvent);
|
|
124
|
-
Nan::Call(sc->writable_cb_, 0, NULL);
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
void OnEvent(uv_poll_t* handle, int status, int events) {
|
|
128
|
-
assert(0 == status);
|
|
129
|
-
assert(0 == (events & ~(UV_READABLE | UV_WRITABLE)));
|
|
130
|
-
SocketContext* sc = container_of(handle, SocketContext, handle_);
|
|
131
|
-
if (events & UV_READABLE)
|
|
132
|
-
OnRecv(sc);
|
|
133
|
-
|
|
134
|
-
if (events & UV_WRITABLE)
|
|
135
|
-
OnWritable(sc);
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
void StartWatcher(int fd, Local<Value> recv_cb, Local<Value> writable_cb) {
|
|
139
|
-
// start listening for incoming dgrams
|
|
140
|
-
SocketContext* sc = new SocketContext;
|
|
141
|
-
sc->recv_cb_.Reset(recv_cb.As<Function>());
|
|
142
|
-
sc->writable_cb_.Reset(writable_cb.As<Function>());
|
|
143
|
-
sc->fd_ = fd;
|
|
144
|
-
|
|
145
|
-
uv_poll_init(uv_default_loop(), &sc->handle_, fd);
|
|
146
|
-
uv_poll_start(&sc->handle_, UV_READABLE, OnEvent);
|
|
147
|
-
|
|
148
|
-
// so we can disarm the watcher when close(fd) is called
|
|
149
|
-
watchers.insert(watchers_t::value_type(fd, sc));
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
void FreeSocketContext(uv_handle_t* handle) {
|
|
154
|
-
SocketContext* sc = container_of(handle, SocketContext, handle_);
|
|
155
|
-
delete sc;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
void StopWatcher(int fd) {
|
|
160
|
-
watchers_t::iterator iter = watchers.find(fd);
|
|
161
|
-
assert(iter != watchers.end());
|
|
162
|
-
|
|
163
|
-
SocketContext* sc = iter->second;
|
|
164
|
-
sc->recv_cb_.Reset();
|
|
165
|
-
sc->writable_cb_.Reset();
|
|
166
|
-
watchers.erase(iter);
|
|
167
|
-
|
|
168
|
-
uv_poll_stop(&sc->handle_);
|
|
169
|
-
uv_close(reinterpret_cast<uv_handle_t*>(&sc->handle_), FreeSocketContext);
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
NAN_METHOD(Socket) {
|
|
174
|
-
Nan::HandleScope scope;
|
|
175
|
-
Local<Value> recv_cb;
|
|
176
|
-
Local<Value> writable_cb;
|
|
177
|
-
int protocol;
|
|
178
|
-
int domain;
|
|
179
|
-
int type;
|
|
180
|
-
int fd;
|
|
181
|
-
|
|
182
|
-
assert(info.Length() == 5);
|
|
183
|
-
|
|
184
|
-
domain = Nan::To<int32_t>(info[0]).FromJust();
|
|
185
|
-
type = Nan::To<int32_t>(info[1]).FromJust();
|
|
186
|
-
protocol = Nan::To<int32_t>(info[2]).FromJust();
|
|
187
|
-
recv_cb = info[3];
|
|
188
|
-
writable_cb = info[4];
|
|
189
|
-
|
|
190
|
-
#if defined(SOCK_NONBLOCK)
|
|
191
|
-
type |= SOCK_NONBLOCK;
|
|
192
|
-
#endif
|
|
193
|
-
#if defined(SOCK_CLOEXEC)
|
|
194
|
-
type |= SOCK_CLOEXEC;
|
|
195
|
-
#endif
|
|
196
|
-
|
|
197
|
-
fd = socket(domain, type, protocol);
|
|
198
|
-
if (fd == -1) {
|
|
199
|
-
fd = -errno;
|
|
200
|
-
goto out;
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
#if !defined(SOCK_NONBLOCK)
|
|
204
|
-
SetNonBlock(fd);
|
|
205
|
-
#endif
|
|
206
|
-
#if !defined(SOCK_CLOEXEC)
|
|
207
|
-
SetCloExec(fd);
|
|
208
|
-
#endif
|
|
209
|
-
|
|
210
|
-
StartWatcher(fd, recv_cb, writable_cb);
|
|
211
|
-
|
|
212
|
-
out:
|
|
213
|
-
info.GetReturnValue().Set(fd);
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
NAN_METHOD(Bind) {
|
|
218
|
-
Nan::HandleScope scope;
|
|
219
|
-
sockaddr_un s;
|
|
220
|
-
int err;
|
|
221
|
-
int fd;
|
|
222
|
-
|
|
223
|
-
assert(info.Length() == 2);
|
|
224
|
-
|
|
225
|
-
fd = Nan::To<int32_t>(info[0]).FromJust();
|
|
226
|
-
Nan::Utf8String path(info[1]);
|
|
227
|
-
|
|
228
|
-
memset(&s, 0, sizeof(s));
|
|
229
|
-
strncpy(s.sun_path, *path, sizeof(s.sun_path) - 1);
|
|
230
|
-
s.sun_family = AF_UNIX;
|
|
231
|
-
|
|
232
|
-
err = 0;
|
|
233
|
-
if (bind(fd, reinterpret_cast<sockaddr*>(&s), sizeof(s)))
|
|
234
|
-
err = -errno;
|
|
235
|
-
|
|
236
|
-
info.GetReturnValue().Set(err);
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
NAN_METHOD(SendTo) {
|
|
240
|
-
Nan::HandleScope scope;
|
|
241
|
-
Local<Object> buf;
|
|
242
|
-
sockaddr_un s;
|
|
243
|
-
size_t offset;
|
|
244
|
-
size_t length;
|
|
245
|
-
msghdr msg;
|
|
246
|
-
iovec iov;
|
|
247
|
-
int err;
|
|
248
|
-
int fd;
|
|
249
|
-
int r;
|
|
250
|
-
|
|
251
|
-
assert(info.Length() == 5);
|
|
252
|
-
|
|
253
|
-
fd = Nan::To<int32_t>(info[0]).FromJust();
|
|
254
|
-
buf = Nan::To<Object>(info[1]).ToLocalChecked();
|
|
255
|
-
offset = Nan::To<uint32_t>(info[2]).FromJust();
|
|
256
|
-
length = Nan::To<uint32_t>(info[3]).FromJust();
|
|
257
|
-
Nan::Utf8String path(info[4]);
|
|
258
|
-
|
|
259
|
-
assert(node::Buffer::HasInstance(buf));
|
|
260
|
-
assert(offset + length <= node::Buffer::Length(buf));
|
|
261
|
-
|
|
262
|
-
iov.iov_base = node::Buffer::Data(buf) + offset;
|
|
263
|
-
iov.iov_len = length;
|
|
264
|
-
|
|
265
|
-
memset(&s, 0, sizeof(s));
|
|
266
|
-
strncpy(s.sun_path, *path, sizeof(s.sun_path) - 1);
|
|
267
|
-
s.sun_family = AF_UNIX;
|
|
268
|
-
|
|
269
|
-
memset(&msg, 0, sizeof msg);
|
|
270
|
-
msg.msg_iovlen = 1;
|
|
271
|
-
msg.msg_iov = &iov;
|
|
272
|
-
msg.msg_name = reinterpret_cast<void*>(&s);
|
|
273
|
-
msg.msg_namelen = sizeof(s);
|
|
274
|
-
|
|
275
|
-
do
|
|
276
|
-
r = sendmsg(fd, &msg, 0);
|
|
277
|
-
while (r == -1 && errno == EINTR);
|
|
278
|
-
|
|
279
|
-
err = 0;
|
|
280
|
-
if (r == -1)
|
|
281
|
-
err = -errno;
|
|
282
|
-
|
|
283
|
-
info.GetReturnValue().Set(err);
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
NAN_METHOD(Send) {
|
|
287
|
-
Nan::HandleScope scope;
|
|
288
|
-
Local<Object> buf;
|
|
289
|
-
msghdr msg;
|
|
290
|
-
iovec iov;
|
|
291
|
-
int err;
|
|
292
|
-
int fd;
|
|
293
|
-
int r;
|
|
294
|
-
|
|
295
|
-
assert(info.Length() == 2);
|
|
296
|
-
|
|
297
|
-
fd = Nan::To<int32_t>(info[0]).FromJust();
|
|
298
|
-
buf = Nan::To<Object>(info[1]).ToLocalChecked();
|
|
299
|
-
assert(node::Buffer::HasInstance(buf));
|
|
300
|
-
|
|
301
|
-
iov.iov_base = node::Buffer::Data(buf);
|
|
302
|
-
iov.iov_len = node::Buffer::Length(buf);
|
|
303
|
-
|
|
304
|
-
memset(&msg, 0, sizeof msg);
|
|
305
|
-
msg.msg_iovlen = 1;
|
|
306
|
-
msg.msg_iov = &iov;
|
|
307
|
-
|
|
308
|
-
do
|
|
309
|
-
r = sendmsg(fd, &msg, 0);
|
|
310
|
-
while (r == -1 && errno == EINTR);
|
|
311
|
-
|
|
312
|
-
err = 0;
|
|
313
|
-
if (r == -1) {
|
|
314
|
-
err = -errno;
|
|
315
|
-
if ((errno == EAGAIN) || (errno == EWOULDBLOCK) || (errno == ENOBUFS)) {
|
|
316
|
-
watchers_t::iterator iter = watchers.find(fd);
|
|
317
|
-
assert(iter != watchers.end());
|
|
318
|
-
SocketContext* sc = iter->second;
|
|
319
|
-
uv_poll_start(&sc->handle_, UV_READABLE | UV_WRITABLE, OnEvent);
|
|
320
|
-
err = 1;
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
info.GetReturnValue().Set(err);
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
NAN_METHOD(Connect) {
|
|
328
|
-
Nan::HandleScope scope;
|
|
329
|
-
sockaddr_un s;
|
|
330
|
-
int err;
|
|
331
|
-
int fd;
|
|
332
|
-
|
|
333
|
-
assert(info.Length() == 2);
|
|
334
|
-
|
|
335
|
-
fd = Nan::To<int32_t>(info[0]).FromJust();
|
|
336
|
-
Nan::Utf8String path(info[1]);
|
|
337
|
-
|
|
338
|
-
memset(&s, 0, sizeof(s));
|
|
339
|
-
strncpy(s.sun_path, *path, sizeof(s.sun_path) - 1);
|
|
340
|
-
s.sun_family = AF_UNIX;
|
|
341
|
-
|
|
342
|
-
err = 0;
|
|
343
|
-
if (connect(fd, reinterpret_cast<sockaddr*>(&s), sizeof(s)))
|
|
344
|
-
err = -errno;
|
|
345
|
-
|
|
346
|
-
info.GetReturnValue().Set(err);
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
NAN_METHOD(Close) {
|
|
351
|
-
Nan::HandleScope scope;
|
|
352
|
-
int err;
|
|
353
|
-
int fd;
|
|
354
|
-
|
|
355
|
-
assert(info.Length() == 1);
|
|
356
|
-
fd = Nan::To<int32_t>(info[0]).FromJust();
|
|
357
|
-
|
|
358
|
-
// Suppress EINTR and EINPROGRESS. EINTR means that the close() system call
|
|
359
|
-
// was interrupted by a signal. According to POSIX, the file descriptor is
|
|
360
|
-
// in an undefined state afterwards. It's not safe to try closing it again
|
|
361
|
-
// because it may have been closed, despite the signal. If we call close()
|
|
362
|
-
// again, then it would either:
|
|
363
|
-
//
|
|
364
|
-
// a) fail with EBADF, or
|
|
365
|
-
//
|
|
366
|
-
// b) close the wrong file descriptor if another thread or a signal handler
|
|
367
|
-
// has reused it in the mean time.
|
|
368
|
-
//
|
|
369
|
-
// Neither is what we want but scenario B is particularly bad. Not retrying
|
|
370
|
-
// the close() could, in theory, lead to file descriptor leaks but, in
|
|
371
|
-
// practice, operating systems do the right thing and close the file
|
|
372
|
-
// descriptor, regardless of whether the operation was interrupted by
|
|
373
|
-
// a signal.
|
|
374
|
-
//
|
|
375
|
-
// EINPROGRESS is benign. It means the close operation was interrupted but
|
|
376
|
-
// that the file descriptor has been closed or is being closed in the
|
|
377
|
-
// background. It's informative, not an error.
|
|
378
|
-
err = 0;
|
|
379
|
-
if (close(fd))
|
|
380
|
-
if (errno != EINTR && errno != EINPROGRESS)
|
|
381
|
-
err = -errno;
|
|
382
|
-
|
|
383
|
-
StopWatcher(fd);
|
|
384
|
-
info.GetReturnValue().Set(err);
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
void Initialize(Local<Object> target) {
|
|
389
|
-
// don't need to be read-only, only used by the JS shim
|
|
390
|
-
Nan::Set(target, Nan::New("AF_UNIX").ToLocalChecked(), Nan::New(AF_UNIX));
|
|
391
|
-
Nan::Set(target, Nan::New("SOCK_DGRAM").ToLocalChecked(),
|
|
392
|
-
Nan::New(SOCK_DGRAM));
|
|
393
|
-
Nan::SetMethod(target, "socket", Socket);
|
|
394
|
-
Nan::SetMethod(target, "bind", Bind);
|
|
395
|
-
Nan::SetMethod(target, "sendto", SendTo);
|
|
396
|
-
Nan::SetMethod(target, "send", Send);
|
|
397
|
-
Nan::SetMethod(target, "connect", Connect);
|
|
398
|
-
Nan::SetMethod(target, "close", Close);
|
|
399
|
-
}
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
} // anonymous namespace
|
|
403
|
-
|
|
404
|
-
NODE_MODULE(unix_dgram, Initialize)
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
var assert = require('assert');
|
|
2
|
-
var fs = require('fs');
|
|
3
|
-
|
|
4
|
-
var unix = require('../lib/unix_dgram');
|
|
5
|
-
var SOCKNAME = '/tmp/unix_dgram.sock';
|
|
6
|
-
|
|
7
|
-
var sentCount = 0;
|
|
8
|
-
var seenCount = 0;
|
|
9
|
-
var expected = 300;
|
|
10
|
-
|
|
11
|
-
process.on('exit', function() {
|
|
12
|
-
assert.equal(seenCount, sentCount);
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
try { fs.unlinkSync(SOCKNAME); } catch (e) { /* swallow */ }
|
|
16
|
-
|
|
17
|
-
var server = unix.createSocket('unix_dgram', function(buf, rinfo) {
|
|
18
|
-
assert.equal('' + buf, 'PING' + seenCount);
|
|
19
|
-
if (++ seenCount === expected) {
|
|
20
|
-
server.close();
|
|
21
|
-
client.close();
|
|
22
|
-
}
|
|
23
|
-
});
|
|
24
|
-
server.bind(SOCKNAME);
|
|
25
|
-
|
|
26
|
-
var client = unix.createSocket('unix_dgram', function(buf, rinfo) {
|
|
27
|
-
assert(0);
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
client.on('error', function(err) {
|
|
31
|
-
console.error(err);
|
|
32
|
-
assert(0);
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
client.on('connect', function() {
|
|
36
|
-
console.error('connected');
|
|
37
|
-
|
|
38
|
-
client.on('congestion', function() {
|
|
39
|
-
throw new Error('Should not emit congestion');
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
client.on('writable', function() {
|
|
43
|
-
// swallow
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
function send() {
|
|
47
|
-
var msg = Buffer.from('PING' + sentCount);
|
|
48
|
-
client.send(msg, function(err) {
|
|
49
|
-
if (!err) {
|
|
50
|
-
++ sentCount;
|
|
51
|
-
if (sentCount < expected) {
|
|
52
|
-
// process.nextTick() in today's Node.js master seems to stall
|
|
53
|
-
// after about ~194 process.nextTick() calls, that's why we
|
|
54
|
-
// use setImmediate() as a workaround.
|
|
55
|
-
setImmediate(send);
|
|
56
|
-
}
|
|
57
|
-
} else if (err.code < 0) {
|
|
58
|
-
throw new Error(err);
|
|
59
|
-
} else {
|
|
60
|
-
client.once('writable', send);
|
|
61
|
-
}
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
send();
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
client.connect(SOCKNAME);
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
var assert = require('assert');
|
|
2
|
-
var fs = require('fs');
|
|
3
|
-
|
|
4
|
-
var unix = require('../lib/unix_dgram');
|
|
5
|
-
var SOCKNAME = '/tmp/unix_dgram.sock';
|
|
6
|
-
|
|
7
|
-
var seenCount = 0;
|
|
8
|
-
var expected = 300; // arbitrary enough to generate congestion
|
|
9
|
-
|
|
10
|
-
process.on('exit', function() {
|
|
11
|
-
assert.equal(seenCount, expected);
|
|
12
|
-
});
|
|
13
|
-
|
|
14
|
-
try { fs.unlinkSync(SOCKNAME); } catch (e) { /* swallow */ }
|
|
15
|
-
|
|
16
|
-
var server = unix.createSocket('unix_dgram', function(buf, rinfo) {
|
|
17
|
-
assert.equal('' + buf, 'PING' + seenCount);
|
|
18
|
-
if (++ seenCount === expected) {
|
|
19
|
-
server.close();
|
|
20
|
-
client.close();
|
|
21
|
-
}
|
|
22
|
-
});
|
|
23
|
-
server.bind(SOCKNAME);
|
|
24
|
-
|
|
25
|
-
var client = unix.createSocket('unix_dgram', function(buf, rinfo) {
|
|
26
|
-
assert(0);
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
client.on('error', function(err) {
|
|
30
|
-
console.error(err);
|
|
31
|
-
assert(0);
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
// This test case create a huge congestion which throw a warn (possible EventEmitter memory leak detected)
|
|
35
|
-
// In real process, it would be handled a smarter way (queued to re-send...)
|
|
36
|
-
client.setMaxListeners(300);
|
|
37
|
-
|
|
38
|
-
client.on('connect', function() {
|
|
39
|
-
console.error('connected');
|
|
40
|
-
client.on('congestion', function(buf) {
|
|
41
|
-
client.once('writable', function() {
|
|
42
|
-
client.send(buf);
|
|
43
|
-
});
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
var msg;
|
|
47
|
-
for(var i=0; i<expected; i++) {
|
|
48
|
-
msg = Buffer.from('PING' + i);
|
|
49
|
-
client.send(msg);
|
|
50
|
-
}
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
client.connect(SOCKNAME);
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
var assert = require('assert');
|
|
2
|
-
var fs = require('fs');
|
|
3
|
-
|
|
4
|
-
var unix = require('../lib/unix_dgram');
|
|
5
|
-
var SOCKNAME = '/tmp/unix_dgram.sock';
|
|
6
|
-
var SOCKNAME_CLIENT = '/tmp/unix_dgram_client.sock';
|
|
7
|
-
|
|
8
|
-
var sentPing1 = false;
|
|
9
|
-
var sentPing2 = false;
|
|
10
|
-
var seenPing1 = false;
|
|
11
|
-
var seenPing2 = false;
|
|
12
|
-
|
|
13
|
-
process.on('exit', function() {
|
|
14
|
-
assert.equal(sentPing1, true);
|
|
15
|
-
assert.equal(sentPing2, true);
|
|
16
|
-
assert.equal(seenPing1, true);
|
|
17
|
-
assert.equal(seenPing2, true);
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
try { fs.unlinkSync(SOCKNAME); } catch (e) { /* swallow */ }
|
|
21
|
-
try { fs.unlinkSync(SOCKNAME_CLIENT); } catch (e) { /* swallow */ }
|
|
22
|
-
|
|
23
|
-
var n = 0;
|
|
24
|
-
|
|
25
|
-
var server = unix.createSocket('unix_dgram', function(buf, rinfo) {
|
|
26
|
-
console.error('server recv', '' + buf, arguments);
|
|
27
|
-
switch (++n) {
|
|
28
|
-
case 1:
|
|
29
|
-
assert.equal('' + buf, 'PING1');
|
|
30
|
-
assert.equal(rinfo.path, null);
|
|
31
|
-
seenPing1 = true;
|
|
32
|
-
client.bind(SOCKNAME_CLIENT);
|
|
33
|
-
client.send(Buffer.from('PING2'), 0, 5, SOCKNAME, function() {
|
|
34
|
-
console.error('client send', arguments);
|
|
35
|
-
sentPing2 = true;
|
|
36
|
-
});
|
|
37
|
-
break;
|
|
38
|
-
case 2:
|
|
39
|
-
assert.equal('' + buf, 'PING2');
|
|
40
|
-
assert.equal(rinfo.path, SOCKNAME_CLIENT);
|
|
41
|
-
seenPing2 = true;
|
|
42
|
-
server.close();
|
|
43
|
-
client.close();
|
|
44
|
-
break;
|
|
45
|
-
|
|
46
|
-
}
|
|
47
|
-
});
|
|
48
|
-
server.bind(SOCKNAME);
|
|
49
|
-
|
|
50
|
-
var client = unix.createSocket('unix_dgram', function(buf, rinfo) {
|
|
51
|
-
console.error('client recv', arguments);
|
|
52
|
-
assert(0);
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
client.send(Buffer.from('PING1'), 0, 5, SOCKNAME, function() {
|
|
56
|
-
console.error('client send', arguments);
|
|
57
|
-
sentPing1 = true;
|
|
58
|
-
});
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
var assert = require('assert');
|
|
2
|
-
var fs = require('fs');
|
|
3
|
-
|
|
4
|
-
var unix = require('../lib/unix_dgram');
|
|
5
|
-
var SOCKNAME = '/tmp/unix_dgram.sock';
|
|
6
|
-
|
|
7
|
-
try { fs.unlinkSync(SOCKNAME); } catch (e) { /* swallow */ }
|
|
8
|
-
|
|
9
|
-
var client = unix.createSocket('unix_dgram', function(buf, rinfo) {
|
|
10
|
-
console.error('client recv', arguments);
|
|
11
|
-
assert(0);
|
|
12
|
-
});
|
|
13
|
-
|
|
14
|
-
client.once('error', function(err) {
|
|
15
|
-
assert.ok(err);
|
|
16
|
-
client.once('error', function(err) {
|
|
17
|
-
assert.ifError(err);
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
client.send(Buffer.from('ERROR2'), 0, 6, SOCKNAME, function(err) {
|
|
21
|
-
assert.ok(err);
|
|
22
|
-
client.close();
|
|
23
|
-
});
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
client.send(Buffer.from('ERROR1'), 0, 6, SOCKNAME);
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
# CHANGELOG
|
|
2
|
-
|
|
3
|
-
## v2.1.0 / 2019-02-17
|
|
4
|
-
|
|
5
|
-
- (@DABH) Fix tests by fixing error emission/handling
|
|
6
|
-
- #[108], (@vrza) Make winston 3 a peer dependency
|
|
7
|
-
- #[102], (@stieg) Require winston >= 3 and add corresopnding note in readme
|
|
8
|
-
- #[105], (@mohd-akram) Update dependencies for latest Node compatibility
|
|
9
|
-
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
Copyright (c) 2011 Charlie Robbins
|
|
2
|
-
Copyright (c) 2012 Santiago Gimeno
|
|
3
|
-
|
|
4
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
5
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
6
|
-
in the Software without restriction, including without limitation the rights
|
|
7
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
8
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
9
|
-
furnished to do so, subject to the following conditions:
|
|
10
|
-
|
|
11
|
-
The above copyright notice and this permission notice shall be included in
|
|
12
|
-
all copies or substantial portions of the Software.
|
|
13
|
-
|
|
14
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
15
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
16
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
17
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
18
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
19
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
20
|
-
THE SOFTWARE.
|