Потрясающий баг сегодня вылез, когда я проапгрейдил сервер с Debian buster на bullseye. Вместе с ним обновился nginx - и начал жаловаться на duplicated host header sent by client. Всякий раз, когда нода отправляет запросы себе. С запросами снаружи всё в порядке.
Перекопал всю конфигурацию nginx, триста раз перечитал код генерации запроса на ноде - никаких предположений. Сделал простейшую прогу на Java, отправляющую запрос через HttpClient
. Запускаю у себя - всё в порядке. Запускаю на сервере... ошибка. Тот же самый запрос через curl
на том же сервере - всё в порядке.
OpenJDK 11.0.7 у меня дома. OpenJDK 11.0.8 на сервере.
Терять уже нечего, поставил на сервере OpenJDK 17 и запустил тот же код... всё работает. Перезапустил под ней ноду - ошибка пропала.
Что это за кривая сборка OpenJDK, понять не могу. Надо бы пожаловаться куда-нибудь.
Тот самый код
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
class Scratch {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://lamed.moera.blog/moera/api/whoami"))
.header("Content-Type", "application/json")
.build();
HttpResponse<String> response;
response = buildClient().send(request, HttpResponse.BodyHandlers.ofString());
System.out.println("" + response.statusCode() + " " + response.body());
}
private static HttpClient buildClient() {
return HttpClient.newBuilder()
.followRedirects(HttpClient.Redirect.NORMAL)
.build();
}
}
Comments (2)
Если интересно, но нет желания закапываться сразу внутрь openjdk, имеет смысл посмотреть на эти два Host: глазами, вдруг они не тупо одинаковые и вдруг разница подскажет причину.
(Вариант 1 попробовать http вместо https, если воспроизводится -- остановить nginx и подсунуть вместо него свой netcat, вариант 2 если нужен https -- в nginx сделать stream, upstream'ом поставить опять же неткат)
По первому пункту: они точно одинаковые, это nginx пишет.