@Bergiss

Как отправить HTTP/2 get запрос, используя модуль tls?

Подскажите , как можно отправить http2 запрос на сервер, используя лишь модуль tls ?
При отправке запроса через curl с сервера приходит обычный ответ
curl --location --http2 --request GET 'https://twitter.com'

<!DOCTYPE html>
<html dir="ltr" lang="en">
<head>
...

Но когда я пробую отправить запрос через tls - я не получаю никакого ответа / непонятный набор байт
Вот мой код для отправки запроса:
const tls = require('tls');
const {constants} = require("crypto");


// Define options for the TLS connection
const options = {
    host: 'twitter.com',
    port: 443,
    ALPNProtocols: ['h2'], // Enable HTTP/2
    ciphers: 'TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA256:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!SRP:!CAMELLIA',
    secureProtocol: ['TLSv1_2_method', 'TLSv1_3_method', 'SSL_OP_NO_SSLv3', 'SSL_OP_NO_SSLv2'],
    secure: true,
    requestCert: true,
    honorCipherOrder: true,
    secureOptions: constants.SSL_OP_NO_SSLv3,
    rejectUnauthorized: false,
};

// Establish the TLS connection
const socket = tls.connect(options, () => {
    console.log('TLS connection established');
    // Send the HTTP/2 GET request
    const request = [
        'GET / HTTP/2.0',
        'host: twitter.com',
        '',
        ''
    ].join('\r\n');
    socket.write(request);
});

let response = '';
socket.on('data', (data) => {
    response += data;
});
socket.on('end', () => {
    console.log('Response from server:');
    console.log(response);
});


Как можно решить данную проблему и получить "нормальный" ответ от сервера ?
  • Вопрос задан
  • 119 просмотров
Пригласить эксперта
Ответы на вопрос 1
ElonMask2
@ElonMask2
Autor of Tesla Machini and SpaxeX
Ты угораешь?
curl --location --http2 --request GET 'https://twitter.com'

он тебе и пришлет http2 ответ ты заголовки посмотри

// Send the HTTP/2 GET request
    const request = [
        'GET / HTTP/2.0',
        'host: twitter.com',
        '',
        ''
    ].join('\r\n');
    socket.write(request);

вот это - не http2 реквест
ты погугли различия 2 и 1.1 1.0 0.9 версий
http2 использует cжатие заголовков и его нельзя отправить in plaintext
http2 это не tls + alpn[h2] + http/1.1
чтобы отправить http2 из кода нужно использовать библиотеку http например, httpx для python
а джаваскриптеры идут на
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы