hpx-emulation 2.4.8

Browser emulation profiles for hpx (TLS fingerprinting, HTTP/2 settings)
Documentation
macro_rules! headers_stream_dependency {
    (1) => {
        StreamDependency::new(StreamId::zero(), 21, false)
    };
    (2) => {
        StreamDependency::new(StreamId::from(13), 21, false)
    };
}

macro_rules! pseudo_order {
    () => {
        PseudoOrder::builder()
            .extend([
                PseudoId::Method,
                PseudoId::Path,
                PseudoId::Authority,
                PseudoId::Scheme,
            ])
            .build()
    };
}

macro_rules! settings_order {
    () => {
        SettingsOrder::builder()
            .extend([
                SettingId::HeaderTableSize,
                SettingId::EnablePush,
                SettingId::MaxConcurrentStreams,
                SettingId::InitialWindowSize,
                SettingId::MaxFrameSize,
                SettingId::MaxHeaderListSize,
                SettingId::EnableConnectProtocol,
                SettingId::NoRfc7540Priorities,
            ])
            .build()
    };
}

macro_rules! http2_options {
    (@base $builder:expr) => {
        $builder
            .initial_window_size(131072)
            .max_frame_size(16384)
            .initial_connection_window_size(12517377 + 65535)
            .headers_pseudo_order(pseudo_order!())
            .settings_order(settings_order!())
    };

    (1) => {
        http2_options!(@base Http2Options::builder())
            .initial_stream_id(3)
            .header_table_size(65536)
            .enable_push(false)
            .headers_stream_dependency(headers_stream_dependency!(1))
            .build()
    };
    (2) => {
        http2_options!(@base Http2Options::builder())
            .initial_stream_id(15)
            .header_table_size(65536)
            .headers_stream_dependency(headers_stream_dependency!(2))
            .priorities(
                Priorities::builder()
                    .extend([
                        Priority::new(
                            StreamId::from(3),
                            StreamDependency::new(StreamId::zero(), 200, false),
                        ),
                        Priority::new(
                            StreamId::from(5),
                            StreamDependency::new(StreamId::zero(), 100, false),
                        ),
                        Priority::new(
                            StreamId::from(7),
                            StreamDependency::new(StreamId::zero(), 0, false),
                        ),
                        Priority::new(
                            StreamId::from(9),
                            StreamDependency::new(StreamId::from(7), 0, false),
                        ),
                        Priority::new(
                            StreamId::from(11),
                            StreamDependency::new(StreamId::from(3), 0, false),
                        ),
                        Priority::new(
                            StreamId::from(13),
                            StreamDependency::new(StreamId::zero(), 240, false),
                        ),
                    ])
                    .build(),
            )
            .build()
    };
    (3) => {
        http2_options!(@base Http2Options::builder())
            .initial_stream_id(3)
            .header_table_size(65536)
            .enable_push(false)
            .max_concurrent_streams(0)
            .headers_stream_dependency(headers_stream_dependency!(1))
            .build()
    };
    (4) => {
        http2_options!(@base Http2Options::builder())
            .initial_stream_id(3)
            .header_table_size(4096)
            .enable_push(false)
            .initial_window_size(32768)
            .headers_stream_dependency(headers_stream_dependency!(1))
            .build()
    };
}