https-server.js
var https = require('https');
var url = require('url');
/////////////////////////////////////////////////////////////////////
var forge = require('node-forge'); // npm install node-forge
var keyPair = forge.pki.rsa.generateKeyPair(2048);
var cert = forge.pki.createCertificate();
var now = new Date();
var oneYear = new Date(new Date(now).setFullYear(now.getFullYear() + 1));
Object.assign(cert, {
publicKey: keyPair.publicKey,
serialNumber: '01',
validity: {
notBefore: now,
notAfter: oneYear
}
});
cert.sign(keyPair.privateKey, forge.md.sha256.create()); // self signed
var serverPrivateKeyPem = forge.pki.privateKeyToPem(keyPair.privateKey);
var serverPublicKeyPem = forge.pki.publicKeyToPem(keyPair.publicKey);
var serverCertificatePem = forge.pki.certificateToPem(cert);
var options = {
key: serverPrivateKeyPem
cert: serverCertificatePem
};
/////////////////////////////////////////////////////////////////////
var server = https.createServer(options);
server.on('connection', function (socket) {
console.log('Клиент установил socket-соединение с сервером.');
});
server.on('request', function (request, response) {
console.log(request.httpVersion);
console.log(request.method);
console.log(url.parse(request.url));
console.log(request.rawHeaders);
console.log(request.headers);
console.log(request.rawTrailers);
request.on('aborted', function () {
console.log('Клиент прервал свое соединение с сервером.');
if (request.aborted) {console.log('Соединение с сервером прервано клиентом.');}
});
request.on('close', function () {
console.log('Клиент закрыл свое соединение с сервером.');
});
request.on('data', function (data) {});
request.on('end', function (data) {
console.log(request.trailers);
if (request.complete) {console.log('Клиент передал серверу все данные.');}
response.on('finish', function () {
console.log('Сервер завершил отправку данных клиенту.');
});
response.on('close', function () {
console.log('Сервер закрыл соединение с клиентом.');
});
console.log('Ваш IP-адрес ' + response.socket.remoteAddress + ' и порт ' + response.socket.remotePort);
response.statusCode = 404;
response.statusMessage = 'Not found';
response.setHeader('Set-Cookie', ['type=ninja', 'language=javascript']);
var headerNames = response.getHeaderNames();
var headers = response.getHeaders();
var setCookie = response.getHeader('set-cookie');
if (response.hasHeader('set-cookie')) {console.log('Заголовок Set-Cookie установлен.');}
response.removeHeader('Set-Cookie');
response.sendDate = false; // Не посылать заголовок с датой клиенту.
response.writeHead(200, { 'Content-Type': 'text/plain', 'Trailer': 'Content-MD5' });
if (response.headersSent) {console.log('Заголовки были отправлены клиенту.');}
response.write('<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>Главная страница</title></head><body><h1>Привет!</h1></body></html>');
response.addTrailers({'Content-MD5': '7895bf4b8828b55ceaf47747b4bca667'});
response.end();
if (response.finished) {console.log('Сервер отправил все данные клиенту.');}
});
});
server.on('checkExpectation', function (request, response) {
console.log('От клиента был получен HTTP-заголовок "Expect" со значением не равным 100-continue.');
});
server.on('checkContinue', function (request, response) {
console.log('От клиента был получен HTTP-заголовок "Expect: 100-continue".');
response.writeContinue();
});
server.on('clientError', function (error, socket) {
socket.end('HTTP/1.1 400 Bad Request\r\n\r\n');
});
server.on('close', function () {
console.log('Сервер закрылся.');
});
server.on('error', function (error) {
console.log('На сервер произошла ошибка.');
server.close();
});
server.listen(443, '127.0.0.1', function () {
console.log('Серер стартовал по адресу 127.0.0.1:443');
});
if (server.listening) {console.log('Сервер прослушивает входящие соединения.');}
https-client.js
var http = require('http');
var https = require('https');
var querystring = require('querystring');
var postData = querystring.stringify({'msg': 'Hello World!'});
var options = {
/////////////////////////////////////////////////////////////////////
rejectUnauthorized: false, // don't check certificate
requestCert: true,
/////////////////////////////////////////////////////////////////////
method: 'POST',
protocol: 'https:',
auth: 'user:password',
hostname: '127.0.0.1',
port: 443,
path: '/page/upload.html',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': Buffer.byteLength(postData)
}
};
var client = http.request(options);
client.on('response', function (response) {
console.log('Код статуса ответа сервера: ' + response.statusCode);
console.log('Статус ответа сервера: ' + http.STATUS_CODES[response.statusCode]);
console.log('Заголовки переданные сервером: ' + JSON.stringify(response.headers));
response.setEncoding('utf8');
response.on('data', function (data) {console.log('Ответ от сервера: ' + data);});
response.on('end', function (data) {console.log('Передача данных от сервера завершена.');});
});
client.setTimeout(1000);
client.on('timeout', function () {
client.abort();
if (client.aborted) {console.log('Клиент отменил соединение с сервером.');}
});
client.on('abort', function () {
console.log('Клиент отменил соединение с сервером.');
});
client.on('error', function (error) {
console.log('Произошла ошибка при выполнении клиентского запроса на сервер.');
throw error;
});
client.on('continue', function () {
console.log('Сервер прислал HTTP-заголовок "100 Continue" в ответ на заголовок "Expect: 100-continue", отправленный клиентом на сервер.');
console.log('Клиенту следует послать на сервер тело запроса.');
});
client.setHeader('Cookie', ['type=ninja', 'language=javascript']);
var cookie = client.getHeader('Cookie');
client.removeHeader('Cookie');
client.write(postData);
client.end();
if (client.finished) {console.log('Отправка данных на сервер завершена.');}
Комментариев нет:
Отправить комментарий