← Timeline
Avatar
Shmuel Leib Melamud

Потрясающий баг сегодня вылез, когда я проапгрейдил сервер с 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();
    }

}
😮👍4
To react or comment  View in Web Client
Comments (2)
Avatar placeholder

Если интересно, но нет желания закапываться сразу внутрь openjdk, имеет смысл посмотреть на эти два Host: глазами, вдруг они не тупо одинаковые и вдруг разница подскажет причину.

(Вариант 1 попробовать http вместо https, если воспроизводится -- остановить nginx и подсунуть вместо него свой netcat, вариант 2 если нужен https -- в nginx сделать stream, upstream'ом поставить опять же неткат)

Avatar
To react or comment  View in Web Client