From b7b1d7eb8842a18f187eedbba5b4ff2d30999df6 Mon Sep 17 00:00:00 2001
From: Anna Henningsen
Date: Wed, 26 Dec 2018 13:21:57 +0100
Subject: [PATCH 001/246] test: fix test-repl-envvars
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
In 180f86507d496b11aa35b2df4594629a92cce329, the test was changed
so that the `env` argument of `createInternalRepl()` also contained
external environment variables, because keeping them can be necessary
for spawning processes on some systems.
However, this test does not spawn new processes, and relies on the
fact that the environment variables it tests are not already set
(and fails otherwise); therefore, reverting to the original state
should fix this.
Fixes: https://github.com/nodejs/node/issues/21451
Fixes: https://github.com/nodejs/build/issues/1377
Refs: https://github.com/nodejs/node/pull/25219
PR-URL: https://github.com/nodejs/node/pull/25226
Reviewed-By: Rich Trott
Reviewed-By: Tobias Nießen
Reviewed-By: Benjamin Gruenbaum
Reviewed-By: Denys Otrishko
Reviewed-By: Colin Ihrig
Reviewed-By: Luigi Pinca
---
test/parallel/test-repl-envvars.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/test/parallel/test-repl-envvars.js b/test/parallel/test-repl-envvars.js
index 5606efc26ed0..6679cd6cd73a 100644
--- a/test/parallel/test-repl-envvars.js
+++ b/test/parallel/test-repl-envvars.js
@@ -36,7 +36,7 @@ const tests = [
];
function run(test) {
- const env = Object.assign({}, process.env, test.env);
+ const env = test.env;
const expected = test.expected;
const opts = {
terminal: true,
From 2c50bcda8a472587c257baea7364a1462385adf5 Mon Sep 17 00:00:00 2001
From: Philipp Renoth
Date: Tue, 25 Dec 2018 13:01:20 +0100
Subject: [PATCH 002/246] doc: fix NAPI typo
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
PR-URL: https://github.com/nodejs/node/pull/25216
Reviewed-By: Richard Lau
Reviewed-By: Benjamin Gruenbaum
Reviewed-By: Vse Mozhet Byt
Reviewed-By: Tobias Nießen
Reviewed-By: Colin Ihrig
---
doc/api/n-api.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/doc/api/n-api.md b/doc/api/n-api.md
index c84b2f245adf..1a02711f8e10 100644
--- a/doc/api/n-api.md
+++ b/doc/api/n-api.md
@@ -60,7 +60,7 @@ if (status != napi_ok) {
return;
}
-status = napi_crate_string_utf8(env, "bar", NAPI_AUTO_LENGTH, &string);
+status = napi_create_string_utf8(env, "bar", NAPI_AUTO_LENGTH, &string);
if (status != napi_ok) {
napi_throw_error(env, ...);
return;
From 91d1aea311fd40ad791370fe381d1083e00f6b58 Mon Sep 17 00:00:00 2001
From: Rich Trott
Date: Tue, 18 Dec 2018 16:05:06 -0800
Subject: [PATCH 003/246] test: refactor test-esm-namespace.mjs
Remove unused `name` argument that is different from a subsequent `name`
argument in a different but nearby function. This was mildly confusing
to me at first, so hopefully this change clarifies things for others
reading the test.
PR-URL: https://github.com/nodejs/node/pull/25117
Reviewed-By: James M Snell
---
test/es-module/test-esm-namespace.mjs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/test/es-module/test-esm-namespace.mjs b/test/es-module/test-esm-namespace.mjs
index dcd159f6c872..da1286d0f40e 100644
--- a/test/es-module/test-esm-namespace.mjs
+++ b/test/es-module/test-esm-namespace.mjs
@@ -6,7 +6,7 @@ import Module from 'module';
const keys = Object.entries(
Object.getOwnPropertyDescriptors(new Module().require('fs')))
- .filter(([name, d]) => d.enumerable)
+ .filter(([ , d]) => d.enumerable)
.map(([name]) => name)
.concat('default')
.sort();
From 9ac8d41925f72d8667afb656defad58c13cfa1ff Mon Sep 17 00:00:00 2001
From: David Halls
Date: Thu, 13 Dec 2018 23:47:32 +0000
Subject: [PATCH 004/246] net: check for close on stream, not parent
'close' event isn't emitted on a TLS connection if it's been written to
(but 'end' and 'finish' events are).
PR-URL: https://github.com/nodejs/node/pull/25026
Fixes: https://github.com/nodejs/node/issues/24984
Reviewed-By: Luigi Pinca
Reviewed-By: Anna Henningsen
---
lib/net.js | 4 +-
.../test-tls-close-event-after-write.js | 41 +++++++++++++++++++
2 files changed, 43 insertions(+), 2 deletions(-)
create mode 100644 test/parallel/test-tls-close-event-after-write.js
diff --git a/lib/net.js b/lib/net.js
index c5ff6182989e..df68be4067c4 100644
--- a/lib/net.js
+++ b/lib/net.js
@@ -368,8 +368,8 @@ Socket.prototype._final = function(cb) {
};
-function afterShutdown(status, handle) {
- var self = handle[owner_symbol];
+function afterShutdown(status) {
+ var self = this.handle[owner_symbol];
debug('afterShutdown destroyed=%j', self.destroyed,
self._readableState);
diff --git a/test/parallel/test-tls-close-event-after-write.js b/test/parallel/test-tls-close-event-after-write.js
new file mode 100644
index 000000000000..31ebc897b147
--- /dev/null
+++ b/test/parallel/test-tls-close-event-after-write.js
@@ -0,0 +1,41 @@
+'use strict';
+const common = require('../common');
+
+if (!common.hasCrypto)
+ common.skip('missing crypto');
+
+// Issue #24984
+// 'close' event isn't emitted on a TLS connection if it's been written to
+// (but 'end' and 'finish' events are). Without a fix, this test won't exit.
+
+const tls = require('tls');
+const fixtures = require('../common/fixtures');
+let cconn = null;
+let sconn = null;
+
+function test() {
+ if (cconn && sconn) {
+ cconn.resume();
+ sconn.resume();
+ sconn.end(Buffer.alloc(1024 * 1024));
+ cconn.end();
+ }
+}
+
+const server = tls.createServer({
+ key: fixtures.readKey('agent1-key.pem'),
+ cert: fixtures.readKey('agent1-cert.pem')
+}, function(c) {
+ c.on('close', function() {
+ server.close();
+ });
+ sconn = c;
+ test();
+}).listen(0, common.mustCall(function() {
+ tls.connect(this.address().port, {
+ rejectUnauthorized: false
+ }, common.mustCall(function() {
+ cconn = this;
+ test();
+ }));
+}));
From c13e5be74014124caa428f05875b2df08f79bcd7 Mon Sep 17 00:00:00 2001
From: Rich Trott
Date: Sun, 23 Dec 2018 21:59:19 -0800
Subject: [PATCH 005/246] net: use decodeStrings public API for writable stream
Instead of using an undocumented underscore-prefixed property to
configure the writable stream instance to not encode strings as buffers,
use the public API which is an options property passed to the
constructor.
Refs: https://github.com/nodejs/node/issues/445
PR-URL: https://github.com/nodejs/node/pull/25201
Reviewed-By: Ben Noordhuis
Reviewed-By: Ruben Bridgewater
Reviewed-By: Anto Aravinth
Reviewed-By: Colin Ihrig
Reviewed-By: Luigi Pinca
Reviewed-By: Anna Henningsen
---
lib/net.js | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/lib/net.js b/lib/net.js
index df68be4067c4..eb5fae76fa17 100644
--- a/lib/net.js
+++ b/lib/net.js
@@ -255,6 +255,8 @@ function Socket(options) {
options.allowHalfOpen = true;
// For backwards compat do not emit close on destroy.
options.emitClose = false;
+ // Handle strings directly.
+ options.decodeStrings = false;
stream.Duplex.call(this, options);
// Default to *not* allowing half open sockets.
@@ -308,9 +310,6 @@ function Socket(options) {
this._pendingData = null;
this._pendingEncoding = '';
- // handle strings directly
- this._writableState.decodeStrings = false;
-
// If we have a handle, then start the flow of data into the
// buffer. if not, then this will happen when we connect
if (this._handle && options.readable !== false) {
From 5b4fab1a404f8eb46e96107d7cc30fe8abea7aa3 Mon Sep 17 00:00:00 2001
From: Anna Henningsen
Date: Sat, 22 Dec 2018 21:18:13 +0100
Subject: [PATCH 006/246] dns: fix TTL value for AAAA replies to `resolveAny()`
We were previously reading from the wrong offset, namely
the one into the final results array, not the one for the
AAAA results itself, which could have lead to reading
uninitialized or out-of-bounds data.
Also, adjust the test accordingly; TTL values are not
modified by c-ares, but are only exposed for a subset
of all DNS record types.
PR-URL: https://github.com/nodejs/node/pull/25187
Reviewed-By: Luigi Pinca
Reviewed-By: James M Snell
Reviewed-By: Khaidi Chu
Reviewed-By: Ben Noordhuis
Reviewed-By: Ruben Bridgewater
---
src/cares_wrap.cc | 4 +++-
test/parallel/test-dns-resolveany.js | 13 +++++++++----
2 files changed, 12 insertions(+), 5 deletions(-)
diff --git a/src/cares_wrap.cc b/src/cares_wrap.cc
index a3bcdf895359..9d7af47dcdbb 100644
--- a/src/cares_wrap.cc
+++ b/src/cares_wrap.cc
@@ -1265,6 +1265,7 @@ class QueryAnyWrap: public QueryWrap {
}
CHECK_EQ(aaaa_count, naddr6ttls);
+ CHECK_EQ(ret->Length(), a_count + aaaa_count);
for (uint32_t i = a_count; i < ret->Length(); i++) {
Local obj = Object::New(env()->isolate());
obj->Set(context,
@@ -1272,7 +1273,8 @@ class QueryAnyWrap: public QueryWrap {
ret->Get(context, i).ToLocalChecked()).FromJust();
obj->Set(context,
env()->ttl_string(),
- Integer::New(env()->isolate(), addr6ttls[i].ttl)).FromJust();
+ Integer::New(env()->isolate(), addr6ttls[i - a_count].ttl))
+ .FromJust();
obj->Set(context,
env()->type_string(),
env()->dns_aaaa_string()).FromJust();
diff --git a/test/parallel/test-dns-resolveany.js b/test/parallel/test-dns-resolveany.js
index 46694f240336..bb15b1a38b4a 100644
--- a/test/parallel/test-dns-resolveany.js
+++ b/test/parallel/test-dns-resolveany.js
@@ -53,8 +53,13 @@ server.bind(0, common.mustCall(async () => {
}));
function validateResults(res) {
- // Compare copies with ttl removed, c-ares fiddles with that value.
- assert.deepStrictEqual(
- res.map((r) => Object.assign({}, r, { ttl: null })),
- answers.map((r) => Object.assign({}, r, { ttl: null })));
+ // TTL values are only provided for A and AAAA entries.
+ assert.deepStrictEqual(res.map(maybeRedactTTL), answers.map(maybeRedactTTL));
+}
+
+function maybeRedactTTL(r) {
+ const ret = { ...r };
+ if (!['A', 'AAAA'].includes(r.type))
+ delete ret.ttl;
+ return ret;
}
From 7365b009298c7452e52cbd701ab2ae579afba27c Mon Sep 17 00:00:00 2001
From: Anna Henningsen
Date: Sat, 22 Dec 2018 03:01:28 +0100
Subject: [PATCH 007/246] src: do not leak NodeTraceStateObserver
This would otherwise be reported as a memory leak by automated tools.
PR-URL: https://github.com/nodejs/node/pull/25180
Reviewed-By: Richard Lau
Reviewed-By: Joyee Cheung
---
src/node.cc | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/src/node.cc b/src/node.cc
index 4e88d05510fa..e8710bef22d3 100644
--- a/src/node.cc
+++ b/src/node.cc
@@ -211,7 +211,6 @@ class NodeTraceStateObserver :
// This only runs the first time tracing is enabled
controller_->RemoveTraceStateObserver(this);
- delete this;
}
void OnTraceDisabled() override {
@@ -233,8 +232,10 @@ static struct {
void Initialize(int thread_pool_size) {
tracing_agent_.reset(new tracing::Agent());
node::tracing::TraceEventHelper::SetAgent(tracing_agent_.get());
- auto controller = tracing_agent_->GetTracingController();
- controller->AddTraceStateObserver(new NodeTraceStateObserver(controller));
+ node::tracing::TracingController* controller =
+ tracing_agent_->GetTracingController();
+ trace_state_observer_.reset(new NodeTraceStateObserver(controller));
+ controller->AddTraceStateObserver(trace_state_observer_.get());
StartTracingAgent();
// Tracing must be initialized before platform threads are created.
platform_ = new NodePlatform(thread_pool_size, controller);
@@ -248,6 +249,7 @@ static struct {
// Destroy tracing after the platform (and platform threads) have been
// stopped.
tracing_agent_.reset(nullptr);
+ trace_state_observer_.reset(nullptr);
}
void DrainVMTasks(Isolate* isolate) {
@@ -300,6 +302,7 @@ static struct {
return platform_;
}
+ std::unique_ptr trace_state_observer_;
std::unique_ptr tracing_agent_;
tracing::AgentWriterHandle tracing_file_writer_;
NodePlatform* platform_;
From 73ccfc81c91779a68df6c5b74fad0de0a0e8ea2c Mon Sep 17 00:00:00 2001
From: cjihrig
Date: Mon, 24 Dec 2018 11:03:11 -0500
Subject: [PATCH 008/246] src: fix compiler warnings in node_crypto.cc
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
During the time between https://github.com/nodejs/node/pull/24234
being opened and it landing, a V8 update occurred that deprecated
several APIs. This commit fixes the following compiler warnings:
../src/node_crypto.cc:3342:11:
warning: 'Set' is deprecated: Use maybe version
../src/node_crypto.cc:3345:13:
warning: 'GetFunction' is deprecated: Use maybe version
PR-URL: https://github.com/nodejs/node/pull/25205
Reviewed-By: Tobias Nießen
Reviewed-By: Daniel Bevenius
---
src/node_crypto.cc | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/src/node_crypto.cc b/src/node_crypto.cc
index c1a87de70986..7967d6a40be1 100644
--- a/src/node_crypto.cc
+++ b/src/node_crypto.cc
@@ -3312,10 +3312,12 @@ Local KeyObject::Initialize(Environment* env, Local target) {
GetAsymmetricKeyType);
env->SetProtoMethod(t, "export", Export);
- target->Set(FIXED_ONE_BYTE_STRING(env->isolate(), "KeyObject"),
- t->GetFunction(env->context()).ToLocalChecked());
+ auto function = t->GetFunction(env->context()).ToLocalChecked();
+ target->Set(env->context(),
+ FIXED_ONE_BYTE_STRING(env->isolate(), "KeyObject"),
+ function).FromJust();
- return t->GetFunction();
+ return function;
}
Local KeyObject::Create(Environment* env,
From 39b3fd1b6108186425c919f810fa7ed5a97c3b65 Mon Sep 17 00:00:00 2001
From: Rich Trott
Date: Sat, 22 Dec 2018 19:49:31 -0800
Subject: [PATCH 009/246] doc: revise "Breaking Changes to Internal Elements"
Revise the "Breaking Changes to Internal Elements" section of
COLLABORATOR_GUIDE.md. Simplify wording, shorten sentences, and remove
redundant material.
PR-URL: https://github.com/nodejs/node/pull/25190
Reviewed-By: Colin Ihrig
Reviewed-By: Luigi Pinca
Reviewed-By: James M Snell
Reviewed-By: Anto Aravinth
---
COLLABORATOR_GUIDE.md | 21 +++++++--------------
1 file changed, 7 insertions(+), 14 deletions(-)
diff --git a/COLLABORATOR_GUIDE.md b/COLLABORATOR_GUIDE.md
index 71cb741e9893..c3805d4a2c05 100644
--- a/COLLABORATOR_GUIDE.md
+++ b/COLLABORATOR_GUIDE.md
@@ -269,20 +269,13 @@ For more information, see [Deprecations](#deprecations).
#### Breaking Changes to Internal Elements
-Breaking changes to internal elements are permitted in semver-patch or
-semver-minor commits but Collaborators should take significant care when
-making and reviewing such changes. Before landing such commits, an effort
-must be made to determine the potential impact of the change in the ecosystem
-by analyzing current use and by validating such changes through ecosystem
-testing using the [Canary in the Goldmine](https://github.com/nodejs/citgm)
-tool. If a change cannot be made without ecosystem breakage, then TSC review is
-required before landing the change as anything less than semver-major.
-
-If a determination is made that a particular internal API (for instance, an
-underscore `_` prefixed property) is sufficiently relied upon by the ecosystem
-such that any changes may break user code, then serious consideration should be
-given to providing an alternative Public API for that functionality before any
-breaking changes are made.
+Breaking changes to internal elements may occur in semver-patch or semver-minor
+commits. Collaborators should take significant care when making and reviewing
+such changes. An effort must be made to determine the potential impact of the
+change in the ecosystem. Use
+[Canary in the Goldmine](https://github.com/nodejs/citgm) to test such changes.
+If a change will cause ecosystem breakage, then it is semver-major. Consider
+providing a Public API in such cases.
#### When Breaking Changes Actually Break Things
From e2a01ca061a5630b2014a111d20444057b67212d Mon Sep 17 00:00:00 2001
From: cjihrig
Date: Mon, 24 Dec 2018 12:10:35 -0500
Subject: [PATCH 010/246] src: use DCHECK_* macros where possible
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
PR-URL: https://github.com/nodejs/node/pull/25207
Reviewed-By: Michaël Zasso
Reviewed-By: Anna Henningsen
Reviewed-By: Ruben Bridgewater
Reviewed-By: Tobias Nießen
Reviewed-By: Luigi Pinca
---
src/aliased_buffer.h | 12 ++++--------
src/base_object-inl.h | 2 +-
src/debug_utils.h | 4 +---
src/string_decoder.cc | 10 +++-------
src/string_search.h | 4 +---
5 files changed, 10 insertions(+), 22 deletions(-)
diff --git a/src/aliased_buffer.h b/src/aliased_buffer.h
index fa610a977448..0bae974af7a5 100644
--- a/src/aliased_buffer.h
+++ b/src/aliased_buffer.h
@@ -198,9 +198,7 @@ class AliasedBuffer {
* Set position index to given value.
*/
inline void SetValue(const size_t index, NativeT value) {
-#if defined(DEBUG) && DEBUG
- CHECK_LT(index, count_);
-#endif
+ DCHECK_LT(index, count_);
buffer_[index] = value;
}
@@ -208,9 +206,7 @@ class AliasedBuffer {
* Get value at position index
*/
inline const NativeT GetValue(const size_t index) const {
-#if defined(DEBUG) && DEBUG
- CHECK_LT(index, count_);
-#endif
+ DCHECK_LT(index, count_);
return buffer_[index];
}
@@ -233,9 +229,9 @@ class AliasedBuffer {
// Should only be used on an owning array, not one created as a sub array of
// an owning `AliasedBuffer`.
void reserve(size_t new_capacity) {
+ DCHECK_GE(new_capacity, count_);
+ DCHECK_EQ(byte_offset_, 0);
#if defined(DEBUG) && DEBUG
- CHECK_GE(new_capacity, count_);
- CHECK_EQ(byte_offset_, 0);
CHECK(free_buffer_);
#endif
const v8::HandleScope handle_scope(isolate_);
diff --git a/src/base_object-inl.h b/src/base_object-inl.h
index cce872739381..84c449a30814 100644
--- a/src/base_object-inl.h
+++ b/src/base_object-inl.h
@@ -115,8 +115,8 @@ BaseObject::MakeLazilyInitializedJSTemplate(Environment* env) {
auto constructor = [](const v8::FunctionCallbackInfo& args) {
#ifdef DEBUG
CHECK(args.IsConstructCall());
- CHECK_GT(args.This()->InternalFieldCount(), 0);
#endif
+ DCHECK_GT(args.This()->InternalFieldCount(), 0);
args.This()->SetAlignedPointerInInternalField(0, nullptr);
};
diff --git a/src/debug_utils.h b/src/debug_utils.h
index 034d8a9ab331..ed5e42fcbe8e 100644
--- a/src/debug_utils.h
+++ b/src/debug_utils.h
@@ -68,9 +68,7 @@ template
inline void FORCE_INLINE Debug(AsyncWrap* async_wrap,
const char* format,
Args&&... args) {
-#ifdef DEBUG
- CHECK_NOT_NULL(async_wrap);
-#endif
+ DCHECK_NOT_NULL(async_wrap);
DebugCategory cat =
static_cast(async_wrap->provider_type());
if (!UNLIKELY(async_wrap->env()->debug_enabled(cat)))
diff --git a/src/string_decoder.cc b/src/string_decoder.cc
index a83d6623b4b4..96c6baa4d815 100644
--- a/src/string_decoder.cc
+++ b/src/string_decoder.cc
@@ -123,11 +123,9 @@ MaybeLocal StringDecoder::DecodeData(Isolate* isolate,
body = !prepend.IsEmpty() ? prepend : String::Empty(isolate);
prepend = Local();
} else {
-#ifdef DEBUG
// If not, that means is no character left to finish at this point.
- CHECK_EQ(MissingBytes(), 0);
- CHECK_EQ(BufferedBytes(), 0);
-#endif
+ DCHECK_EQ(MissingBytes(), 0);
+ DCHECK_EQ(BufferedBytes(), 0);
// See whether there is a character that we may have to cut off and
// finish when receiving the next chunk.
@@ -136,9 +134,7 @@ MaybeLocal StringDecoder::DecodeData(Isolate* isolate,
// This means we'll need to figure out where the character to which
// the byte belongs begins.
for (size_t i = nread - 1; ; --i) {
-#ifdef DEBUG
- CHECK_LT(i, nread);
-#endif
+ DCHECK_LT(i, nread);
state_[kBufferedBytes]++;
if ((data[i] & 0xC0) == 0x80) {
// This byte does not start a character (a "trailing" byte).
diff --git a/src/string_search.h b/src/string_search.h
index 358a4c1b024e..7d59d89df783 100644
--- a/src/string_search.h
+++ b/src/string_search.h
@@ -37,9 +37,7 @@ class Vector {
// Access individual vector elements - checks bounds in debug mode.
T& operator[](size_t index) const {
-#ifdef DEBUG
- CHECK(index < length_);
-#endif
+ DCHECK_LT(index, length_);
return start_[is_forward_ ? index : (length_ - index - 1)];
}
From 99a5af65df5d87b209f5722c55a3566722067e61 Mon Sep 17 00:00:00 2001
From: cjihrig
Date: Mon, 24 Dec 2018 12:24:08 -0500
Subject: [PATCH 011/246] src: introduce DCHECK macro
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
This commit adds a DCHECK macro for consistency with the
other DCHECK_* macros.
PR-URL: https://github.com/nodejs/node/pull/25207
Reviewed-By: Michaël Zasso
Reviewed-By: Anna Henningsen
Reviewed-By: Ruben Bridgewater
Reviewed-By: Tobias Nießen
Reviewed-By: Luigi Pinca
---
src/aliased_buffer.h | 4 +---
src/base_object-inl.h | 4 +---
src/inspector/node_string.h | 4 ----
src/string_decoder.cc | 4 +---
src/util.h | 2 ++
5 files changed, 5 insertions(+), 13 deletions(-)
diff --git a/src/aliased_buffer.h b/src/aliased_buffer.h
index 0bae974af7a5..eae60f4d93a9 100644
--- a/src/aliased_buffer.h
+++ b/src/aliased_buffer.h
@@ -231,9 +231,7 @@ class AliasedBuffer {
void reserve(size_t new_capacity) {
DCHECK_GE(new_capacity, count_);
DCHECK_EQ(byte_offset_, 0);
-#if defined(DEBUG) && DEBUG
- CHECK(free_buffer_);
-#endif
+ DCHECK(free_buffer_);
const v8::HandleScope handle_scope(isolate_);
const size_t old_size_in_bytes = sizeof(NativeT) * count_;
diff --git a/src/base_object-inl.h b/src/base_object-inl.h
index 84c449a30814..f1f1498e6c61 100644
--- a/src/base_object-inl.h
+++ b/src/base_object-inl.h
@@ -113,9 +113,7 @@ void BaseObject::ClearWeak() {
v8::Local
BaseObject::MakeLazilyInitializedJSTemplate(Environment* env) {
auto constructor = [](const v8::FunctionCallbackInfo& args) {
-#ifdef DEBUG
- CHECK(args.IsConstructCall());
-#endif
+ DCHECK(args.IsConstructCall());
DCHECK_GT(args.This()->InternalFieldCount(), 0);
args.This()->SetAlignedPointerInInternalField(0, nullptr);
};
diff --git a/src/inspector/node_string.h b/src/inspector/node_string.h
index 4588364ab121..504798853675 100644
--- a/src/inspector/node_string.h
+++ b/src/inspector/node_string.h
@@ -73,8 +73,4 @@ extern size_t kNotFound;
} // namespace inspector
} // namespace node
-#ifndef DCHECK
- #define DCHECK CHECK
- #define DCHECK_LT CHECK_LT
-#endif // DCHECK
#endif // SRC_INSPECTOR_NODE_STRING_H_
diff --git a/src/string_decoder.cc b/src/string_decoder.cc
index 96c6baa4d815..ceee1c9d7620 100644
--- a/src/string_decoder.cc
+++ b/src/string_decoder.cc
@@ -44,9 +44,7 @@ MaybeLocal MakeString(Isolate* isolate,
isolate->ThrowException(error);
}
-#ifdef DEBUG
- CHECK(ret.IsEmpty() || ret.ToLocalChecked()->IsString());
-#endif
+ DCHECK(ret.IsEmpty() || ret.ToLocalChecked()->IsString());
return ret.FromMaybe(Local()).As();
}
diff --git a/src/util.h b/src/util.h
index 36a2ec9e3a62..d3835c7e692b 100644
--- a/src/util.h
+++ b/src/util.h
@@ -130,6 +130,7 @@ void DumpBacktrace(FILE* fp);
#define CHECK_IMPLIES(a, b) CHECK(!(a) || (b))
#ifdef DEBUG
+ #define DCHECK(expr) CHECK(expr)
#define DCHECK_EQ(a, b) CHECK((a) == (b))
#define DCHECK_GE(a, b) CHECK((a) >= (b))
#define DCHECK_GT(a, b) CHECK((a) > (b))
@@ -140,6 +141,7 @@ void DumpBacktrace(FILE* fp);
#define DCHECK_NOT_NULL(val) CHECK((val) != nullptr)
#define DCHECK_IMPLIES(a, b) CHECK(!(a) || (b))
#else
+ #define DCHECK(expr)
#define DCHECK_EQ(a, b)
#define DCHECK_GE(a, b)
#define DCHECK_GT(a, b)
From 58af085d9f299d2e0da69483840902f664f1d917 Mon Sep 17 00:00:00 2001
From: Richard Lau
Date: Fri, 21 Dec 2018 13:20:21 -0500
Subject: [PATCH 012/246] test: refactor stdio handling in test-esm-cjs-main
Set encoding on the stderr/stdout streams instead of calling
data.toString(). Don't assume the complete expected messages arrive in
a single event.
PR-URL: https://github.com/nodejs/node/pull/25169
Reviewed-By: Colin Ihrig
Reviewed-By: Daniel Bevenius
---
test/es-module/test-esm-cjs-main.js | 19 +++++++++----------
1 file changed, 9 insertions(+), 10 deletions(-)
diff --git a/test/es-module/test-esm-cjs-main.js b/test/es-module/test-esm-cjs-main.js
index 8577eccb9a0f..8308308a2dce 100644
--- a/test/es-module/test-esm-cjs-main.js
+++ b/test/es-module/test-esm-cjs-main.js
@@ -8,21 +8,20 @@ const assert = require('assert');
const entry = fixtures.path('/es-modules/cjs.js');
const child = spawn(process.execPath, ['--experimental-modules', entry]);
-let experimentalWarning = false;
-let validatedExecution = false;
+let stderr = '';
+child.stderr.setEncoding('utf8');
child.stderr.on('data', (data) => {
- if (!experimentalWarning) {
- experimentalWarning = true;
- return;
- }
- throw new Error(data.toString());
+ stderr += data;
});
+let stdout = '';
+child.stdout.setEncoding('utf8');
child.stdout.on('data', (data) => {
- assert.strictEqual(data.toString(), 'executed\n');
- validatedExecution = true;
+ stdout += data;
});
child.on('close', common.mustCall((code, signal) => {
- assert.strictEqual(validatedExecution, true);
assert.strictEqual(code, 0);
assert.strictEqual(signal, null);
+ assert.strictEqual(stdout, 'executed\n');
+ assert.strictEqual(stderr, `(node:${child.pid}) ` +
+ 'ExperimentalWarning: The ESM module loader is experimental.\n');
}));
From 73f3a1c4e632ec4a2eb5915b924094e538316d33 Mon Sep 17 00:00:00 2001
From: Ruben Bridgewater
Date: Sun, 23 Dec 2018 17:16:14 +0100
Subject: [PATCH 013/246] util: make inspect aware of RegExp subclasses and
null prototype
This adds support for inspect to distinguish regular expression
subclasses and ones with null prototype from "normal" regular
expressions.
PR-URL: https://github.com/nodejs/node/pull/25192
Reviewed-By: Anto Aravinth
Reviewed-By: James M Snell
---
lib/internal/util/inspect.js | 7 +++--
test/parallel/test-assert-deep.js | 2 +-
test/parallel/test-util-inspect.js | 43 +++++++++++++++++++++++-------
3 files changed, 39 insertions(+), 13 deletions(-)
diff --git a/lib/internal/util/inspect.js b/lib/internal/util/inspect.js
index 256a4a8b0690..b47ed5411f46 100644
--- a/lib/internal/util/inspect.js
+++ b/lib/internal/util/inspect.js
@@ -634,9 +634,12 @@ function formatRaw(ctx, value, recurseTimes) {
base = `[${name}]`;
} else if (isRegExp(value)) {
// Make RegExps say that they are RegExps
+ base = regExpToString(constructor !== null ? value : new RegExp(value));
+ const prefix = getPrefix(constructor, tag, 'RegExp');
+ if (prefix !== 'RegExp ')
+ base = `${prefix}${base}`;
if (keys.length === 0 || recurseTimes < 0)
- return ctx.stylize(regExpToString(value), 'regexp');
- base = `${regExpToString(value)}`;
+ return ctx.stylize(base, 'regexp');
} else if (isDate(value)) {
// Make dates with properties first say the date
if (keys.length === 0) {
diff --git a/test/parallel/test-assert-deep.js b/test/parallel/test-assert-deep.js
index 68b3ee5497db..b16b0f3ffcb9 100644
--- a/test/parallel/test-assert-deep.js
+++ b/test/parallel/test-assert-deep.js
@@ -149,7 +149,7 @@ assert.throws(
{
code: 'ERR_ASSERTION',
message: `${defaultMsgStartFull}\n\n` +
- "+ /test/\n- /test/ {\n- '0': '1'\n- }"
+ "+ /test/\n- MyRegExp /test/ {\n- '0': '1'\n- }"
}
);
diff --git a/test/parallel/test-util-inspect.js b/test/parallel/test-util-inspect.js
index 0d9cbdbe9d25..9ee027208975 100644
--- a/test/parallel/test-util-inspect.js
+++ b/test/parallel/test-util-inspect.js
@@ -1580,15 +1580,7 @@ assert.strictEqual(util.inspect('"\''), '`"\'`');
// eslint-disable-next-line no-template-curly-in-string
assert.strictEqual(util.inspect('"\'${a}'), "'\"\\'${a}'");
-{
- assert.strictEqual(
- util.inspect(Object.setPrototypeOf(/a/, null)),
- '/undefined/undefined'
- );
-}
-
-// Verify that throwing in valueOf and having no prototype still produces nice
-// results.
+// Verify that throwing in valueOf and toString still produces nice results.
[
[new String(55), "[String: '55']"],
[new Boolean(true), '[Boolean: true]'],
@@ -1609,6 +1601,7 @@ assert.strictEqual(util.inspect('"\'${a}'), "'\"\\'${a}'");
[new Promise((resolve) => setTimeout(resolve, 10)), 'Promise { }'],
[new WeakSet(), 'WeakSet { }'],
[new WeakMap(), 'WeakMap { }'],
+ [/foobar/g, '/foobar/g']
].forEach(([value, expected]) => {
Object.defineProperty(value, 'valueOf', {
get() {
@@ -1628,6 +1621,7 @@ assert.strictEqual(util.inspect('"\'${a}'), "'\"\\'${a}'");
assert.notStrictEqual(util.inspect(value), expected);
});
+// Verify that having no prototype still produces nice results.
[
[[1, 3, 4], '[Array: null prototype] [ 1, 3, 4 ]'],
[new Set([1, 2]), '[Set: null prototype] { 1, 2 }'],
@@ -1652,7 +1646,8 @@ assert.strictEqual(util.inspect('"\'${a}'), "'\"\\'${a}'");
'[DataView: null prototype] {\n byteLength: undefined,\n ' +
'byteOffset: undefined,\n buffer: undefined }'],
[new SharedArrayBuffer(2), '[SharedArrayBuffer: null prototype] ' +
- '{ byteLength: undefined }']
+ '{ byteLength: undefined }'],
+ [/foobar/, '[RegExp: null prototype] /foobar/']
].forEach(([value, expected]) => {
assert.strictEqual(
util.inspect(Object.setPrototypeOf(value, null)),
@@ -1665,6 +1660,34 @@ assert.strictEqual(util.inspect('"\'${a}'), "'\"\\'${a}'");
assert.notStrictEqual(util.inspect(value), expected);
});
+// Verify that subclasses with and without prototype produce nice results.
+[
+ [RegExp, ['foobar', 'g'], '/foobar/g']
+].forEach(([base, input, rawExpected]) => {
+ class Foo extends base {}
+ const value = new Foo(...input);
+ const symbol = value[Symbol.toStringTag];
+ const expected = `Foo ${symbol ? `[${symbol}] ` : ''}${rawExpected}`;
+ const expectedWithoutProto = `[${base.name}: null prototype] ${rawExpected}`;
+ assert.strictEqual(util.inspect(value), expected);
+ value.foo = 'bar';
+ assert.notStrictEqual(util.inspect(value), expected);
+ delete value.foo;
+ assert.strictEqual(
+ util.inspect(Object.setPrototypeOf(value, null)),
+ expectedWithoutProto
+ );
+ value.foo = 'bar';
+ let res = util.inspect(value);
+ assert.notStrictEqual(res, expectedWithoutProto);
+ assert(/foo: 'bar'/.test(res), res);
+ delete value.foo;
+ value[Symbol('foo')] = 'yeah';
+ res = util.inspect(value);
+ assert.notStrictEqual(res, expectedWithoutProto);
+ assert(/\[Symbol\(foo\)]: 'yeah'/.test(res), res);
+});
+
assert.strictEqual(inspect(1n), '1n');
assert.strictEqual(inspect(Object(-1n)), '[BigInt: -1n]');
assert.strictEqual(inspect(Object(13n)), '[BigInt: 13n]');
From e182ca9bdcc47c0a8b0045bf0f574fe4613291d2 Mon Sep 17 00:00:00 2001
From: Ruben Bridgewater
Date: Sun, 23 Dec 2018 17:42:27 +0100
Subject: [PATCH 014/246] test: add more inspect subclassing tests
So far we do not test all data types for subclasses and this extends
the existing tests for WeakSet, WeakMap and BigInt64Array.
PR-URL: https://github.com/nodejs/node/pull/25192
Reviewed-By: Anto Aravinth
Reviewed-By: James M Snell
---
test/parallel/test-util-inspect.js | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/test/parallel/test-util-inspect.js b/test/parallel/test-util-inspect.js
index 9ee027208975..66887a10f48c 100644
--- a/test/parallel/test-util-inspect.js
+++ b/test/parallel/test-util-inspect.js
@@ -1662,7 +1662,10 @@ assert.strictEqual(util.inspect('"\'${a}'), "'\"\\'${a}'");
// Verify that subclasses with and without prototype produce nice results.
[
- [RegExp, ['foobar', 'g'], '/foobar/g']
+ [RegExp, ['foobar', 'g'], '/foobar/g'],
+ [WeakSet, [[{}]], '{ }'],
+ [WeakMap, [[[{}, {}]]], '{ }'],
+ [BigInt64Array, [10], '[ 0n, 0n, 0n, 0n, 0n, 0n, 0n, 0n, 0n, 0n ]']
].forEach(([base, input, rawExpected]) => {
class Foo extends base {}
const value = new Foo(...input);
From 561c2689efd7996b46ac3e5fcff5a2176a81b746 Mon Sep 17 00:00:00 2001
From: Ruben Bridgewater
Date: Thu, 20 Dec 2018 17:36:57 +0100
Subject: [PATCH 015/246] console: use spread notation instead of Object.assign
PR-URL: https://github.com/nodejs/node/pull/25149
Reviewed-By: Anna Henningsen
Reviewed-By: Luigi Pinca
Reviewed-By: James M Snell
Reviewed-By: Denys Otrishko
---
lib/internal/console/constructor.js | 14 +++++++++-----
1 file changed, 9 insertions(+), 5 deletions(-)
diff --git a/lib/internal/console/constructor.js b/lib/internal/console/constructor.js
index 1090f8fde68d..dcfb5f4a70a8 100644
--- a/lib/internal/console/constructor.js
+++ b/lib/internal/console/constructor.js
@@ -411,11 +411,15 @@ Console.prototype.table = function(tabularData, properties) {
const final = (k, v) => this.log(cliTable(k, v));
const inspect = (v) => {
- const opt = { depth: 0, maxArrayLength: 3 };
- if (v !== null && typeof v === 'object' &&
- !isArray(v) && ObjectKeys(v).length > 2)
- opt.depth = -1;
- Object.assign(opt, this[kGetInspectOptions](this._stdout));
+ const depth = v !== null &&
+ typeof v === 'object' &&
+ !isArray(v) &&
+ ObjectKeys(v).length > 2 ? -1 : 0;
+ const opt = {
+ depth,
+ maxArrayLength: 3,
+ ...this[kGetInspectOptions](this._stdout)
+ };
return util.inspect(v, opt);
};
const getIndexArray = (length) => ArrayFrom({ length }, (_, i) => inspect(i));
From 88e73862ca432759345a93e92ee1ee633cdd6a6c Mon Sep 17 00:00:00 2001
From: Kazushi Kitaya
Date: Fri, 21 Dec 2018 18:32:02 +0900
Subject: [PATCH 016/246] util: simplify code
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Simplify code by using return value of Object.defineProperty directly.
PR-URL: https://github.com/nodejs/node/pull/25162
Reviewed-By: Vladimir de Turckheim
Reviewed-By: Masashi Hirano
Reviewed-By: James M Snell
Reviewed-By: Tobias Nießen
Reviewed-By: Ruben Bridgewater
---
lib/internal/util.js | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/lib/internal/util.js b/lib/internal/util.js
index 3aa00fed3595..c393e44d5d62 100644
--- a/lib/internal/util.js
+++ b/lib/internal/util.js
@@ -267,10 +267,9 @@ function promisify(original) {
if (typeof fn !== 'function') {
throw new ERR_INVALID_ARG_TYPE('util.promisify.custom', 'Function', fn);
}
- Object.defineProperty(fn, kCustomPromisifiedSymbol, {
+ return Object.defineProperty(fn, kCustomPromisifiedSymbol, {
value: fn, enumerable: false, writable: false, configurable: true
});
- return fn;
}
// Names to create an object from in case the callback receives multiple
From 3af173df003036ccc7721b14bc25a2f93be5d32a Mon Sep 17 00:00:00 2001
From: Sam Roberts
Date: Fri, 21 Dec 2018 08:25:17 -0800
Subject: [PATCH 017/246] doc: link and expand --tls-cipher-list docs
Link to the cli docs for --tls-cipher-list, and link to and mention that
NODE_OPTIONS can also be used.
PR-URL: https://github.com/nodejs/node/pull/25174
Reviewed-By: Luigi Pinca
Reviewed-By: James M Snell
Reviewed-By: Vse Mozhet Byt
---
doc/api/tls.md | 14 ++++++++++----
1 file changed, 10 insertions(+), 4 deletions(-)
diff --git a/doc/api/tls.md b/doc/api/tls.md
index d16af379e12f..634b45e37802 100644
--- a/doc/api/tls.md
+++ b/doc/api/tls.md
@@ -169,12 +169,16 @@ HIGH:
!CAMELLIA
```
-This default can be replaced entirely using the `--tls-cipher-list` command
-line switch. For instance, the following makes
-`ECDHE-RSA-AES128-GCM-SHA256:!RC4` the default TLS cipher suite:
+This default can be replaced entirely using the [`--tls-cipher-list`][] command line
+switch (directly, or via the [`NODE_OPTIONS`][] environment variable). For
+instance, the following makes `ECDHE-RSA-AES128-GCM-SHA256:!RC4` the default
+TLS cipher suite:
```sh
-node --tls-cipher-list="ECDHE-RSA-AES128-GCM-SHA256:!RC4"
+node --tls-cipher-list="ECDHE-RSA-AES128-GCM-SHA256:!RC4" server.js
+
+export NODE_OPTIONS=--tls-cipher-list="ECDHE-RSA-AES128-GCM-SHA256:!RC4"
+node server.js
```
The default can also be replaced on a per client or server basis using the
@@ -1412,6 +1416,8 @@ where `secureSocket` has the same API as `pair.cleartext`.
[`'secureConnect'`]: #tls_event_secureconnect
[`'secureConnection'`]: #tls_event_secureconnection
+[`--tls-cipher-list`]: cli.html#cli_tls_cipher_list_list
+[`NODE_OPTIONS`]: cli.html#cli_node_options_options
[`SSL_CTX_set_timeout`]: https://www.openssl.org/docs/man1.1.0/ssl/SSL_CTX_set_timeout.html
[`crypto.getCurves()`]: crypto.html#crypto_crypto_getcurves
[`dns.lookup()`]: dns.html#dns_dns_lookup_hostname_options_callback
From e6da77b12c8f8cde88fc0a21b8aa3773da9dc063 Mon Sep 17 00:00:00 2001
From: Sam Roberts
Date: Fri, 21 Dec 2018 14:16:19 -0800
Subject: [PATCH 018/246] doc: describe TLS session resumption
PR-URL: https://github.com/nodejs/node/pull/25174
Reviewed-By: Luigi Pinca
Reviewed-By: James M Snell
Reviewed-By: Vse Mozhet Byt
---
doc/api/tls.md | 186 ++++++++++++++++++++++++++++++++++++++-----------
1 file changed, 147 insertions(+), 39 deletions(-)
diff --git a/doc/api/tls.md b/doc/api/tls.md
index 634b45e37802..ec7af9f14f8b 100644
--- a/doc/api/tls.md
+++ b/doc/api/tls.md
@@ -140,6 +140,94 @@ To test the renegotiation limits on a server, connect to it using the OpenSSL
command-line client (`openssl s_client -connect address:port`) then input
`R` (i.e., the letter `R` followed by a carriage return) multiple times.
+### Session Resumption
+
+Establishing a TLS session can be relatively slow. The process can be sped
+up by saving and later reusing the session state. There are several mechanisms
+to do so, discussed here from oldest to newest (and preferred).
+
+***Session Identifiers*** Servers generate a unique ID for new connections and
+send it to the client. Clients and servers save the session state. When
+reconnecting, clients send the ID of their saved session state and if the server
+also has the state for that ID, it can agree to use it. Otherwise, the server
+will create a new session. See [RFC 2246][] for more information, page 23 and
+30.
+
+Resumption using session identifiers is supported by most web browsers when
+making HTTPS requests.
+
+For Node.js, clients must call [`tls.TLSSocket.getSession()`][] after the
+[`'secureConnect'`][] event to get the session data, and provide the data to the
+`session` option of [`tls.connect()`][] to reuse the session. Servers must
+implement handlers for the [`'newSession'`][] and [`'resumeSession'`][] events
+to save and restore the session data using the session ID as the lookup key to
+reuse sessions. To reuse sessions across load balancers or cluster workers,
+servers must use a shared session cache (such as Redis) in their session
+handlers.
+
+***Session Tickets*** The servers encrypt the entire session state and send it
+to the client as a "ticket". When reconnecting, the state is sent to the server
+in the initial connection. This mechanism avoids the need for server-side
+session cache. If the server doesn't use the ticket, for any reason (failure
+to decrypt it, it's too old, etc.), it will create a new session and send a new
+ticket. See [RFC 5077][] for more information.
+
+Resumption using session tickets is becoming commonly supported by many web
+browsers when making HTTPS requests.
+
+For Node.js, clients use the same APIs for resumption with session identifiers
+as for resumption with session tickets. For debugging, if
+[`tls.TLSSocket.getTLSTicket()`][] returns a value, the session data contains a
+ticket, otherwise it contains client-side session state.
+
+Single process servers need no specific implementation to use session tickets.
+To use session tickets across server restarts or load balancers, servers must
+all have the same ticket keys. There are three 16-byte keys internally, but the
+tls API exposes them as a single 48-byte buffer for convenience.
+
+Its possible to get the ticket keys by calling [`server.getTicketKeys()`][] on
+one server instance and then distribute them, but it is more reasonable to
+securely generate 48 bytes of secure random data and set them with the
+`ticketKeys` option of [`tls.createServer()`][]. The keys should be regularly
+regenerated and server's keys can be reset with
+[`server.setTicketKeys()`][].
+
+Session ticket keys are cryptographic keys, and they ***must be stored
+securely***. With TLS 1.2 and below, if they are compromised all sessions that
+used tickets encrypted with them can be decrypted. They should not be stored
+on disk, and they should be regenerated regularly.
+
+If clients advertise support for tickets, the server will send them. The
+server can disable tickets by supplying
+`require('constants').SSL_OP_NO_TICKET` in `secureOptions`.
+
+Both session identifiers and session tickets timeout, causing the server to
+create new sessions. The timeout can be configured with the `sessionTimeout`
+option of [`tls.createServer()`][].
+
+For all the mechanisms, when resumption fails, servers will create new sessions.
+Since failing to resume the session does not cause TLS/HTTPS connection
+failures, it is easy to not notice unnecessarily poor TLS performance. The
+OpenSSL CLI can be used to verify that servers are resuming sessions. Use the
+`-reconnect` option to `openssl s_client`, for example:
+
+```sh
+$ openssl s_client -connect localhost:443 -reconnect
+```
+
+Read through the debug output. The first connection should say "New", for
+example:
+
+```text
+New, TLSv1.2, Cipher is ECDHE-RSA-AES128-GCM-SHA256
+```
+
+Subsequent connections should say "Reused", for example:
+
+```text
+Reused, TLSv1.2, Cipher is ECDHE-RSA-AES128-GCM-SHA256
+```
+
## Modifying the Default TLS Cipher suite
Node.js is built with a default suite of enabled and disabled TLS ciphers.
@@ -169,10 +257,10 @@ HIGH:
!CAMELLIA
```
-This default can be replaced entirely using the [`--tls-cipher-list`][] command line
-switch (directly, or via the [`NODE_OPTIONS`][] environment variable). For
-instance, the following makes `ECDHE-RSA-AES128-GCM-SHA256:!RC4` the default
-TLS cipher suite:
+This default can be replaced entirely using the [`--tls-cipher-list`][] command
+line switch (directly, or via the [`NODE_OPTIONS`][] environment variable). For
+instance, the following makes `ECDHE-RSA-AES128-GCM-SHA256:!RC4` the default TLS
+cipher suite:
```sh
node --tls-cipher-list="ECDHE-RSA-AES128-GCM-SHA256:!RC4" server.js
@@ -221,11 +309,13 @@ added: v0.9.2
-->
The `'newSession'` event is emitted upon creation of a new TLS session. This may
-be used to store sessions in external storage. The listener callback is passed
-three arguments when called:
+be used to store sessions in external storage. The data should be provided to
+the [`'resumeSession'`][] callback.
+
+The listener callback is passed three arguments when called:
-* `sessionId` - The TLS session identifier
-* `sessionData` - The TLS session data
+* `sessionId` {Buffer} The TLS session identifier
+* `sessionData` {Buffer} The TLS session data
* `callback` {Function} A callback function taking no arguments that must be
invoked in order for data to be sent or received over the secure connection.
@@ -288,15 +378,19 @@ The `'resumeSession'` event is emitted when the client requests to resume a
previous TLS session. The listener callback is passed two arguments when
called:
-* `sessionId` - The TLS/SSL session identifier
+* `sessionId` {Buffer} The TLS session identifier
* `callback` {Function} A callback function to be called when the prior session
- has been recovered.
-
-When called, the event listener may perform a lookup in external storage using
-the given `sessionId` and invoke `callback(null, sessionData)` once finished. If
-the session cannot be resumed (i.e., doesn't exist in storage) the callback may
-be invoked as `callback(null, null)`. Calling `callback(err)` will terminate the
-incoming connection and destroy the socket.
+ has been recovered: `callback([err[, sessionData]])`
+ * `err` {Error}
+ * `sessionData` {Buffer}
+
+The event listener should perform a lookup in external storage for the
+`sessionData` saved by the [`'newSession'`][] event handler using the given
+`sessionId`. If found, call `callback(null, sessionData)` to resume the session.
+If not found, the session cannot be resumed. `callback()` must be called
+without `sessionData` so that the handshake can continue and a new session can
+be created. It is possible to call `callback(err)` to terminate the incoming
+connection and destroy the socket.
Listening for this event will have an effect only on connections established
after the addition of the event listener.
@@ -406,10 +500,11 @@ Returns the current number of concurrent connections on the server.
added: v3.0.0
-->
-* Returns: {Buffer}
+* Returns: {Buffer} A 48-byte buffer containing the session ticket keys.
-Returns a `Buffer` instance holding the keys currently used for
-encryption/decryption of the [TLS Session Tickets][].
+Returns the session ticket keys.
+
+See [Session Resumption][] for more information.
### server.listen()
@@ -433,17 +528,15 @@ existing server. Existing connections to the server are not interrupted.
added: v3.0.0
-->
-* `keys` {Buffer} The keys used for encryption/decryption of the
- [TLS Session Tickets][].
-
-Updates the keys for encryption/decryption of the [TLS Session Tickets][].
+* `keys` {Buffer} A 48-byte buffer containing the session ticket keys.
-The key's `Buffer` should be 48 bytes long. See `ticketKeys` option in
-[`tls.createServer()`] for more information on how it is used.
+Sets the session ticket keys.
Changes to the ticket keys are effective only for future server connections.
Existing or currently pending server connections will use the previous keys.
+See [Session Resumption][] for more information.
+
## Class: tls.TLSSocket
-Returns the ASN.1 encoded TLS session or `undefined` if no session was
-negotiated. Can be used to speed up handshake establishment when reconnecting
-to the server.
+* {Buffer}
+
+Returns the TLS session data or `undefined` if no session was
+negotiated. On the client, the data can be provided to the `session` option of
+[`tls.connect()`][] to resume the connection. On the server, it may be useful
+for debugging.
+
+See [Session Resumption][] for more information.
### tlsSocket.getTLSTicket()
-Returns the TLS session ticket or `undefined` if no session was negotiated.
+* {Buffer}
+
+For a client, returns the TLS session ticket if one is available, or
+`undefined`. For a server, always returns `undefined`.
+
+It may be useful for debugging.
-This only works with client TLS sockets. Useful only for debugging, for session
-reuse provide `session` option to [`tls.connect()`][].
+See [Session Resumption][] for more information.
### tlsSocket.localAddress
ironfreddiskwentsoilputs/js/holyT22:ISBNT20:adamseesjson', 'contT21: RSSloopasiamoon
soulLINEfortcartT14:80px!--<9px;T04:mike:46ZniceinchYorkricezh:ä'));puremageparatonebond:37Z_of_']);000,zh:çtankyardbowlbush:56ZJava30px
+|}
+%C3%:34ZjeffEXPIcashvisagolfsnowzh:équer.csssickmeatmin.binddellhirepicsrent:36ZHTTP-201fotowolfEND xbox:54ZBODYdick;
+}
+exit:35Zvarsbeat'});diet999;anne}}[i].Langkm²wiretoysaddssealalex;
+ }echonine.org005)tonyjewssandlegsroof000) 200winegeardogsbootgarycutstyletemption.xmlcockgang$('.50pxPh.Dmiscalanloandeskmileryanunixdisc);}
+dustclip).
+
+70px-200DVDs7]>sonyguysfuckpipe|-
+!002)ndow[1];[];
+Log salt
+ bangtrimbath){
+00px
+});ko:ìfeesad>
s:// [];tollplug(){
+{
+ .js'200pdualboat.JPG);
+}quot);
+
+');
+
+}
201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037201320122011201020092008200720062005200420032002200120001999199819971996199519941993199219911990198919881987198619851984198319821981198019791978197719761975197419731972197119701969196819671966196519641963196219611960195919581957195619551954195319521951195010001024139400009999comomásesteestaperotodohacecadaañobiendÃaasÃvidacasootroforosolootracualdijosidograntipotemadebealgoquéestonadatrespococasabajotodasinoaguapuesunosantediceluisellamayozonaamorpisoobraclicellodioshoracasiзанаомрарутанепоотизнодотожеонихÐ�аеебымыВыÑ�овывоÐ�ообПолиниРФÐ�еМытыОнимдаЗаДаÐ�уОбтеИзейнуммТыужÙ�يأنمامعكلأوردياÙ�Ù‰Ù‡ÙˆÙ„Ù…Ù„ÙƒØ§ÙˆÙ„Ù‡Ø¨Ø³Ø§Ù„Ø¥Ù†Ù‡ÙŠØ£ÙŠÙ‚Ø¯Ù‡Ù„Ø«Ù…Ø¨Ù‡Ù„ÙˆÙ„ÙŠØ¨Ù„Ø§ÙŠØ¨ÙƒØ´ÙŠØ§Ù…Ø£Ù…Ù†ØªØ¨ÙŠÙ„Ù†ØØ¨Ù‡Ù…مشوشfirstvideolightworldmediawhitecloseblackrightsmallbooksplacemusicfieldorderpointvalueleveltableboardhousegroupworksyearsstatetodaywaterstartstyledeathpowerphonenighterrorinputabouttermstitletoolseventlocaltimeslargewordsgamesshortspacefocusclearmodelblockguideradiosharewomenagainmoneyimagenamesyounglineslatercolorgreenfront&watchforcepricerulesbeginaftervisitissueareasbelowindextotalhourslabelprintpressbuiltlinksspeedstudytradefoundsenseundershownformsrangeaddedstillmovedtakenaboveflashfixedoftenotherviewschecklegalriveritemsquickshapehumanexistgoingmoviethirdbasicpeacestagewidthloginideaswrotepagesusersdrivestorebreaksouthvoicesitesmonthwherebuildwhichearthforumthreesportpartyClicklowerlivesclasslayerentrystoryusagesoundcourtyour birthpopuptypesapplyImagebeinguppernoteseveryshowsmeansextramatchtrackknownearlybegansuperpapernorthlearngivennamedendedTermspartsGroupbrandusingwomanfalsereadyaudiotakeswhile.com/livedcasesdailychildgreatjudgethoseunitsneverbroadcoastcoverapplefilescyclesceneplansclickwritequeenpieceemailframeolderphotolimitcachecivilscaleenterthemetheretouchboundroyalaskedwholesincestock namefaithheartemptyofferscopeownedmightalbumthinkbloodarraymajortrustcanonunioncountvalidstoneStyleLoginhappyoccurleft:freshquitefilmsgradeneedsurbanfightbasishoverauto;route.htmlmixedfinalYour slidetopicbrownalonedrawnsplitreachRightdatesmarchquotegoodsLinksdoubtasyncthumballowchiefyouthnovel10px;serveuntilhandsCheckSpacequeryjamesequaltwice0,000Startpanelsongsroundeightshiftworthpostsleadsweeksavoidthesemilesplanesmartalphaplantmarksratesplaysclaimsalestextsstarswrongthing.org/multiheardPowerstandtokensolid(thisbringshipsstafftriedcallsfullyfactsagentThis //-->adminegyptEvent15px;Emailtrue"crossspentblogsbox">notedleavechinasizesguestrobotheavytrue,sevengrandcrimesignsawaredancephase>
+
+
+name=diegopage swiss-->
+
+#fff;">Log.com"treatsheet) && 14px;sleepntentfiledja:ãƒid="cName"worseshots-box-delta
+<bears:48Z spendbakershops= "";php">ction13px;brianhellosize=o=%2F joinmaybe , fjsimg" ")[0]MTopBType"newlyDanskczechtrailknowsfaq">zh-cn10);
+-1");type=bluestrulydavis.js';>
+
+form jesus100% menu.
+
+walesrisksumentddingb-likteachgif" vegasdanskeestishqipsuomisobredesdeentretodospuedeañosestátienehastaotrospartedondenuevohacerformamismomejormundoaquÃdÃassóloayudafechatodastantomenosdatosotrassitiomuchoahoralugarmayorestoshorastenerantesfotosestaspaÃsnuevasaludforosmedioquienmesespoderchileserávecesdecirjoséestarventagrupohechoellostengoamigocosasnivelgentemismaairesjuliotemashaciafavorjuniolibrepuntobuenoautorabrilbuenatextomarzosaberlistaluegocómoenerojuegoperúhaberestoynuncamujervalorfueralibrogustaigualvotoscasosguÃapuedosomosavisousteddebennochebuscafaltaeurosseriedichocursoclavecasasleónplazolargoobrasvistaapoyojuntotratavistocrearcampohemoscincocargopisosordenhacenáreadiscopedrocercapuedapapelmenorútilclarojorgecalleponertardenadiemarcasigueellassiglocochemotosmadreclaserestoniñoquedapasarbancohijosviajepabloéstevienereinodejarfondocanalnorteletracausatomarmanoslunesautosvillavendopesartipostengamarcollevapadreunidovamoszonasambosbandamariaabusomuchasubirriojavivirgradochicaallÃjovendichaestantalessalirsuelopesosfinesllamabuscoéstalleganegroplazahumorpagarjuntadobleislasbolsabañohablaluchaÃ�readicenjugarnotasvalleallácargadolorabajoestégustomentemariofirmacostofichaplatahogarartesleyesaquelmuseobasespocosmitadcielochicomiedoganarsantoetapadebesplayaredessietecortecoreadudasdeseoviejodeseaaguas"domaincommonstatuseventsmastersystemactionbannerremovescrollupdateglobalmediumfilternumberchangeresultpublicscreenchoosenormaltravelissuessourcetargetspringmodulemobileswitchphotosborderregionitselfsocialactivecolumnrecordfollowtitle>eitherlengthfamilyfriendlayoutauthorcreatereviewsummerserverplayedplayerexpandpolicyformatdoublepointsseriespersonlivingdesignmonthsforcesuniqueweightpeopleenergynaturesearchfigurehavingcustomoffsetletterwindowsubmitrendergroupsuploadhealthmethodvideosschoolfutureshadowdebatevaluesObjectothersrightsleaguechromesimplenoticesharedendingseasonreportonlinesquarebuttonimagesenablemovinglatestwinterFranceperiodstrongrepeatLondondetailformeddemandsecurepassedtoggleplacesdevicestaticcitiesstreamyellowattackstreetflighthiddeninfo">openedusefulvalleycausesleadersecretseconddamagesportsexceptratingsignedthingseffectfieldsstatesofficevisualeditorvolumeReportmuseummoviesparentaccessmostlymother" id="marketgroundchancesurveybeforesymbolmomentspeechmotioninsidematterCenterobjectexistsmiddleEuropegrowthlegacymannerenoughcareeransweroriginportalclientselectrandomclosedtopicscomingfatheroptionsimplyraisedescapechosenchurchdefinereasoncorneroutputmemoryiframepolicemodelsNumberduringoffersstyleskilledlistedcalledsilvermargindeletebetterbrowselimitsGlobalsinglewidgetcenterbudgetnowrapcreditclaimsenginesafetychoicespirit-stylespreadmakingneededrussiapleaseextentScriptbrokenallowschargedividefactormember-basedtheoryconfigaroundworkedhelpedChurchimpactshouldalwayslogo" bottomlist">){var prefixorangeHeader.push(couplegardenbridgelaunchReviewtakingvisionlittledatingButtonbeautythemesforgotSearchanchoralmostloadedChangereturnstringreloadMobileincomesupplySourceordersviewed courseAbout islandPhilipawardshandleimportOfficeregardskillsnationSportsdegreeweekly (e.g.behinddoctorloggedunitedbeyond-scaleacceptservedmarineFootercamera
+_form"leavesstress" />
+.gif" onloadloaderOxfordsistersurvivlistenfemaleDesignsize="appealtext">levelsthankshigherforcedanimalanyoneAfricaagreedrecentPeople wonderpricesturned|| {};main">inlinesundaywrap">failedcensusminutebeaconquotes150px|estateremoteemail"linkedright;signalformal1.htmlsignupprincefloat:.png" forum.AccesspaperssoundsextendHeightsliderUTF-8"& Before. WithstudioownersmanageprofitjQueryannualparamsboughtfamousgooglelongeri++) {israelsayingdecidehome">headerensurebranchpiecesblock;statedtop">boston.test(avatartested_countforumsschemaindex,filledsharesreaderalert(appearSubmitline">body">
+* TheThoughseeingjerseyNews
+System DavidcancertablesprovedApril reallydriveritem">more">boardscolorscampusfirst || [];media.guitarfinishwidth:showedOther .php" assumelayerswilsonstoresreliefswedenCustomeasily your String
+
+Whiltaylorclear:resortfrenchthough") + "buyingbrandsMembername">oppingsector5px;">vspacepostermajor coffeemartinmaturehappenkansaslink">Images=falsewhile hspace0&
+
+In powerPolski-colorjordanBottomStart -count2.htmlnews">01.jpgOnline-rightmillerseniorISBN 00,000 guidesvalue)ectionrepair.xml" rights.html-blockregExp:hoverwithinvirginphones
using
+ var >');
+
+
+bahasabrasilgalegomagyarpolskisrpskiØ±Ø¯Ùˆä¸æ–‡ç®€ä½“ç¹�體信æ�¯ä¸å›½æˆ‘们一个公å�¸ç®¡ç�†è®ºå�›å�¯ä»¥æœ�务时间个人产å“�自己ä¼�业查看工作è�”系没有网站所有评论ä¸å¿ƒæ–‡ç« 用户首页作者技术问题相关下载æ�œç´¢ä½¿ç”¨è½¯ä»¶åœ¨çº¿ä¸»é¢˜èµ„料视频回å¤�注册网络收è—�内容推è��市场消æ�¯ç©ºé—´å�‘布什么好å�‹ç”Ÿæ´»å›¾ç‰‡å�‘展如果手机新闻最新方å¼�北京æ��供关于更多这个系统知é�“游æˆ�广告其他å�‘表安全第一会员进行点击版æ�ƒç”µå�世界设计å…�è´¹æ•™è‚²åŠ å…¥æ´»åŠ¨ä»–ä»¬å•†å“�å�šå®¢çŽ°åœ¨ä¸Šæµ·å¦‚ä½•å·²ç»�留言详细社区登录本站需è¦�ä»·æ ¼æ”¯æŒ�国际链接国家建设朋å�‹é˜…读法律ä½�ç½®ç»�æµŽé€‰æ‹©è¿™æ ·å½“å‰�åˆ†ç±»æŽ’è¡Œå› ä¸ºäº¤æ˜“æœ€å�ŽéŸ³ä¹�ä¸�能通过行业科技å�¯èƒ½è®¾å¤‡å�ˆä½œå¤§å®¶ç¤¾ä¼šç ”究专业全部项目这里还是开始情况电脑文件å“�牌帮助文化资æº�大å¦å¦ä¹ 地å�€æµ�览投资工程è¦�求怎么时候功能主è¦�ç›®å‰�资讯城市方法电影招è�˜å£°æ˜Žä»»ä½•å�¥åº·æ•°æ�®ç¾Žå›½æ±½è½¦ä»‹ç»�但是交æµ�生产所以电è¯�显示一些å�•ä½�人员分æž�地图旅游工具å¦ç”Ÿç³»åˆ—网å�‹å¸–å�密ç �频é�“控制地区基本全国网上é‡�è¦�第二喜欢进入å�‹æƒ…这些考试å�‘现培è®ä»¥ä¸Šæ”¿åºœæˆ�为环境香港å�Œæ—¶å¨±ä¹�å�‘é€�一定开å�‘作å“�æ ‡å‡†æ¬¢è¿Žè§£å†³åœ°æ–¹ä¸€ä¸‹ä»¥å�Šè´£ä»»æˆ–者客户代表积分女人数ç �销售出现离线应用列表ä¸�å�Œç¼–辑统计查询ä¸�è¦�æœ‰å…³æœºæž„å¾ˆå¤šæ’æ”¾ç»„织政ç–直接能力æ�¥æº�時間看到çƒé—¨å…³é”®ä¸“区é�žå¸¸è‹±è¯ç™¾åº¦å¸Œæœ›ç¾Žå¥³æ¯”较知识规定建议部门æ„�è§�精彩日本æ��高å�‘言方é�¢åŸºé‡‘处ç�†æ�ƒé™�影片银行还有分享物å“�ç»�è�¥æ·»åŠ ä¸“å®¶è¿™ç§�è¯�题起æ�¥ä¸šåŠ¡å…¬å‘Šè®°å½•ç®€ä»‹è´¨é‡�男人影å“�引用报告部分快速咨询时尚注æ„�ç”³è¯·å¦æ ¡åº”该历å�²å�ªæ˜¯è¿”回è´ä¹°å��称为了æˆ�功说明供应å©å�专题程åº�一般會員å�ªæœ‰å…¶å®ƒä¿�护而且今天窗å�£åЍæ€�状æ€�特别认为必须更新å°�è¯´æˆ‘å€‘ä½œä¸ºåª’ä½“åŒ…æ‹¬é‚£ä¹ˆä¸€æ ·å›½å†…æ˜¯å�¦æ ¹æ�®ç”µè§†å¦é™¢å…·æœ‰è¿‡ç¨‹ç”±äºŽäººæ‰�出æ�¥ä¸�过æ£åœ¨æ˜Žæ˜Ÿæ•…äº‹å…³ç³»æ ‡é¢˜å•†åŠ¡è¾“å…¥ä¸€ç›´åŸºç¡€æ•™å¦äº†è§£å»ºç‘结果全ç�ƒé€šçŸ¥è®¡åˆ’对于艺术相册å�‘生真的建立ç‰çº§ç±»åž‹ç»�验实现制作æ�¥è‡ªæ ‡ç¾ä»¥ä¸‹åŽŸåˆ›æ— æ³•å…¶ä¸å€‹äººä¸€åˆ‡æŒ‡å�—å…³é—é›†å›¢ç¬¬ä¸‰å…³æ³¨å› æ¤ç…§ç‰‡æ·±åœ³å•†ä¸šå¹¿å·žæ—¥æœŸé«˜çº§æœ€è¿‘综å�ˆè¡¨ç¤ºä¸“辑行为交通评价觉得精å�Žå®¶åºå®Œæˆ�感觉安装得到邮件制度食å“�虽然转载报价记者方案行政人民用å“�东西æ��出酒店然å�Žä»˜æ¬¾çƒç‚¹ä»¥å‰�完全å�‘帖设置领导工业医院看看ç»�å…¸åŽŸå› å¹³å�°å�„ç§�å¢žåŠ æ��料新增之å�Žè�Œä¸šæ•ˆæžœä»Šå¹´è®ºæ–‡æˆ‘国告诉版主修改å�‚与打å�°å¿«ä¹�机械观点å˜åœ¨ç²¾ç¥žèŽ·å¾—åˆ©ç”¨ç»§ç»ä½ 们这么模å¼�è¯è¨€èƒ½å¤Ÿé›…虎æ“�ä½œé£Žæ ¼ä¸€èµ·ç§‘å¦ä½“育çŸä¿¡æ�¡ä»¶æ²»ç–—è¿�动产业会议导航先生è�”盟å�¯æ˜¯å•�題结构作用调查資料自动负责农业访问实施接å�—讨论那个å��é¦ˆåŠ å¼ºå¥³æ€§èŒƒå›´æœ�務休闲今日客æœ�觀看å�‚åŠ çš„è¯�一点ä¿�è¯�图书有效测试移动æ‰�能决定股票ä¸�æ–需求ä¸�得办法之间采用è�¥é”€æŠ•è¯‰ç›®æ ‡çˆ±æƒ…æ‘„å½±æœ‰äº›è¤‡è£½æ–‡å¦æœºä¼šæ•°å—装修è´ç‰©å†œæ�‘å…¨é�¢ç²¾å“�其实事情水平æ��ç¤ºä¸Šå¸‚è°¢è°¢æ™®é€šæ•™å¸ˆä¸Šä¼ ç±»åˆ«æŒæ›²æ‹¥æœ‰åˆ›æ–°é…�ä»¶å�ªè¦�时代資訊达到人生订阅è€�师展示心ç�†è´´å�網站主題自然级别简å�•改é�©é‚£äº›æ�¥è¯´æ‰“开代ç �åˆ é™¤è¯�券节目é‡�点次數多少规划资金找到以å�Žå¤§å…¨ä¸»é¡µæœ€ä½³å›žç”天下ä¿�障现代检查投票å°�时沒有æ£å¸¸ç”šè‡³ä»£ç�†ç›®å½•公开å¤�制金èž�幸ç¦�版本形æˆ�准备行情回到æ€�æƒ³æ€Žæ ·å��议认è¯�最好产生按照æœ�è£…å¹¿ä¸œåŠ¨æ¼«é‡‡è´æ–°æ‰‹ç»„图é�¢æ�¿å�‚考政治容易天地努力人们å�‡çº§é€Ÿåº¦äººç‰©è°ƒæ•´æµ�è¡Œé€ æˆ�æ–‡å—韩国贸易开展相關表现影视如æ¤ç¾Žå®¹å¤§å°�报é�“æ�¡æ¬¾å¿ƒæƒ…许多法规家居书店连接立å�³ä¸¾æŠ¥æŠ€å·§å¥¥è¿�登入以æ�¥ç�†è®ºäº‹ä»¶è‡ªç”±ä¸å�ŽåŠžå…¬å¦ˆå¦ˆçœŸæ£ä¸�错全文å�ˆå�Œä»·å€¼åˆ«äººç›‘ç�£å…·ä½“世纪团队创业承担增长有人ä¿�æŒ�商家维修å�°æ¹¾å·¦å�³è‚¡ä»½ç”案实际电信ç»�ç�†ç”Ÿå‘½å®£ä¼ 任务æ£å¼�特色下æ�¥å��会å�ªèƒ½å½“ç„¶é‡�新內容指导è¿�行日志賣家超过土地浙江支付推出站长æ�å·žæ‰§è¡Œåˆ¶é€ ä¹‹ä¸€æŽ¨å¹¿çŽ°åœºæ��è¿°å�˜åŒ–ä¼ ç»ŸæŒæ‰‹ä¿�险课程医疗ç»�过过去之å‰�收入年度æ�‚志美丽最高登陆未æ�¥åŠ å·¥å…�责教程版å�—身体é‡�庆出售æˆ�本形å¼�土豆出價东方邮箱å�—京求è�Œå�–å¾—è�Œä½�相信页é�¢åˆ†é’Ÿç½‘页确定图例网å�€ç§¯æž�错误目的å®�è´�机关风险授æ�ƒç—…æ¯’å® ç‰©é™¤äº†è©•è«–ç–¾ç—…å�Šæ—¶æ±‚è´ç«™ç‚¹å„¿ç«¥æ¯�天ä¸å¤®è®¤è¯†æ¯�个天津å—体å�°ç�£ç»´æŠ¤æœ¬é¡µä¸ªæ€§å®˜æ–¹å¸¸è§�ç›¸æœºæˆ˜ç•¥åº”å½“å¾‹å¸ˆæ–¹ä¾¿æ ¡å›è‚¡å¸‚房屋æ �目员工导致çª�ç„¶é�“具本网结å�ˆæ¡£æ¡ˆåŠ³åŠ¨å�¦å¤–美元引起改å�˜ç¬¬å››ä¼šè®¡èªªæ˜Žéš�ç§�å®�å®�规范消费共å�Œå¿˜è®°ä½“系带æ�¥å��å—ç™¼è¡¨å¼€æ”¾åŠ ç›Ÿå�—到二手大é‡�æˆ�人数é‡�共享区域女å©åŽŸåˆ™æ‰€åœ¨ç»“æ�Ÿé€šä¿¡è¶…级é…�置当时优秀性感房产é�Šæˆ²å‡ºå�£æ��交就业ä¿�å�¥ç¨‹åº¦å�‚数事业整个山东情感特殊分類æ�œå°‹å±žäºŽé—¨æˆ·è´¢åŠ¡å£°éŸ³å�Šå…¶è´¢ç»�å�šæŒ�干部æˆ�立利益考虑æˆ�都包装用戶比赛文明招商完整真是眼ç�›ä¼™ä¼´å¨�望领域å�«ç”Ÿä¼˜æƒ 論壇公共良好充分符å�ˆé™„件特点ä¸�å�¯è‹±æ–‡èµ„äº§æ ¹æœ¬æ˜Žæ˜¾å¯†ç¢¼å…¬ä¼—æ°‘æ—�æ›´åŠ äº«å�—å�Œå¦å�¯åЍ适å�ˆåŽŸæ�¥é—®ç”本文美食绿色稳定终于生物供求æ�œç‹�力é‡�严é‡�永远写真有é™�竞争对象费用ä¸�好ç»�对å��分促进点评影音优势ä¸�少欣èµ�并且有点方å�‘å…¨æ–°ä¿¡ç”¨è®¾æ–½å½¢è±¡èµ„æ ¼çª�ç ´éš�ç�€é‡�å¤§äºŽæ˜¯æ¯•ä¸šæ™ºèƒ½åŒ–å·¥å®Œç¾Žå•†åŸŽç»Ÿä¸€å‡ºç‰ˆæ‰“é€ ç”¢å“�概况用于ä¿�ç•™å› ç´ ä¸åœ‹å˜å‚¨è´´å›¾æœ€æ„›é•¿æœŸå�£ä»·ç�†è´¢åŸºåœ°å®‰æŽ’æ¦æ±‰é‡Œé�¢åˆ›å»ºå¤©ç©ºé¦–先完善驱动下é�¢ä¸�å†�诚信æ„�义阳光英国漂亮军事玩家群众农民å�³å�¯å��稱家具动画想到注明å°�妿€§èƒ½è€ƒç ”硬件观看清楚æ�žç¬‘首é �黄金适用江è‹�真实主管阶段註冊翻译æ�ƒåˆ©å�šå¥½ä¼¼ä¹Žé€šè®¯æ–½å·¥ç‹€æ…‹ä¹Ÿè®¸çޝä¿�培养概念大型机票ç�†è§£åŒ¿å��cuandoenviarmadridbuscariniciotiempoporquecuentaestadopuedenjuegoscontraestánnombretienenperfilmaneraamigosciudadcentroaunquepuedesdentroprimerpreciosegúnbuenosvolverpuntossemanahabÃaagostonuevosunidoscarlosequiponiñosmuchosalgunacorreoimagenpartirarribamarÃahombreempleoverdadcambiomuchasfueronpasadolÃneaparecenuevascursosestabaquierolibroscuantoaccesomiguelvarioscuatrotienesgruposseráneuropamediosfrenteacercademásofertacochesmodeloitalialetrasalgúncompracualesexistecuerposiendoprensallegarviajesdineromurciapodrápuestodiariopuebloquieremanuelpropiocrisisciertoseguromuertefuentecerrargrandeefectopartesmedidapropiaofrecetierrae-mailvariasformasfuturoobjetoseguirriesgonormasmismosúnicocaminositiosrazóndebidopruebatoledotenÃajesúsesperococinaorigentiendacientocádizhablarserÃalatinafuerzaestiloguerraentraréxitolópezagendavÃdeoevitarpaginametrosjavierpadresfácilcabezaáreassalidaenvÃojapónabusosbienestextosllevarpuedanfuertecomúnclaseshumanotenidobilbaounidadestáseditarcreadoдлÑ�чтокакилиÑ�товÑ�еегопритакещеужеКакбезбылониВÑ�еподÐтотомчемнетлетразонагдемнеДлÑ�ПринаÑ�нихтемктогодвоттамСШÐ�маÑ�ЧтоваÑ�вамемуТакдванамÑ�тиÑ�туВамтехпротутнадднÑ�ВоттринейВаÑ�нимÑ�амтотрубОнимирнееОООлицÑ�таОнанемдоммойдвеоноÑ�удकेहैकीसेकाकोऔरपरनेà¤�ककिà¤à¥€à¤‡à¤¸à¤•रतोहोआपहीयहयातकथाjagranआजजोअबदोगईजागà¤�हमइनवहयेथेथीघरजबदीकईजीवेनईनà¤�हरउसमेकमवोलेसबमईदेओरआमबसà¤à¤°à¤¬à¤¨à¤šà¤²à¤®à¤¨à¤†à¤—à¤¸à¥€à¤²à¥€Ø¹Ù„Ù‰Ø¥Ù„Ù‰Ù‡Ø°Ø§Ø¢Ø®Ø±Ø¹Ø¯Ø¯Ø§Ù„Ù‰Ù‡Ø°Ù‡ØµÙˆØ±ØºÙŠØ±ÙƒØ§Ù†ÙˆÙ„Ø§Ø¨ÙŠÙ†Ø¹Ø±Ø¶Ø°Ù„ÙƒÙ‡Ù†Ø§ÙŠÙˆÙ…Ù‚Ø§Ù„Ø¹Ù„ÙŠØ§Ù†Ø§Ù„ÙƒÙ†ØØªÙ‰Ù‚Ø¨Ù„ÙˆØØ©Ø§Ø®Ø±Ù�Ù‚Ø·Ø¹Ø¨Ø¯Ø±ÙƒÙ†Ø¥Ø°Ø§ÙƒÙ…Ø§Ø§ØØ¯Ø¥Ù„اÙ�يهبعضكيÙ�Ø¨ØØ«ÙˆÙ…نوهوأناجدالهاسلمعندليسعبرصلىمنذبهاأنهمثلكنتالاØÙŠØ«Ù…ØµØ±Ø´Ø±ØØÙˆÙ„ÙˆÙ�ياذالكلمرةانتالÙ�Ø£Ø¨ÙˆØ®Ø§ØµØ£Ù†ØªØ§Ù†Ù‡Ø§Ù„ÙŠØ¹Ø¶ÙˆÙˆÙ‚Ø¯Ø§Ø¨Ù†Ø®ÙŠØ±Ø¨Ù†ØªÙ„ÙƒÙ…Ø´Ø§Ø¡ÙˆÙ‡ÙŠØ§Ø¨ÙˆÙ‚ØµØµÙˆÙ…Ø§Ø±Ù‚Ù…Ø£ØØ¯Ù†ØÙ†Ø¹Ø¯Ù…Ø±Ø£ÙŠØ§ØØ©ÙƒØªØ¨Ø¯ÙˆÙ†ÙŠØ¬Ø¨Ù…Ù†Ù‡ØªØØªØ¬Ù‡Ø©Ø³Ù†Ø©ÙŠØªÙ…كرةغزةنÙ�سبيتللهلناتلكقلبلماعنهأولشيءنورأماÙ�يكبكلذاترتببأنهمسانكبيعÙ�Ù‚Ø¯ØØ³Ù†Ù„همشعرأهلشهرقطرطلبprofileservicedefaulthimselfdetailscontentsupportstartedmessagesuccessfashioncountryaccountcreatedstoriesresultsrunningprocesswritingobjectsvisiblewelcomearticleunknownnetworkcompanydynamicbrowserprivacyproblemServicerespectdisplayrequestreservewebsitehistoryfriendsoptionsworkingversionmillionchannelwindow.addressvisitedweathercorrectproductedirectforwardyou canremovedsubjectcontrolarchivecurrentreadinglibrarylimitedmanagerfurthersummarymachineminutesprivatecontextprogramsocietynumberswrittenenabledtriggersourcesloadingelementpartnerfinallyperfectmeaningsystemskeepingculture",journalprojectsurfaces"expiresreviewsbalanceEnglishContentthroughPlease opinioncontactaverageprimaryvillageSpanishgallerydeclinemeetingmissionpopularqualitymeasuregeneralspeciessessionsectionwriterscounterinitialreportsfiguresmembersholdingdisputeearlierexpressdigitalpictureAnothermarriedtrafficleadingchangedcentralvictoryimages/reasonsstudiesfeaturelistingmust beschoolsVersionusuallyepisodeplayinggrowingobviousoverlaypresentactions
+wrapperalreadycertainrealitystorageanotherdesktopofferedpatternunusualDigitalcapitalWebsitefailureconnectreducedAndroiddecadesregular & animalsreleaseAutomatgettingmethodsnothingPopularcaptionletterscapturesciencelicensechangesEngland=1&History = new CentralupdatedSpecialNetworkrequirecommentwarningCollegetoolbarremainsbecauseelectedDeutschfinanceworkersquicklybetweenexactlysettingdiseaseSocietyweaponsexhibit<!--Controlclassescoveredoutlineattacksdevices(windowpurposetitle="Mobile killingshowingItaliandroppedheavilyeffects-1']);
+confirmCurrentadvancesharingopeningdrawingbillionorderedGermanyrelatedincludewhetherdefinedSciencecatalogArticlebuttonslargestuniformjourneysidebarChicagoholidayGeneralpassage,"animatefeelingarrivedpassingnaturalroughly.
+
+The but notdensityBritainChineselack oftributeIreland" data-factorsreceivethat isLibraryhusbandin factaffairsCharlesradicalbroughtfindinglanding:lang="return leadersplannedpremiumpackageAmericaEdition]"Messageneed tovalue="complexlookingstationbelievesmaller-mobilerecordswant tokind ofFirefoxyou aresimilarstudiedmaximumheadingrapidlyclimatekingdomemergedamountsfoundedpioneerformuladynastyhow to SupportrevenueeconomyResultsbrothersoldierlargelycalling."AccountEdward segmentRobert effortsPacificlearnedup withheight:we haveAngelesnations_searchappliedacquiremassivegranted: falsetreatedbiggestbenefitdrivingStudiesminimumperhapsmorningsellingis usedreversevariant role="missingachievepromotestudentsomeoneextremerestorebottom:evolvedall thesitemapenglishway to AugustsymbolsCompanymattersmusicalagainstserving})();
+paymenttroubleconceptcompareparentsplayersregionsmonitor ''The winningexploreadaptedGalleryproduceabilityenhancecareers). The collectSearch ancientexistedfooter handlerprintedconsoleEasternexportswindowsChannelillegalneutralsuggest_headersigning.html">settledwesterncausing-webkitclaimedJusticechaptervictimsThomas mozillapromisepartieseditionoutside:false,hundredOlympic_buttonauthorsreachedchronicdemandssecondsprotectadoptedprepareneithergreatlygreateroverallimprovecommandspecialsearch.worshipfundingthoughthighestinsteadutilityquarterCulturetestingclearlyexposedBrowserliberal} catchProjectexamplehide();FloridaanswersallowedEmperordefenseseriousfreedomSeveral-buttonFurtherout of != nulltrainedDenmarkvoid(0)/all.jspreventRequestStephen
+
+When observe
+Modern provide" alt="borders.
+
+For
+
+Many artistspoweredperformfictiontype ofmedicalticketsopposedCouncilwitnessjusticeGeorge Belgium...twitternotablywaitingwarfare Other rankingphrasesmentionsurvivescholar
+ Countryignoredloss ofjust asGeorgiastrange
+ severalbecomesselect wedding00.htmlmonarchoff theteacherhighly biologylife ofor evenrise of»plusonehunting(thoughDouglasjoiningcirclesFor theAncientVietnamvehiclesuch ascrystalvalue =Windowsenjoyeda smallassumed