Я не эксперт по узлам, и я, возможно, совершенно не понял, что вы пытаетесь сделать здесь, но я действительно изо всех сил пытаюсь разобраться в этом вопросе ...
Если вы пытаетесь заставить Node выступать в качестве прокси-сервера HTTP / 2 (чтобы клиент мог подключиться через h2c к узлу и передавал эти данные другому серверу, поддерживающему HTTP / 2), то ваш способ это сделать. кажется ... странным, если не сказать больше.
Прокси может быть прокси уровня 4 (например, прокси TCP), где он создает два отдельных TCP-соединения (одно от клиента к прокси и одно от прокси к серверу назначения) и отправляет соединения этих пакетов TCP между ними. без реального осмотра или вмешательства в них, кроме заголовков TCP.
Альтернативным прокси-сервером может быть прокси-сервер уровня 7 (например, HTTP-прокси), где он создает два отдельных HTTP-соединения (одно от клиента к прокси-серверу и одно от прокси-сервера до конечного сервера) и отправляет между ними HTTP-сообщения, отображая Заголовки HTTP и детали между ними, иногда изменяющиеся детали или даже добавление дополнительных заголовков (например, X-FORWARDED-FOR).
Похоже, вы пытаетесь создать некий гибрид между этими двумя разными и несовместимыми способами работы! Вы надеетесь создать сервер HTTP или HTTP / 2, а затем открыть сокет TCP и передать эти TCP-сообщения между ними и надеетесь, что это сработает? Хотя это может работать над простым протоколом, таким как HTTP / 1, оно никогда не будет работать над HTTP / 2!
Для вашего первого примера экземпляр HTTP / 1 полностью отличается от HTTP / 2. Таким образом, чтобы установить эти два и ожидать, что они будут работать, с самого начала есть недостатки. Если один из ваших друзей говорил только по-немецки, а другой - только по-испански, и вы передавали все сообщения на немецком языке, дословно, нефильтрованные и все еще на немецком языке, для говорящего по-испански, то ожидаете ли вы, что говорящий по-испански сможет их волшебным образом понять? Конечно, нет! Таким образом, вы не можете соединить HTTP / 1 и HTTP / 2 на уровне сокетов - это совершенно разные протоколы. Вам нужен прокси-сервер, который будет действовать как переводчик между ними.
В вашем втором примере я еще больше запутался. Я полагаю, вы пытаетесь создать два HTTP / 2-сервера и подключить клиента к одному, а затем прокси-запросы к другому? И, возможно, вы добавили бы некоторую логику в какой-то момент, чтобы только определенные запросы выполнялись, иначе это было бы бессмысленно. Независимо от этого это почти наверняка не будет работать. HTTP / 2 является сложным протоколом, во многом похожим на TCP. Таким образом, каждому пакету должен быть присвоен уникальный идентификатор потока, и многие другие параметры должны быть согласованы между двумя конечными точками. Поэтому предположить, что одно сообщение HTTP / 2 будет беспрепятственно преобразовано в идентичное сообщение HTTP / 2 в другом соединении HTTP / 2, крайне наивно! Возвращаясь к аналогии с языком, копирование немецких сообщений дословно другому носителю немецкого языка, который, возможно, плохо слышит, но сидит ближе к вам, может сработать изначально, но как только один конец не успевает, говорит на несколько ином диалекте или просит вас Повторите что-то, что они пропустили, все шоу рушится.
Я бы посоветовал вам либо сделать этот прокси-сервер уровня 4 (поэтому игнорируйте HTTP и HTTP / 2 и просто использовать сокеты), либо вы хотите, чтобы это был прокси-сервер HTTP (в этом случае принимайте каждое сообщение HTTP, читайте его, и отправьте аналогичное сообщение HTTP по нисходящему соединению). Вы не можете иметь оба.
Я бы также спросил, почему и если вам нужно это сделать? HTTP / 2 не поддерживается повсеместно и получает большую часть своей выгоды между клиентом и пограничным сервером (в данном случае прокси), так почему вы чувствуете необходимость говорить по HTTP / 2 все время? См. Этот вопрос для более подробной информации: HTTP / 2 за обратным прокси
Надеюсь, это поможет и принесет извинения, если я полностью неправильно понял ваш вопрос или ваше намерение!