push sheeet
Some checks failed
Periodic Merges (6h) / master → staging-nixos (push) Failing after 12m50s
Periodic Merges (6h) / master → staging-next (push) Failing after 12m54s
Periodic Merges (24h) / merge-base(master,staging) → haskell-updates (push) Failing after 11m54s
Periodic Merges (6h) / staging-next → staging (push) Failing after 12m13s
Periodic Merges (24h) / staging-next-25.05 → staging-25.05 (push) Failing after 13m24s
Periodic Merges (24h) / release-25.05 → staging-next-25.05 (push) Failing after 14m28s

This commit is contained in:
Dark Steveneq
2025-10-09 14:15:47 +02:00
commit 646b892680
49168 changed files with 5897842 additions and 0 deletions

View File

@@ -0,0 +1,11 @@
--- ht-2.1.0.org/htapp.cc 2014-09-14 16:55:26.000000000 +0100
+++ ht-2.1.0/htapp.cc 2018-03-10 12:48:07.158533800 +0000
@@ -3023,7 +3023,7 @@
{
uint a = 2;
uint b = u/a;
- while (abs(a - b) > 1) {
+ while (abs((int)(a - b)) > 1) {
a = (a+b)/2;
b = u/a;
}

View File

@@ -0,0 +1,35 @@
{
stdenv,
lib,
fetchurl,
ncurses,
}:
stdenv.mkDerivation rec {
pname = "ht";
version = "2.1.0";
src = fetchurl {
url = "mirror://sourceforge/project/hte/ht-source/ht-${version}.tar.bz2";
sha256 = "0w2xnw3z9ws9qrdpb80q55h6ynhh3aziixcfn45x91bzrbifix9i";
};
buildInputs = [
ncurses
];
hardeningDisable = [ "format" ];
patches = [ ./gcc7.patch ];
env.NIX_CFLAGS_COMPILE = toString [ "-Wno-narrowing" ];
meta = with lib; {
description = "File editor/viewer/analyzer for executables";
homepage = "https://hte.sourceforge.net";
license = licenses.gpl2;
platforms = platforms.linux;
maintainers = [ ];
mainProgram = "ht";
};
}

View File

@@ -0,0 +1,307 @@
--- a/src/main.rs 2024-01-17 23:44:21.346253718 +0100
+++ b/src/main.rs 2024-01-17 23:48:54.536921610 +0100
@@ -15,7 +15,6 @@
use crate::utils::*;
use crate::vpn::*;
use std::fs;
-use std::path::Path;
use std::process::Command;
#[tokio::main]
@@ -44,16 +43,6 @@
eprintln!("Error creating folder: {}", err);
}
}
-
- // Create HTB config file if not existing
- let htb_config = format!("{}/.htb.conf", home);
-
- let file = Path::new(&htb_config);
- if !file.exists() {
- let lines = ["# HTB configuration file.\n\n", "# Enable/Disable shell prompt change\n", "prompt_change=true\n"];
- fs::write(&htb_config, lines.join(""))
- .expect("Failed to create HTB config file");
- }
// Initialize Xorg in WSL for secret-tool popup window
if is_wsl() && is_display_zero() {
@@ -104,13 +93,6 @@
let _ = play_machine(&args[2]).await;
}
}
- "-p" => {
- if args.len() < 3 || (args[2] != "true" && args[2] != "false") {
- println!("Usage: {} -p <true|false>", args[0]);
- } else {
- prompt_setting(&args[2]);
- }
- }
"-r" => {
reset_machine().await;
}
--- a/src/manage.rs 2024-01-17 22:50:22.450368210 +0100
+++ b/src/manage.rs 2024-01-17 23:49:21.143071918 +0100
@@ -77,19 +77,14 @@
if machine_info.ip.is_empty() { //Starting Point case because SP IP address is assigned only after spawn of the machine
machine_info.ip = active_machine.ip;
}
- let mut user_info = PlayingUser::get_playinguser(&appkey).await;
// SP Machines change IP address when reset, so need to ask to write /etc/hosts
if machine_info.sp_flag {
let _ = add_hosts(&machine_info);
}
-
- change_shell(&mut machine_info, &mut user_info);
}
pub async fn stop_machine() {
- let htb_path = format!("{}/.htb.conf", env::var("HOME").unwrap());
- let htbconfig = HTBConfig::get_current_config(&htb_path);
let appkey = get_appkey();
let active_machine = ActiveMachine::get_active(&appkey).await;
@@ -126,31 +121,9 @@
// Await the result of the blocking task
blocking_task.await.expect("Blocking task failed");
-
- if htbconfig.promptchange { //If the prompt is set to change during the playing, when you stop the machine, it should restore the original shell
- restore_shell();
- }
}
}
-pub fn prompt_setting(option: &str) {
- let home = env::var("HOME").unwrap_or_default();
- let htb_config = format!("{}/.htb.conf", home);
-
- let content = fs::read_to_string(&htb_config)
- .expect("Failed to read HTB config file");
-
- let re = Regex::new(r"prompt_change=\w+")
- .expect("Failed to create regular expression");
-
- let new_content = re.replace(&content, format!("prompt_change={}", option));
-
- fs::write(&htb_config, new_content.to_string())
- .expect("Failed to write updated content to HTB config file");
-
- println!("Prompt setting updated to: {}", option);
-}
-
pub async fn update_machines() -> io::Result<()> {
println!("Retrieving updated data from Hack The Box... Gimme some time hackerzzz...");
--- a/src/play.rs 2024-01-17 22:50:25.709380651 +0100
+++ b/src/play.rs 2024-01-17 23:39:08.715395211 +0100
@@ -4,7 +4,6 @@
use crate::types::*;
use crate::utils::*;
use crate::vpn::*;
-use std::env;
use std::io::{self,Write};
use reqwest::Client;
use serde::Serialize;
@@ -29,8 +28,6 @@
pub async fn play_machine(machine_name: &str) -> Result<(), Box<dyn std::error::Error>> {
let appkey = get_appkey();
let appkey_clone = appkey.clone(); // Clone the necessary data to avoid borrowed value error
- let htb_path = format!("{}/.htb.conf", env::var("HOME").unwrap());
- let htbconfig = HTBConfig::get_current_config(&htb_path);
let mut machine_info = PlayingMachine::get_machine(machine_name, &appkey).await;
@@ -103,7 +100,7 @@
machine_info.ip = get_ip(&appkey_clone).await; // For Starting Point machines and VIP and VIP+ VPNs, if I call the play API two times on the same machine, the old IP address associated to the machine can still live for some seconds providing a wrong IP related to the new same machine. For this reason, it is better to compute always the IP address (no problems for free VPNs because they associate always the same IP address to the same machine)
- let mut user_info = PlayingUser::get_playinguser(&appkey_clone).await; // Before this it is needed to run HTB VPN to take the Attacker IP address
+ let user_info = PlayingUser::get_playinguser(&appkey_clone).await; // Before this it is needed to run HTB VPN to take the Attacker IP address
let _ = print_banner();
@@ -115,10 +112,6 @@
println!("{}Hey! You have already found the Root Flag! Keep it up!{}", BGREEN, RESET);
}
- if htbconfig.promptchange { //If the prompt is set to change during the playing...
- change_shell(&mut machine_info, &mut user_info);
- }
-
// Writing /etc/hosts
let _ = add_hosts(&machine_info);
--- a/src/types.rs 2024-01-17 23:40:14.341769452 +0100
+++ b/src/types.rs 2024-01-17 23:43:14.159871196 +0100
@@ -2,7 +2,6 @@
use crate::colors::*;
use crate::utils::get_interface_ip;
use core::time::Duration;
-use std::fs;
use std::process;
use std::thread::sleep;
@@ -485,37 +484,4 @@
ip: userip,
}
}
-}
-
-pub struct HTBConfig {
- pub promptchange: bool,
-}
-
-impl HTBConfig {
-
- pub fn get_current_config(htb_config: &str) -> Self {
- HTBConfig {
- promptchange: Self::get_prompt_change(htb_config),
- }
- }
-
- fn get_prompt_change(htb_config: &str) -> bool {
- let prompt_change = fs::read_to_string(htb_config).expect("Failed to read htconfig.");
-
- let change_prompt = prompt_change.lines()
- .find(|line| line.starts_with("prompt_change="))
- .map(|line| line.split('=').nth(1).unwrap_or_default())
- .unwrap_or_default();
-
- // Convert the change_prompt string to a bool
-
- match change_prompt {
- "true" => true,
- "false" => false,
- _ => {
- // Handle other cases if needed, e.g., return a default value
- false
- }
- }
- }
}
\ No newline at end of file
--- a/src/utils.rs 2024-01-17 23:29:49.215407440 +0100
+++ b/src/utils.rs 2024-01-17 23:46:20.681009209 +0100
@@ -5,7 +5,6 @@
use crate::types::*;
use crate::vpn::*;
use pnet::datalink;
-use regex::Regex;
use reqwest::Client;
use std::fs;
use std::net::IpAddr;
@@ -13,96 +12,6 @@
use tokio::io::{AsyncWriteExt, BufWriter};
use tokio::sync::mpsc;
-pub fn change_shell(machine_info: &mut PlayingMachine, user_info: &mut PlayingUser) {
- let result = std::env::var("SHELL").unwrap_or_default();
- let mut file_bak = String::new();
- let mut file = String::new();
- let mut prompt = String::new();
- let mut prompt_field = "";
-
- if result.contains("bash") {
- file_bak = format!("{}/.bashrc.htb.bak", std::env::var("HOME").unwrap_or_default());
- file = format!("{}/.bashrc", std::env::var("HOME").unwrap_or_default());
- prompt = format!(
- "PS1=\"\\e[32m\\]┌──[Target:{}🚀🌐IP:{}🔥\\e[34m\\]Attacker:{}📡IP:{}\\e[32m\\]🏅Prize:{} points]\\n└──╼[👾]\\\\[\\e[36m\\]\\$(pwd) $ \\[\\e[0m\\]\"",
- machine_info.machine.name,
- machine_info.ip,
- user_info.user.name,
- get_interface_ip("tun0").expect("Error on getting tun0 IP address"),
- machine_info.machine.points
- );
- prompt_field = "PS1=.*";
- } else if result.contains("fish") {
- file_bak = format!("{}/.config/fish/functions/fish_prompt.fish.htb.bak", std::env::var("HOME").unwrap_or_default());
- file = format!("{}/.config/fish/functions/fish_prompt.fish", std::env::var("HOME").unwrap_or_default());
- prompt = format!(
- r#"function fish_prompt
- set_color 00ff00
- echo -n "┌──[Target:{}🚀🌐IP:{}"
- set_color ff00d7
- echo -n "🔥Attacker:{}📡IP:{}"
- set_color 00ff00
- echo "🏅Prize:{} points]"
- set_color 00ff00
- echo -n "└──╼[👾]"
- set_color 00ffff
- echo (pwd) '$' (set_color normal)
-end"#,
- machine_info.machine.name,
- machine_info.ip,
- user_info.user.name,
- get_interface_ip("tun0").expect("Error on getting tun0 IP address"),
- machine_info.machine.points
- );
- } else if result.contains("zsh") {
- file_bak = format!("{}/.zshrc.htb.bak", std::env::var("HOME").unwrap_or_default());
- file = format!("{}/.zshrc", std::env::var("HOME").unwrap_or_default());
- prompt = format!(
- "PROMPT=\"%F{{46}}┌──[Target:{}🚀🌐IP:{}🔥%F{{201}}Attacker:{}📡IP:{}%F{{46}}🏅Prize:{} points]\"$'\\n'\"└──╼[👾]%F{{44}}%~ $%f \"" ,
- machine_info.machine.name,
- machine_info.ip,
- user_info.user.name,
- get_interface_ip("tun0").expect("Error on getting tun0 IP address"),
- machine_info.machine.points
- );
- prompt_field = "PROMPT=.*";
- }
-
- if !std::path::Path::new(&file_bak).exists() {
- std::fs::copy(&file, &file_bak).unwrap_or_default();
- }
-
- if result.contains("bash") || result.contains("zsh") {
- let file_content = std::fs::read_to_string(&file).unwrap_or_default();
- let regex = Regex::new(prompt_field).unwrap();
- let new_file_content = regex.replace_all(&file_content, prompt);
- std::fs::write(&file, new_file_content.as_ref()).unwrap_or_default();
- } else if result.contains("fish") {
- std::fs::write(&file, &prompt).unwrap_or_default();
- }
-}
-
-pub fn restore_shell() {
- let result = env::var("SHELL").unwrap_or_default();
- let mut file_bak = String::new();
- let mut file = String::new();
-
- if result.contains("bash") {
- file_bak = format!("{}/.bashrc.htb.bak", env::var("HOME").unwrap());
- file = format!("{}/.bashrc", env::var("HOME").unwrap());
- } else if result.contains("fish") {
- file_bak = format!("{}/.config/fish/functions/fish_prompt.fish.htb.bak", env::var("HOME").unwrap());
- file = format!("{}/.config/fish/functions/fish_prompt.fish", env::var("HOME").unwrap());
- } else if result.contains("zsh") {
- file_bak = format!("{}/.zshrc.htb.bak", env::var("HOME").unwrap());
- file = format!("{}/.zshrc", env::var("HOME").unwrap());
- }
- if fs::metadata(&file).is_ok() && std::path::Path::new(&file_bak).exists() {
- //Restore the prompt file from the backup
- fs::copy(&file_bak, &file).expect("Failed to copy file");
- }
-}
-
pub fn display_target_info(machine_info: &PlayingMachine, user_info: &PlayingUser) {
println!();
println!("{}Our secret agent gathered some information about the target:{}", BYELLOW, RESET);
@@ -184,7 +93,7 @@
println!("Play Hack The Box machines directly on your system.");
println!();
std::thread::sleep(std::time::Duration::from_secs(2)); //Showing the description for some secs before showing the help message
- println!("{} [-h] [-a] [-f] [-k] <set|reset|delete> [-m] <machine-name> [-l] <free|retired|starting> [-p] <true|false> [-r] [-s] [-u] [-v] <vpn-name>", env::args().next().unwrap());
+ println!("{} [-h] [-a] [-f] [-k] <set|reset|delete> [-m] <machine-name> [-l] <free|retired|starting> [-r] [-s] [-u] [-v] <vpn-name>", env::args().next().unwrap());
println!();
println!("Options:");
println!("-a Print information about the current active machine.");
@@ -193,7 +102,6 @@
println!("-k <set|reset|delete> Set, reset or delete the Hack The Box App Key.");
println!("-m <machine-name> Specify the machine name to play.");
println!("-l <free|retired|starting> List free, retired or starting point machines.");
- println!("-p <true|false> Set if the shell prompt should be changed.");
println!("-r Reset the playing machine.");
println!("-s Stop the playing machine.");
println!("-u Update free machines in the Red Team menu.");

View File

@@ -0,0 +1,67 @@
{
lib,
rustPlatform,
fetchFromGitHub,
pkg-config,
openssl,
stdenv,
coreutils,
gnome-keyring,
libsecret,
openvpn,
gzip,
killall,
}:
rustPlatform.buildRustPackage {
pname = "htb-toolkit";
version = "0-unstable-2025-03-15";
src = fetchFromGitHub {
owner = "D3vil0p3r";
repo = "htb-toolkit";
# https://github.com/D3vil0p3r/htb-toolkit/issues/3
rev = "dd193c2974cd5fd1bbc6f7f616ebd597e28539ec";
hash = "sha256-NTZv0BPyIB32CNXbINYTy4n8tNVJ3pRLr1QDhI/tg2Y=";
};
cargoHash = "sha256-ReEe8pyW66GXIPwAy6IKsFEAUjxHmzw5mj21i/h4quQ=";
# Patch to disable prompt change of the shell when a target machine is run. Needed due to Nix declarative nature
patches = [
./disable-shell-prompt-change.patch
];
nativeBuildInputs = [
pkg-config
];
buildInputs = [
openssl
]
++ lib.optionals stdenv.hostPlatform.isLinux [
gnome-keyring
];
postPatch = ''
substituteInPlace src/manage.rs \
--replace-fail /usr/share/icons/htb-toolkit/ $out/share/icons/htb-toolkit/
substituteInPlace src/utils.rs \
--replace-fail "\"base64\"" "\"${coreutils}/bin/base64\"" \
--replace-fail "\"gunzip\"" "\"${gzip}/bin/gunzip\""
substituteInPlace src/appkey.rs \
--replace-fail secret-tool ${lib.getExe libsecret}
substituteInPlace src/vpn.rs \
--replace-fail "arg(\"openvpn\")" "arg(\"${openvpn}/bin/openvpn\")" \
--replace-fail "arg(\"killall\")" "arg(\"${killall}/bin/killall\")"
'';
meta = with lib; {
description = "Play Hack The Box directly on your system";
mainProgram = "htb-toolkit";
homepage = "https://github.com/D3vil0p3r/htb-toolkit";
maintainers = with maintainers; [ d3vil0p3r ];
platforms = platforms.unix;
license = licenses.gpl3Plus;
};
}

View File

@@ -0,0 +1,69 @@
{
lib,
stdenv,
fetchFromGitHub,
cmake,
libuuid,
expat,
curl,
pcre2,
sqlite,
python3,
boost,
libxml2,
libvirt,
munge,
voms,
perl,
scitokens-cpp,
openssl,
}:
stdenv.mkDerivation rec {
pname = "htcondor";
version = "24.2.2";
src = fetchFromGitHub {
owner = "htcondor";
repo = "htcondor";
rev = "v${version}";
hash = "sha256-F8uI8Stvao7VKULTcOjv/nFUhFHxqd00gRNe6tkKgPE=";
};
nativeBuildInputs = [ cmake ];
buildInputs = [
libuuid
expat
openssl
curl
pcre2
sqlite
python3
boost
libxml2
libvirt
munge
voms
perl
scitokens-cpp
];
env.CXXFLAGS = "-fpermissive";
cmakeFlags = [
"-DSYSTEM_NAME=NixOS"
"-DWITH_PYTHON_BINDINGS=false"
];
meta = with lib; {
homepage = "https://htcondor.org/";
description = "Software system that creates a High-Throughput Computing (HTC) environment";
platforms = platforms.linux;
license = licenses.asl20;
maintainers = with maintainers; [ evey ];
# On Aarch64: ld: cannot find -lpthread: No such file or directory
# On x86_64: ld: cannot find -ldl: No such file or directory
broken = true;
};
}

View File

@@ -0,0 +1,72 @@
{
stdenv,
lib,
fetchurl,
cairo,
pango,
libpng,
expat,
fontconfig,
gtk2,
xorg,
autoPatchelfHook,
}:
stdenv.mkDerivation (finalAttrs: {
pname = "hterm";
version = "0.8.9";
src =
let
versionWithoutDots = builtins.replaceStrings [ "." ] [ "" ] finalAttrs.version;
in
if stdenv.targetPlatform.is64bit then
fetchurl {
url = "https://www.der-hammer.info/terminal/hterm${versionWithoutDots}-linux-64.tgz";
hash = "sha256-DY+X7FaU1UBbNf/Kgy4TzBZiocQ4/TpJW3KLW1iu0M0=";
}
else
fetchurl {
url = "https://www.der-hammer.info/terminal/hterm${versionWithoutDots}-linux-32.tgz";
hash = "sha256-7wJFCpeXNMX94tk0QVc0T22cbv3ODIswFge5Cs0JhI8=";
};
sourceRoot = ".";
nativeBuildInputs = [ autoPatchelfHook ];
buildInputs = [
cairo
pango
libpng
expat
fontconfig.lib
gtk2
xorg.libSM
];
installPhase = ''
runHook preInstall
install -m755 -D hterm $out/bin/hterm
install -m644 -D desktop/hterm.png $out/share/pixmaps/hterm.png
install -m644 -D desktop/hterm.desktop $out/share/applications/hterm.desktop
runHook postInstall
'';
passthru = {
updateScript = ./update.sh;
};
meta = {
homepage = "https://www.der-hammer.info/pages/terminal.html";
changelog = "https://www.der-hammer.info/terminal/CHANGELOG.txt";
description = "Terminal program for serial communication";
# See https://www.der-hammer.info/terminal/LICENSE.txt
license = lib.licenses.unfree;
sourceProvenance = with lib.sourceTypes; [ binaryNativeCode ];
platforms = [
"x86_64-linux"
"i686-linux"
];
maintainers = with lib.maintainers; [ zebreus ];
mainProgram = "hterm";
};
})

18
pkgs/by-name/ht/hterm/update.sh Executable file
View File

@@ -0,0 +1,18 @@
#!/usr/bin/env nix-shell
#!nix-shell -i bash -p common-updater-scripts curl
# shellcheck shell=bash
set -eu -o pipefail
# The first valid version in the changelog should always be the latest version.
version="$(curl https://www.der-hammer.info/terminal/CHANGELOG.txt | grep -m1 -Po '[0-9]+\.[0-9]+\.[0-9]+')"
function update_hash_for_system() {
local system="$1"
# Reset the version number so the second architecture update doesn't get ignored.
update-source-version hterm 0 "sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" --system="$system"
update-source-version hterm "$version" --system="$system"
}
update_hash_for_system x86_64-linux
update_hash_for_system i686-linux

View File

@@ -0,0 +1,42 @@
{
lib,
fetchFromGitHub,
python3,
makeWrapper,
}:
python3.pkgs.buildPythonApplication rec {
pname = "htgettoken";
version = "2.4";
format = "setuptools";
src = fetchFromGitHub {
owner = "fermitools";
repo = "htgettoken";
tag = "v${version}";
hash = "sha256-3xBACXxH5G1MO2dNFFSL1Rssc8RdauvLZ4Tx2djOgyw=";
};
nativeBuildInputs = with python3.pkgs; [
setuptools
makeWrapper
];
postInstall = with python3.pkgs; ''
wrapProgram $out/bin/htgettoken \
--set PYTHONPATH "${
makePythonPath [
gssapi
paramiko
urllib3
]
}"
'';
meta = with lib; {
description = "Gets OIDC authentication tokens for High Throughput Computing via a Hashicorp vault server ";
license = licenses.bsd3;
homepage = "https://github.com/fermitools/htgettoken";
maintainers = with maintainers; [ veprbl ];
};
}

View File

@@ -0,0 +1,35 @@
{
lib,
buildNpmPackage,
fetchFromGitHub,
}:
buildNpmPackage rec {
pname = "html-minifier";
version = "4.0.0";
src = fetchFromGitHub {
owner = "kangax";
repo = "html-minifier";
rev = "v${version}";
hash = "sha256-OAykAqBxgr7tbeXXfSH23DALf7Eoh3VjDKNKWGAL3+A=";
};
npmDepsHash = "sha256-VWXc/nBXgvSE/DoLHR4XTFQ5kuwWC1m0/cj1CndfPH8=";
npmFlags = [ "--ignore-scripts" ];
postInstall = ''
find $out/lib/node_modules -xtype l -delete
'';
dontNpmBuild = true;
meta = {
description = "Highly configurable, well-tested, JavaScript-based HTML minifier";
homepage = "https://github.com/kangax/html-minifier";
license = lib.licenses.mit;
mainProgram = "html-minifier";
maintainers = with lib.maintainers; [ chris-martin ];
};
}

View File

@@ -0,0 +1,60 @@
{
lib,
stdenv,
fetchFromGitHub,
fetchpatch,
cmake,
libxslt,
html-tidy,
}:
stdenv.mkDerivation rec {
pname = "html-tidy";
version = "5.8.0";
src = fetchFromGitHub {
owner = "htacg";
repo = "tidy-html5";
rev = version;
hash = "sha256-vzVWQodwzi3GvC9IcSQniYBsbkJV20iZanF33A0Gpe0=";
};
# https://github.com/htacg/tidy-html5/pull/1036
patches = (
fetchpatch {
url = "https://github.com/htacg/tidy-html5/commit/e9aa038bd06bd8197a0dc049380bc2945ff55b29.diff";
sha256 = "sha256-Q2GjinNBWLL+HXUtslzDJ7CJSTflckbjweiSMCnIVwg=";
}
);
# https://github.com/htacg/tidy-html5/issues/1139
postPatch = ''
substituteInPlace CMakeLists.txt \
--replace-fail 'cmake_minimum_required (VERSION 2.8.12)' 'cmake_minimum_required(VERSION 3.5)'
'';
nativeBuildInputs = [
cmake
libxslt # manpage
]
++ lib.optional (stdenv.hostPlatform != stdenv.buildPlatform) html-tidy;
cmakeFlags = lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [
"-DHOST_TIDY=tidy"
];
# ATM bin/tidy is statically linked, as upstream provides no other option yet.
# https://github.com/htacg/tidy-html5/issues/326#issuecomment-160322107
meta = with lib; {
description = "HTML validator and `tidier'";
longDescription = ''
HTML Tidy is a command-line tool and C library that can be
used to validate and fix HTML data.
'';
license = licenses.libpng; # very close to it - the 3 clauses are identical
homepage = "http://html-tidy.org";
platforms = platforms.all;
maintainers = with maintainers; [ edwtjo ];
mainProgram = "tidy";
};
}

View File

@@ -0,0 +1,29 @@
{
lib,
stdenv,
fetchurl,
curl,
libiconv,
}:
stdenv.mkDerivation rec {
pname = "html-xml-utils";
version = "8.7";
src = fetchurl {
url = "https://www.w3.org/Tools/HTML-XML-utils/${pname}-${version}.tar.gz";
sha256 = "sha256-iIoxYxp6cDCLsvMz4HfQQW9Lt4MX+Gl/+0qVGH9ncwE=";
};
buildInputs = [
curl
libiconv
];
meta = with lib; {
description = "Utilities for manipulating HTML and XML files";
homepage = "https://www.w3.org/Tools/HTML-XML-utils/";
license = licenses.w3c;
platforms = platforms.all;
};
}

View File

@@ -0,0 +1,59 @@
{
lib,
stdenv,
fetchFromGitHub,
rustPlatform,
makeWrapper,
chromium,
withChromium ? (lib.meta.availableOn stdenv.hostPlatform chromium),
nix-update-script,
}:
rustPlatform.buildRustPackage (finalAttrs: {
pname = "html2pdf";
version = "0.8.2";
src = fetchFromGitHub {
owner = "ilaborie";
repo = "html2pdf";
tag = "v${finalAttrs.version}";
hash = "sha256-Z1fb7pDjawMIhJgl4ao2VoV6zpfcGy/48Dt7JtIxgJo=";
};
cargoHash = "sha256-T5A2b7Qcg8dQKndaD8P5RAutBZeINOqIBUHR2VDOeo0=";
# Avoiding "rustfmt not found" error in auto_generate_cdp.
# ref: https://github.com/mdrokz/auto_generate_cdp/pull/8
env.DO_NOT_FORMAT = "true";
nativeBuildInputs = [
makeWrapper
];
postInstall = lib.optionalString withChromium (
let
runtimeInputs = [
chromium
];
in
''
wrapProgram "$out/bin/html2pdf" --prefix PATH : '${lib.makeBinPath runtimeInputs}'
''
);
passthru.updateScript = nix-update-script { };
meta = {
description = "CLI tool to convert local HTML files to PDF";
homepage = "https://github.com/ilaborie/html2pdf";
changelog = "https://github.com/ilaborie/html2pdf/blob/v${finalAttrs.version}/CHANGELOG.md";
license = with lib.licenses; [
mit
asl20
];
maintainers = with lib.maintainers; [
kachick
];
mainProgram = "html2pdf";
};
})

View File

@@ -0,0 +1,29 @@
diff --git a/Makefile.am b/Makefile.am
index af28077..e746147 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -13,6 +13,8 @@
AUTOMAKE_OPTIONS = foreign
ACLOCAL_AMFLAGS = -I m4
+SUBDIRS =
+
AM_YFLAGS = -d -Wno-yacc
bin_PROGRAMS = html2text
diff --git a/configure.ac b/configure.ac
index 999c6fe..30c2536 100644
--- a/configure.ac
+++ b/configure.ac
@@ -15,8 +15,11 @@
AC_PREREQ([2.71])
AC_INIT([html2text], [2.3.0], [BUG-REPORT-ADDRESS])
+AC_CONFIG_MACRO_DIRS([m4])
AM_INIT_AUTOMAKE
AM_MAINTAINER_MODE([disable])
+AM_GNU_GETTEXT_VERSION([0.20])
+AM_GNU_GETTEXT([external])
AM_ICONV
#AC_CONFIG_SRCDIR([html.h])
#AC_CONFIG_HEADERS([config.h])

View File

@@ -0,0 +1,45 @@
{
lib,
stdenv,
fetchFromGitLab,
autoconf-archive,
autoreconfHook,
bison,
gettext,
libiconv,
}:
stdenv.mkDerivation rec {
pname = "html2text";
version = "2.3.0";
src = fetchFromGitLab {
owner = "grobian";
repo = "html2text";
rev = "v${version}";
hash = "sha256-e/KWyc7lOdWhtFC7ZAD7sYgCsO3JzGkLUThVI7edqIQ=";
};
nativeBuildInputs = [
autoconf-archive
autoreconfHook
bison
gettext
];
# These changes have all been made in HEAD, across several commits
# amongst other changes.
# See https://gitlab.com/grobian/html2text/-/merge_requests/57
patches = [ ./gettext-0.25.patch ];
buildInputs = lib.optional stdenv.hostPlatform.isDarwin libiconv;
meta = {
description = "Convert HTML to plain text";
mainProgram = "html2text";
homepage = "https://gitlab.com/grobian/html2text";
license = lib.licenses.gpl2Plus;
platforms = lib.platforms.unix;
maintainers = [ lib.maintainers.eikek ];
};
}

View File

@@ -0,0 +1,44 @@
{
lib,
fetchFromGitHub,
openjdk,
python3,
}:
python3.pkgs.buildPythonApplication rec {
pname = "html5validator";
version = "0.4.2";
format = "setuptools";
src = fetchFromGitHub {
owner = "svenkreiss";
repo = "html5validator";
tag = "v${version}";
hash = "sha256-yvclqE4+2R9q/UJU9W95U1/xVJeNj+5eKvT6VQel9k8=";
};
propagatedBuildInputs = [
openjdk
]
++ (with python3.pkgs; [
pyyaml
]);
nativeCheckInputs = with python3.pkgs; [
hacking
pytestCheckHook
];
preCheck = ''
export PATH="$PATH:$out/bin";
'';
meta = {
description = "Command line tool that tests files for HTML5 validity";
mainProgram = "html5validator";
homepage = "https://github.com/svenkreiss/html5validator";
changelog = "https://github.com/svenkreiss/html5validator/releases/tag/v${version}";
license = lib.licenses.mit;
maintainers = with lib.maintainers; [ phunehehe ];
};
}

View File

@@ -0,0 +1,24 @@
diff --color -Naur a/html/CharsetConverter.cc b/html/CharsetConverter.cc
--- a/html/CharsetConverter.cc 2018-12-29 03:13:56.000000000 +0000
+++ b/html/CharsetConverter.cc 2021-05-31 23:03:10.705334580 +0100
@@ -7,7 +7,7 @@
using namespace std;
using namespace htmlcxx;
-CharsetConverter::CharsetConverter(const string &from, const string &to) throw (Exception)
+CharsetConverter::CharsetConverter(const string &from, const string &to)
{
mIconvDescriptor = iconv_open(to.c_str(), from.c_str());
if (mIconvDescriptor == (iconv_t)(-1))
diff --color -Naur a/html/CharsetConverter.h b/html/CharsetConverter.h
--- a/html/CharsetConverter.h 2018-12-29 03:13:56.000000000 +0000
+++ b/html/CharsetConverter.h 2021-05-31 23:03:19.042574598 +0100
@@ -17,7 +17,7 @@
: std::runtime_error(arg) {}
};
- CharsetConverter(const std::string &from, const std::string &to) throw (Exception);
+ CharsetConverter(const std::string &from, const std::string &to);
~CharsetConverter();
std::string convert(const std::string &input);

View File

@@ -0,0 +1,32 @@
{
lib,
stdenv,
fetchurl,
autoreconfHook,
libiconv,
}:
stdenv.mkDerivation rec {
pname = "htmlcxx";
version = "0.87";
src = fetchurl {
url = "mirror://sourceforge/htmlcxx/v${version}/${pname}-${version}.tar.gz";
sha256 = "sha256-XTj5OM9N+aKYpTRq8nGV//q/759GD8KgIjPLz6j8dcg=";
};
nativeBuildInputs = [ autoreconfHook ];
buildInputs = [ libiconv ];
patches = [
./ptrdiff.patch
./c++17.patch
];
meta = with lib; {
homepage = "https://htmlcxx.sourceforge.net/";
description = "Simple non-validating css1 and html parser for C++";
mainProgram = "htmlcxx";
license = licenses.lgpl2;
platforms = platforms.all;
};
}

View File

@@ -0,0 +1,13 @@
diff -rc htmlcxx-orig-0.85/html/tree.h htmlcxx-0.85/html/tree.h
*** htmlcxx-orig-0.85/html/tree.h 2015-09-02 13:57:17.988688798 +0200
--- htmlcxx-0.85/html/tree.h 2015-09-02 13:57:52.737768811 +0200
***************
*** 45,50 ****
--- 45,51 ----
#ifndef tree_hh_
#define tree_hh_
+ #include <cstddef>
#include <cassert>
#include <memory>
#include <stdexcept>

View File

@@ -0,0 +1,58 @@
{
lib,
stdenv,
testers,
fetchFromGitHub,
zlib,
cups,
libpng,
libjpeg,
pkg-config,
htmldoc,
}:
stdenv.mkDerivation rec {
pname = "htmldoc";
version = "1.9.21";
src = fetchFromGitHub {
owner = "michaelrsweet";
repo = "htmldoc";
rev = "v${version}";
hash = "sha256-MZKXEwJdQzn49JIUm4clqKBTtjKu6tBU5Sdq6ESn1k4=";
};
nativeBuildInputs = [ pkg-config ];
buildInputs = [
zlib
cups
libpng
libjpeg
];
# do not generate universal binary on Darwin
# because it is not supported by Nix's clang
postPatch = ''
substituteInPlace configure --replace-fail "-arch x86_64 -arch arm64" ""
'';
passthru.tests = testers.testVersion {
package = htmldoc;
command = "htmldoc --version";
};
meta = {
description = "Converts HTML files to PostScript and PDF";
homepage = "https://michaelrsweet.github.io/htmldoc";
changelog = "https://github.com/michaelrsweet/htmldoc/releases/tag/v${version}";
license = lib.licenses.gpl2Only;
maintainers = [ ];
platforms = lib.platforms.unix;
longDescription = ''
HTMLDOC is a program that reads HTML source files or web pages and
generates corresponding HTML, PostScript, or PDF files with an optional
table of contents.
'';
mainProgram = "htmldoc";
};
}

View File

@@ -0,0 +1,28 @@
{
lib,
buildNpmPackage,
fetchFromGitHub,
}:
buildNpmPackage rec {
pname = "htmlhint";
version = "1.7.1";
src = fetchFromGitHub {
owner = "htmlhint";
repo = "HTMLHint";
rev = "v${version}";
hash = "sha256-jhn3FWzqwqczB7siHRxpYNLPoC9YhZtkcVyvWdIq93k=";
};
npmDepsHash = "sha256-acf6pyv3TsOA3Ulm/OMYZ2R7sMGEcsOXA9hbPXLbX3I=";
meta = {
changelog = "https://github.com/htmlhint/HTMLHint/blob/${src.rev}/CHANGELOG.md";
description = "Static code analysis tool for HTML";
homepage = "https://github.com/htmlhint/HTMLHint";
license = lib.licenses.mit;
mainProgram = "htmlhint";
maintainers = [ ];
};
}

View File

@@ -0,0 +1,32 @@
{
lib,
fetchFromGitHub,
rustPlatform,
}:
rustPlatform.buildRustPackage rec {
pname = "htmlq";
version = "0.4.0";
src = fetchFromGitHub {
owner = "mgdm";
repo = "htmlq";
rev = "v${version}";
sha256 = "sha256-kZtK2QuefzfxxuE1NjXphR7otr+RYfMif/RSpR6TxY0=";
};
cargoHash = "sha256-QUlR6PuOLbeAHzARtTo7Zn7fmjs2ET6TdXT4VgCYEVg=";
doCheck = false;
meta = with lib; {
description = "Like jq, but for HTML";
homepage = "https://github.com/mgdm/htmlq";
license = licenses.mit;
maintainers = with maintainers; [
siraben
nerdypepper
];
mainProgram = "htmlq";
};
}

View File

@@ -0,0 +1,40 @@
{
buildGoModule,
fetchFromGitHub,
lib,
}:
buildGoModule rec {
pname = "htmltest";
version = "0.17.0";
src = fetchFromGitHub {
owner = "wjdp";
repo = "htmltest";
rev = "v${version}";
sha256 = "sha256-8tkk476kGEfHo3XGu3/0r6fhX1c4vkYiUACpw0uEu2g=";
};
vendorHash = "sha256-dTn5aYb5IHFbksmhkXSTJtI0Gnn8Uz0PMZPFzFKMo38=";
ldflags = [
"-w"
"-s"
"-X main.version=${version}"
];
# tests require network access
doCheck = false;
meta = with lib; {
description = "Tool to test generated HTML output";
mainProgram = "htmltest";
longDescription = ''
htmltest runs your HTML output through a series of checks to ensure all your
links, images, scripts references work, your alt tags are filled in, etc.
'';
homepage = "https://github.com/wjdp/htmltest";
license = with licenses; [ mit ];
maintainers = with maintainers; [ fab ];
};
}

View File

@@ -0,0 +1,31 @@
{
lib,
stdenv,
fetchurl,
}:
stdenv.mkDerivation rec {
pname = "htmlunit-driver-standalone";
version = "2.27";
src = fetchurl {
url = "https://github.com/SeleniumHQ/htmlunit-driver/releases/download/${version}/htmlunit-driver-${version}-with-dependencies.jar";
sha256 = "1sd3cwpamcbq9pv0mvcm8x6minqrlb4i0r12q3jg91girqswm2dp";
};
dontUnpack = true;
installPhase = "install -D $src $out/share/lib/${pname}-${version}/${pname}-${version}.jar";
meta = with lib; {
homepage = "https://github.com/SeleniumHQ/htmlunit-driver";
description = "WebDriver server for running Selenium tests on the HtmlUnit headless browser";
maintainers = with maintainers; [
coconnor
offline
];
platforms = platforms.all;
sourceProvenance = with sourceTypes; [ binaryBytecode ];
license = licenses.asl20;
};
}

View File

@@ -0,0 +1,30 @@
{
lib,
rustPlatform,
fetchFromGitHub,
unstableGitUpdater,
}:
rustPlatform.buildRustPackage {
pname = "htmx-lsp";
version = "0.1.0-unstable-2025-06-14";
src = fetchFromGitHub {
owner = "ThePrimeagen";
repo = "htmx-lsp";
rev = "c45f55b2bf8be2d92489fd6d69a3db07fe5f214b";
hash = "sha256-7CAlYYwsanlOCGeY7gYE5Fzk5IEO4hThgINiJmXql7s=";
};
cargoHash = "sha256-/ypaTrctJo88DHtF/hv6B0dqB06axd/qKFnuI8zs8KA=";
passthru.updateScript = unstableGitUpdater { };
meta = with lib; {
description = "Language server implementation for htmx";
homepage = "https://github.com/ThePrimeagen/htmx-lsp";
license = licenses.mit;
maintainers = with maintainers; [ vinnymeller ];
mainProgram = "htmx-lsp";
};
}

View File

@@ -0,0 +1,26 @@
{
lib,
rustPlatform,
fetchFromGitHub,
}:
rustPlatform.buildRustPackage rec {
pname = "htmx-lsp2";
version = "0.1.4";
src = fetchFromGitHub {
owner = "uros-5";
repo = "htmx-lsp2";
tag = "v${version}";
hash = "sha256-Okd4jPCZvVDWIXj7aRLRnrUOT0mD3rBr6VDEgoWXRZE=";
};
cargoHash = "sha256-NDse9cgwnPDziVgPz7KBwoZcttypSB98EGoK4zN4tG4=";
meta = {
description = "Language server implementation for HTMX, a successor to htmx-lsp";
homepage = "https://github.com/uros-5/htmx-lsp2";
license = lib.licenses.mit;
maintainers = with lib.maintainers; [ adamjhf ];
mainProgram = "htmx-lsp2";
};
}

View File

@@ -0,0 +1,91 @@
{
lib,
fetchFromGitHub,
fetchpatch2,
stdenv,
autoreconfHook,
pkg-config,
ncurses,
libcap,
libnl,
sensorsSupport ? stdenv.hostPlatform.isLinux,
lm_sensors,
systemdSupport ? lib.meta.availableOn stdenv.hostPlatform systemd,
systemd,
}:
assert systemdSupport -> stdenv.hostPlatform.isLinux;
stdenv.mkDerivation rec {
pname = "htop-vim";
version = "3.4.0";
src = fetchFromGitHub {
owner = "htop-dev";
repo = "htop-vim";
rev = version;
hash = "sha256-4M2Kzy/tTpIZzpyubnXWywQh7Np5InT4sYkVG2v6wWs";
};
patches = [
(fetchpatch2 {
name = "vim-keybindings.patch";
url = "https://aur.archlinux.org/cgit/aur.git/plain/vim-keybindings.patch?h=htop-vim&id=d10f022b3ca1207200187a55f5b116a5bd8224f7";
hash = "sha256-fZDTA2dCOmXxUYD6Wm41q7TxL7fgQOj8a/8yJC7Zags=";
})
];
# upstream removed pkg-config support and uses dlopen now
postPatch =
let
libnlPath = lib.getLib libnl;
in
lib.optionalString stdenv.hostPlatform.isLinux ''
substituteInPlace configure.ac \
--replace-fail /usr/include/libnl3 ${lib.getDev libnl}/include/libnl3
substituteInPlace linux/LibNl.c \
--replace-fail libnl-3.so ${libnlPath}/lib/libnl-3.so \
--replace-fail libnl-genl-3.so ${libnlPath}/lib/libnl-genl-3.so
'';
nativeBuildInputs = [ autoreconfHook ] ++ lib.optional stdenv.hostPlatform.isLinux pkg-config;
buildInputs = [
ncurses
]
++ lib.optionals stdenv.hostPlatform.isLinux [
libcap
libnl
]
++ lib.optional sensorsSupport lm_sensors
++ lib.optional systemdSupport systemd;
configureFlags = [
"--enable-unicode"
"--sysconfdir=/etc"
]
++ lib.optionals stdenv.hostPlatform.isLinux [
"--enable-affinity"
"--enable-capabilities"
"--enable-delayacct"
]
++ lib.optional sensorsSupport "--enable-sensors";
postFixup =
let
optionalPatch = pred: so: lib.optionalString pred "patchelf --add-needed ${so} $out/bin/htop";
in
lib.optionalString (!stdenv.hostPlatform.isStatic) ''
${optionalPatch sensorsSupport "${lib.getLib lm_sensors}/lib/libsensors.so"}
${optionalPatch systemdSupport "${systemd}/lib/libsystemd.so"}
'';
meta = with lib; {
description = "Interactive process viewer, with vim-style keybindings";
homepage = "https://aur.archlinux.org/packages/htop-vim";
license = licenses.gpl2Only;
platforms = platforms.all;
maintainers = with maintainers; [ thiagokokada ];
mainProgram = "htop";
};
}

View File

@@ -0,0 +1,87 @@
{
lib,
fetchFromGitHub,
stdenv,
autoreconfHook,
pkg-config,
ncurses,
libcap,
libnl,
sensorsSupport ? stdenv.hostPlatform.isLinux,
lm_sensors,
systemdSupport ? lib.meta.availableOn stdenv.hostPlatform systemd,
systemd,
}:
assert systemdSupport -> stdenv.hostPlatform.isLinux;
stdenv.mkDerivation rec {
pname = "htop";
version = "3.4.1";
src = fetchFromGitHub {
owner = "htop-dev";
repo = "htop";
rev = version;
hash = "sha256-fVqQwXbJus2IVE1Bzf3yJJpKK4qcZN/SCTX1XYkiHhU=";
};
# upstream removed pkg-config support and uses dlopen now
postPatch =
let
libnlPath = lib.getLib libnl;
in
lib.optionalString stdenv.hostPlatform.isLinux ''
substituteInPlace configure.ac \
--replace-fail /usr/include/libnl3 ${lib.getDev libnl}/include/libnl3
substituteInPlace linux/LibNl.c \
--replace-fail libnl-3.so ${libnlPath}/lib/libnl-3.so \
--replace-fail libnl-genl-3.so ${libnlPath}/lib/libnl-genl-3.so
'';
nativeBuildInputs = [ autoreconfHook ] ++ lib.optional stdenv.hostPlatform.isLinux pkg-config;
buildInputs = [
ncurses
]
++ lib.optionals stdenv.hostPlatform.isLinux [
libcap
libnl
]
++ lib.optional sensorsSupport lm_sensors
++ lib.optional systemdSupport systemd;
configureFlags = [
"--enable-unicode"
"--sysconfdir=/etc"
]
++ lib.optionals stdenv.hostPlatform.isLinux [
"--enable-affinity"
"--enable-capabilities"
"--enable-delayacct"
]
++ lib.optional sensorsSupport "--enable-sensors";
postFixup =
let
optionalPatch = pred: so: lib.optionalString pred "patchelf --add-needed ${so} $out/bin/htop";
in
lib.optionalString (!stdenv.hostPlatform.isStatic) ''
${optionalPatch sensorsSupport "${lib.getLib lm_sensors}/lib/libsensors.so"}
${optionalPatch systemdSupport "${systemd}/lib/libsystemd.so"}
'';
meta = {
description = "Interactive process viewer";
homepage = "https://htop.dev";
license = lib.licenses.gpl2Only;
platforms = lib.platforms.all;
maintainers = with lib.maintainers; [
rob
relrod
SuperSandro2000
];
changelog = "https://github.com/htop-dev/htop/blob/${version}/ChangeLog";
mainProgram = "htop";
};
}

View File

@@ -0,0 +1,30 @@
{
stdenv,
lib,
fetchFromGitHub,
}:
stdenv.mkDerivation rec {
version = "2.0.1";
pname = "htpdate";
src = fetchFromGitHub {
owner = "twekkel";
repo = "htpdate";
rev = "v${version}";
sha256 = "sha256-dl3xlwk2q1DdGrIQsbKwdYDjyhGxpYwQGcd9k91LkxA=";
};
makeFlags = [
"prefix=$(out)"
];
meta = with lib; {
description = "Utility to fetch time and set the system clock over HTTP";
homepage = "https://github.com/twekkel/htpdate";
platforms = platforms.linux;
license = licenses.gpl2Plus;
maintainers = with maintainers; [ julienmalka ];
mainProgram = "htpdate";
};
}

View File

@@ -0,0 +1,78 @@
{
lib,
stdenv,
fetchurl,
fetchpatch,
zlib,
bzip2,
xz,
curl,
perl,
}:
stdenv.mkDerivation rec {
pname = "htslib";
version = "1.22";
src = fetchurl {
url = "https://github.com/samtools/htslib/releases/download/${version}/${pname}-${version}.tar.bz2";
hash = "sha256-YlDB3yl9tHdRbmCsjfRe11plLR8lsPN/EvWxcmnq/ek=";
};
patches = [
(fetchpatch {
url = "https://github.com/samtools/htslib/commit/31006e1c8edd02eb6321ed9be76b84fca5d20cb6.patch";
hash = "sha256-sbnkVmXIbs/Cn/msUUrJpJZCI2DHX5kpGSka2cccZIQ=";
})
];
# perl is only used during the check phase.
nativeBuildInputs = [ perl ];
buildInputs = [
zlib
bzip2
xz
curl
];
configureFlags =
if !stdenv.hostPlatform.isStatic then
[ "--enable-libcurl" ] # optional but strongly recommended
else
[
"--disable-libcurl"
"--disable-plugins"
];
# In the case of static builds, we need to replace the build and install phases
buildPhase = lib.optional stdenv.hostPlatform.isStatic ''
make AR=$AR lib-static
make LDFLAGS=-static bgzip htsfile tabix
'';
installPhase = lib.optional stdenv.hostPlatform.isStatic ''
install -d $out/bin
install -d $out/lib
install -d $out/include/htslib
install -D libhts.a $out/lib
install -m644 htslib/*h $out/include/htslib
install -D bgzip htsfile tabix $out/bin
'';
preCheck = ''
patchShebangs test/
'';
enableParallelBuilding = true;
doCheck = true;
meta = with lib; {
description = "C library for reading/writing high-throughput sequencing data";
license = licenses.mit;
homepage = "http://www.htslib.org/";
platforms = platforms.unix;
maintainers = [ maintainers.mimame ];
};
}

View File

@@ -0,0 +1,49 @@
{
lib,
rustPlatform,
fetchFromGitHub,
installShellFiles,
}:
rustPlatform.buildRustPackage rec {
pname = "httm";
version = "0.48.6";
src = fetchFromGitHub {
owner = "kimono-koans";
repo = "httm";
rev = version;
hash = "sha256-A/4nf5DKGf8IjQvvNSJMONoRmEBul8/RS+e4OLU1VYQ=";
};
cargoHash = "sha256-/iAeR0HmIaoSX03bvTypyvKWgjhfhAzc/ikpiCuXEcs=";
nativeBuildInputs = [ installShellFiles ];
postPatch = ''
chmod +x scripts/*.bash
patchShebangs scripts/*.bash
'';
postInstall = ''
installManPage httm.1
installShellCompletion --cmd httm \
--zsh scripts/httm-key-bindings.zsh
for script in scripts/*.bash; do
install -Dm755 "$script" "$out/bin/$(basename "$script" .bash)"
done
install -Dm644 README.md $out/share/doc/README.md
'';
meta = {
description = "Interactive, file-level Time Machine-like tool for ZFS/btrfs";
homepage = "https://github.com/kimono-koans/httm";
changelog = "https://github.com/kimono-koans/httm/releases/tag/${version}";
license = lib.licenses.mpl20;
maintainers = with lib.maintainers; [ wyndon ];
mainProgram = "httm";
};
}

View File

@@ -0,0 +1,34 @@
{
lib,
stdenv,
fetchFromGitHub,
cmake,
curl,
pkg-config,
}:
stdenv.mkDerivation {
pname = "http-getter";
version = "0-unstable-2020-12-08";
src = fetchFromGitHub {
owner = "tohojo";
repo = "http-getter";
rev = "0b20f08133206aaf225946814ceb6b85ab37e136";
sha256 = "0plyqqwfm9bysichda0w3akbdxf6279wd4mx8mda0c4mxd4xy9nl";
};
nativeBuildInputs = [
cmake
pkg-config
];
buildInputs = [ curl ];
meta = with lib; {
homepage = "https://github.com/tohojo/http-getter";
description = "Simple getter for HTTP URLs using cURL";
mainProgram = "http-getter";
platforms = platforms.unix;
license = licenses.gpl3;
};
}

View File

@@ -0,0 +1,93 @@
commit abcb3cca9452779e91380b7636f32745166af3de
Author: John Ericson <John.Ericson@Obsidian.Systems>
Date: Wed Nov 29 23:55:38 2023 -0500
Make build system: enable/disable shared/static support
This allows building this package in static-lib-only distros.
diff --git a/Makefile b/Makefile
index 5d21221..cbc7914 100644
--- a/Makefile
+++ b/Makefile
@@ -18,6 +18,9 @@
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
# IN THE SOFTWARE.
+ENABLE_SHARED ?= 1
+ENABLE_STATIC ?=
+
PLATFORM ?= $(shell sh -c 'uname -s | tr "[A-Z]" "[a-z]"')
HELPER ?=
BINEXT ?=
@@ -25,6 +28,8 @@ SOLIBNAME = libhttp_parser
SOMAJOR = 2
SOMINOR = 9
SOREV = 4
+AEXT = a
+STATICLIBNAME = $(SOLIBNAME).$(AEXT)
ifeq (darwin,$(PLATFORM))
SOEXT ?= dylib
SONAME ?= $(SOLIBNAME).$(SOMAJOR).$(SOMINOR).$(SOEXT)
@@ -109,11 +114,17 @@ test-valgrind: test_g
libhttp_parser.o: http_parser.c http_parser.h Makefile
$(CC) $(CPPFLAGS_FAST) $(CFLAGS_LIB) -c http_parser.c -o libhttp_parser.o
-library: libhttp_parser.o
- $(CC) $(LDFLAGS_LIB) -o $(LIBNAME) $<
+.PHONY: library
+library: $(LIBNAME)
+
+$(LIBNAME): libhttp_parser.o
+ $(CC) $(LDFLAGS_LIB) -o $@ $<
-package: http_parser.o
- $(AR) rcs libhttp_parser.a http_parser.o
+.PHONY: package
+package: $(STATICLIBNAME)
+
+$(STATICLIBNAME): http_parser.o
+ $(AR) rcs $@ $<
url_parser: http_parser.o contrib/url_parser.c
$(CC) $(CPPFLAGS_FAST) $(CFLAGS_FAST) $^ -o $@
@@ -130,12 +141,30 @@ parsertrace_g: http_parser_g.o contrib/parsertrace.c
tags: http_parser.c http_parser.h test.c
ctags $^
-install: library
+.PHONY: install-headers
+install-headers:
$(INSTALL) -D http_parser.h $(DESTDIR)$(INCLUDEDIR)/http_parser.h
+
+.PHONY: install-library
+install-library: library
$(INSTALL) -D $(LIBNAME) $(DESTDIR)$(LIBDIR)/$(LIBNAME)
ln -sf $(LIBNAME) $(DESTDIR)$(LIBDIR)/$(SONAME)
ln -sf $(LIBNAME) $(DESTDIR)$(LIBDIR)/$(SOLIBNAME).$(SOEXT)
+.PHONY: install-package
+install-package: package
+ $(INSTALL) -D $(STATICLIBNAME) $(DESTDIR)$(LIBDIR)/$(STATICLIBNAME)
+
+.PHONY: install
+install: install-headers
+ifeq ($(ENABLE_SHARED),1)
+install: install-library
+endif
+ifeq ($(ENABLE_STATIC),1)
+install: install-package
+endif
+
+.PHONY: install-strip
install-strip: library
$(INSTALL) -D http_parser.h $(DESTDIR)$(INCLUDEDIR)/http_parser.h
$(INSTALL) -D -s $(LIBNAME) $(DESTDIR)$(LIBDIR)/$(LIBNAME)
@@ -147,6 +176,7 @@ uninstall:
rm $(DESTDIR)$(LIBDIR)/$(SOLIBNAME).$(SOEXT)
rm $(DESTDIR)$(LIBDIR)/$(SONAME)
rm $(DESTDIR)$(LIBDIR)/$(LIBNAME)
+ rm $(DESTDIR)$(LIBDIR)/$(STATICLIBNAME)
clean:
rm -f *.o *.a tags test test_fast test_g \

View File

@@ -0,0 +1,74 @@
{
lib,
stdenv,
fetchFromGitHub,
fetchpatch,
enableShared ? !stdenv.hostPlatform.isStatic,
enableStatic ? stdenv.hostPlatform.isStatic,
}:
stdenv.mkDerivation rec {
pname = "http-parser";
version = "2.9.4";
src = fetchFromGitHub {
owner = "nodejs";
repo = "http-parser";
rev = "v${version}";
sha256 = "1vda4dp75pjf5fcph73sy0ifm3xrssrmf927qd1x8g3q46z0cv6c";
};
env.NIX_CFLAGS_COMPILE = "-Wno-error";
patches = [
./enable-static-shared.patch
]
++ lib.optionals stdenv.hostPlatform.isAarch32 [
# https://github.com/nodejs/http-parser/pull/510
(fetchpatch {
url = "https://github.com/nodejs/http-parser/commit/4f15b7d510dc7c6361a26a7c6d2f7c3a17f8d878.patch";
sha256 = "sha256-rZZMJeow3V1fTnjadRaRa+xTq3pdhZn/eJ4xjxEDoU4=";
})
];
makeFlags = [
"DESTDIR="
"PREFIX=$(out)"
"BINEXT=${stdenv.hostPlatform.extensions.executable}"
"Platform=${lib.toLower stdenv.hostPlatform.uname.system}"
"AEXT=${lib.strings.removePrefix "." stdenv.hostPlatform.extensions.staticLibrary}"
"ENABLE_SHARED=${if enableShared then "1" else "0"}"
"ENABLE_STATIC=${if enableStatic then "1" else "0"}"
]
++ lib.optionals enableShared [
"SOEXT=${lib.strings.removePrefix "." stdenv.hostPlatform.extensions.sharedLibrary}"
]
++ lib.optionals enableStatic [
"AEXT=${lib.strings.removePrefix "." stdenv.hostPlatform.extensions.staticLibrary}"
]
++ lib.optionals (enableShared && stdenv.hostPlatform.isWindows) [
"SONAME=$(SOLIBNAME).$(SOMAJOR).$(SOMINOR).$(SOEXT)"
"LIBNAME=$(SOLIBNAME).$(SOMAJOR).$(SOMINOR).$(SOREV).$(SOEXT)"
"LDFLAGS=-Wl,--out-implib=$(LIBNAME).a"
];
buildFlags = lib.optional enableShared "library" ++ lib.optional enableStatic "package";
doCheck = true;
checkTarget = "test";
enableParallelBuilding = true;
postInstall = lib.optionalString stdenv.hostPlatform.isWindows ''
install -D *.dll.a $out/lib
ln -sf libhttp_parser.${version}.dll.a $out/lib/libhttp_parser.dll.a
'';
meta = with lib; {
description = "HTTP message parser written in C";
homepage = "https://github.com/nodejs/http-parser";
maintainers = with maintainers; [ matthewbauer ];
license = licenses.mit;
platforms = platforms.all;
};
}

View File

@@ -0,0 +1,83 @@
{
lib,
fetchFromGitHub,
python3,
httpie,
versionCheckHook,
}:
let
python = python3.override {
self = python;
packageOverrides = _: super: {
prompt-toolkit = super.prompt-toolkit.overridePythonAttrs (old: rec {
version = "1.0.18";
src = old.src.override {
inherit version;
hash = "sha256-3U/KAsgGlJetkxotCZFMaw0bUBUc6Ha8Fb3kx0cJASY=";
};
});
};
};
in
python.pkgs.buildPythonApplication rec {
pname = "http-prompt";
version = "2.1.0";
pyproject = true;
src = fetchFromGitHub {
tag = "v${version}";
repo = "http-prompt";
owner = "httpie";
hash = "sha256-e4GyuxCeXYNsnBXyjIJz1HqSrqTGan0N3wxUFS+Hvkw=";
};
build-system = [ python.pkgs.setuptools ];
dependencies = with python.pkgs; [
click
httpie
parsimonious
prompt-toolkit
pygments
six
pyyaml
];
pythonImportsCheck = [ "http_prompt" ];
nativeCheckInputs = [
python.pkgs.mock
python.pkgs.pexpect
python.pkgs.pytest-cov-stub
python.pkgs.pytestCheckHook
versionCheckHook
];
disabledTests = [
# require network access
"test_get_and_tee"
"test_get_image"
"test_get_querystring"
"test_post_form"
"test_post_json"
"test_spec_from_http"
"test_spec_from_http_only"
# executable path is hardcoded
"test_help"
"test_interaction"
"test_version"
"test_vi_mode"
];
versionCheckProgramArg = "--version";
meta = {
description = "Interactive command-line HTTP client featuring autocomplete and syntax highlighting";
mainProgram = "http-prompt";
homepage = "https://github.com/eliangcs/http-prompt";
license = lib.licenses.mit;
maintainers = with lib.maintainers; [ matthiasbeyer ];
platforms = lib.platforms.linux ++ lib.platforms.darwin;
};
}

View File

@@ -0,0 +1,36 @@
{
lib,
stdenv,
buildGoModule,
fetchFromGitHub,
}:
buildGoModule rec {
pname = "http-scanner";
version = "1.0.1";
src = fetchFromGitHub {
owner = "aymaneallaoui";
repo = "kafka-http-scanner";
tag = version;
hash = "sha256-+8UpdNRuu0nTYiBBS+yiVwDEtC/KpEeyPCEeJvsjxfs=";
};
vendorHash = "sha256-Nvp9Qd1lz6/4fTgvqpInk+QhKYr/Fcunw53WERBpT8Q=";
ldflags = [
"-s"
"-w"
"-X=github.com/aymaneallaoui/kafka-http-scanner/pkg/utils.Version=${version}"
];
meta = {
description = "HTTP security vulnerability scanner that detects a wide range of web application vulnerabilities";
homepage = "https://github.com/aymaneallaoui/kafka-http-scanner";
changelog = "https://github.com/aymaneallaoui/kafka-http-scanner/releases/tag/${src.tag}";
license = lib.licenses.mit;
maintainers = with lib.maintainers; [ fab ];
mainProgram = "http-scanner";
broken = stdenv.hostPlatform.isDarwin;
};
}

View File

@@ -0,0 +1,39 @@
{
lib,
buildNpmPackage,
fetchFromGitHub,
fetchpatch2,
}:
buildNpmPackage rec {
pname = "http-server";
version = "14.1.1";
src = fetchFromGitHub {
owner = "http-party";
repo = "http-server";
rev = "v${version}";
hash = "sha256-M/YC721QWJfz5sYX6RHm1U9WPHVRBD0ZL2/ceYItnhs=";
};
patches = [
# https://github.com/http-party/http-server/pull/875
(fetchpatch2 {
name = "regenerate-package-lock.patch";
url = "https://github.com/http-party/http-server/commit/0cbd85175f1a399c4d13c88a25c5483a9f1dea08.patch";
hash = "sha256-hJyiUKZfuSaXTsjFi4ojdaE3rPHgo+N8k5Hqete+zqk=";
})
];
npmDepsHash = "sha256-iUTDdcibnstbSxC7cD5WbwSxQbfiIL2iNyMWJ8izSu0=";
dontNpmBuild = true;
meta = {
description = "Simple zero-configuration command-line http server";
homepage = "https://github.com/http-party/http-server";
license = lib.licenses.mit;
mainProgram = "http-server";
maintainers = [ ];
};
}

View File

@@ -0,0 +1,48 @@
{
lib,
python3,
stdenv,
fetchurl,
}:
stdenv.mkDerivation rec {
pname = "http2tcp";
version = "0.5";
src = fetchurl {
url = "https://www.linta.de/~aehlig/http2tcp/${pname}-${version}.tar.gz";
sha256 = "34fb83c091689dee398ca80db76487e0c39abb17cef390d845ffd888009a5caa";
};
buildInputs = [
(python3.withPackages (ps: [
ps.wsgitools
]))
];
dontBuild = true;
installPhase = ''
mkdir -p $out/{bin,share/${pname}}
cp http2tcp* $out/bin
cp Protocol $out/share/${pname}/
'';
meta = with lib; {
maintainers = with maintainers; [ clkamp ];
description = "Tool for tunneling TCP connections via HTTP GET requests";
longDescription = ''
The http2tcp tools allow to tunnel tcp connections (presumably
ssh) via syntactically correct http requests. It is designed to
work in the presence of so-called "transparent"
store-and-forward proxies disallowing POST requests.
It also turned out to be useful to stabilise connections where
the client's internet connection is unreliable (frequent long
network outages, rapidly changing IP address, etc).
'';
homepage = "https://www.linta.de/~aehlig/http2tcp/";
license = licenses.bsd3;
platforms = platforms.all;
};
}

View File

@@ -0,0 +1,378 @@
diff --git a/go.mod b/go.mod
index 2343724..a734d33 100644
--- a/go.mod
+++ b/go.mod
@@ -1,8 +1,24 @@
module github.com/FireMasterK/http3-ytproxy/v2
-go 1.16
+go 1.18
require (
github.com/kolesa-team/go-webp v1.0.1
- github.com/lucas-clemente/quic-go v0.25.0
+ github.com/quic-go/quic-go v0.40.0
+)
+
+require (
+ github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect
+ github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 // indirect
+ github.com/onsi/ginkgo/v2 v2.9.5 // indirect
+ github.com/quic-go/qpack v0.4.0 // indirect
+ github.com/quic-go/qtls-go1-20 v0.4.1 // indirect
+ go.uber.org/mock v0.3.0 // indirect
+ golang.org/x/crypto v0.4.0 // indirect
+ golang.org/x/exp v0.0.0-20221205204356-47842c84f3db // indirect
+ golang.org/x/mod v0.11.0 // indirect
+ golang.org/x/net v0.10.0 // indirect
+ golang.org/x/sys v0.8.0 // indirect
+ golang.org/x/text v0.9.0 // indirect
+ golang.org/x/tools v0.9.1 // indirect
)
diff --git a/go.sum b/go.sum
index 378f95e..214f9ff 100644
--- a/go.sum
+++ b/go.sum
@@ -1,289 +1,56 @@
-cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
-cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
-cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
-cloud.google.com/go v0.37.0/go.mod h1:TS1dMSSfndXH133OKGwekG838Om/cQT0BUHV3HcBgoo=
-dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU=
-dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBrvjyP0v+ecvNYvCpyZgu5/xkfAUhi6wJj28eUfSU=
-dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4=
-dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU=
-git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg=
-github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
-github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
-github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
-github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g=
-github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s=
-github.com/cheekybits/genny v1.0.0 h1:uGGa4nei+j20rOSeDeP5Of12XVm7TGUd4dJA9RDitfE=
-github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ=
-github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
-github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
+github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
+github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
+github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
-github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
-github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY=
-github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
-github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
-github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
-github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
-github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
-github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q=
-github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I=
-github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
-github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
-github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
-github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E=
-github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
-github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
-github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
-github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
-github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
-github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
-github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
-github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
-github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
-github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
-github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
-github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
-github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
-github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
-github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
-github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
-github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
-github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
-github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ=
-github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
-github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
-github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
-github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY=
-github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg=
-github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
-github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
-github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw=
-github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
-github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU=
-github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
-github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
-github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ=
+github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
+github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls=
+github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
+github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
+github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE=
+github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/kolesa-team/go-webp v1.0.1 h1:Btojkbzr6tt10zJ40xlbSfJeHFiNn0aR7H03QUqmMoI=
github.com/kolesa-team/go-webp v1.0.1/go.mod h1:oMvdivD6K+Q5qIIkVC2w4k2ZUnI1H+MyP7inwgWq9aA=
-github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
-github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
-github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
-github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
-github.com/lucas-clemente/quic-go v0.25.0 h1:K+X9Gvd7JXsOHtU0N2icZ2Nw3rx82uBej3mP4CLgibc=
-github.com/lucas-clemente/quic-go v0.25.0/go.mod h1:YtzP8bxRVCBlO77yRanE264+fY/T2U9ZlW1AaHOsMOg=
-github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI=
-github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
-github.com/marten-seemann/qpack v0.2.1 h1:jvTsT/HpCn2UZJdP+UUB53FfUUgeOyG5K1ns0OJOGVs=
-github.com/marten-seemann/qpack v0.2.1/go.mod h1:F7Gl5L1jIgN1D11ucXefiuJS9UMVP2opoCp2jDKb7wc=
-github.com/marten-seemann/qtls-go1-15 v0.1.4/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I=
-github.com/marten-seemann/qtls-go1-16 v0.1.4 h1:xbHbOGGhrenVtII6Co8akhLEdrawwB2iHl5yhJRpnco=
-github.com/marten-seemann/qtls-go1-16 v0.1.4/go.mod h1:gNpI2Ol+lRS3WwSOtIUUtRwZEQMXjYK+dQSBFbethAk=
-github.com/marten-seemann/qtls-go1-17 v0.1.0 h1:P9ggrs5xtwiqXv/FHNwntmuLMNq3KaSIG93AtAZ48xk=
-github.com/marten-seemann/qtls-go1-17 v0.1.0/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8=
-github.com/marten-seemann/qtls-go1-18 v0.1.0-beta.1 h1:EnzzN9fPUkUck/1CuY1FlzBaIYMoiBsdwTNmNGkwUUM=
-github.com/marten-seemann/qtls-go1-18 v0.1.0-beta.1/go.mod h1:PUhIQk19LoFt2174H4+an8TYvWOGjb/hHwphBeaDHwI=
-github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
-github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4=
-github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
-github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
-github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo=
-github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM=
-github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
-github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
-github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
-github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
-github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
-github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
-github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E=
-github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc=
-github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
-github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
-github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
-github.com/onsi/gomega v1.13.0 h1:7lLHu94wT9Ij0o6EWWclhu0aOh32VxhkwEJvzuWPeak=
-github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY=
-github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8=
-github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/onsi/ginkgo/v2 v2.9.5 h1:+6Hr4uxzP4XIUyAkg61dWBw8lb/gc4/X5luuxN/EC+Q=
+github.com/onsi/ginkgo/v2 v2.9.5/go.mod h1:tvAoo1QUJwNEU2ITftXTpR7R1RbCzoZUOs3RonqW57k=
+github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
-github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
-github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
-github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
-github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
-github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
-github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
-github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY=
-github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48/go.mod h1:5u70Mqkb5O5cxEA8nxTsgrgLehJeAw6Oc4Ab1c/P1HM=
-github.com/shurcooL/github_flavored_markdown v0.0.0-20181002035957-2122de532470/go.mod h1:2dOwnU2uBioM+SGy2aZoq1f/Sd1l9OkAeAUvjSyvgU0=
-github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk=
-github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ=
-github.com/shurcooL/gofontwoff v0.0.0-20180329035133-29b52fc0a18d/go.mod h1:05UtEgK5zq39gLST6uB0cf3NEHjETfB4Fgr3Gx5R9Vw=
-github.com/shurcooL/gopherjslib v0.0.0-20160914041154-feb6d3990c2c/go.mod h1:8d3azKNyqcHP1GaQE/c6dDgjkgSx2BZ4IoEi4F1reUI=
-github.com/shurcooL/highlight_diff v0.0.0-20170515013008-09bb4053de1b/go.mod h1:ZpfEhSmds4ytuByIcDnOLkTHGUI6KNqRNPDLHDk+mUU=
-github.com/shurcooL/highlight_go v0.0.0-20181028180052-98c3abbbae20/go.mod h1:UDKB5a1T23gOMUJrI+uSuH0VRDStOiUVSjBTRDVBVag=
-github.com/shurcooL/home v0.0.0-20181020052607-80b7ffcb30f9/go.mod h1:+rgNQw2P9ARFAs37qieuu7ohDNQ3gds9msbT2yn85sg=
-github.com/shurcooL/htmlg v0.0.0-20170918183704-d01228ac9e50/go.mod h1:zPn1wHpTIePGnXSHpsVPWEktKXHr6+SS6x/IKRb7cpw=
-github.com/shurcooL/httperror v0.0.0-20170206035902-86b7830d14cc/go.mod h1:aYMfkZ6DWSJPJ6c4Wwz3QtW22G7mf/PEgaB9k/ik5+Y=
-github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg=
-github.com/shurcooL/httpgzip v0.0.0-20180522190206-b1c53ac65af9/go.mod h1:919LwcH0M7/W4fcZ0/jy0qGght1GIhqyS/EgWGH2j5Q=
-github.com/shurcooL/issues v0.0.0-20181008053335-6292fdc1e191/go.mod h1:e2qWDig5bLteJ4fwvDAc2NHzqFEthkqn7aOZAOpj+PQ=
-github.com/shurcooL/issuesapp v0.0.0-20180602232740-048589ce2241/go.mod h1:NPpHK2TI7iSaM0buivtFUc9offApnI0Alt/K8hcHy0I=
-github.com/shurcooL/notifications v0.0.0-20181007000457-627ab5aea122/go.mod h1:b5uSkrEVM1jQUspwbixRBhaIjIzL2xazXp6kntxYle0=
-github.com/shurcooL/octicon v0.0.0-20181028054416-fa4f57f9efb2/go.mod h1:eWdoE5JD4R5UVWDucdOPg1g2fqQRq78IQa9zlOV1vpQ=
-github.com/shurcooL/reactions v0.0.0-20181006231557-f2e0b4ca5b82/go.mod h1:TCR1lToEk4d2s07G3XGfz2QrgHXg4RJBvjrOozvoWfk=
-github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
-github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYEDaXHZDBsXlPCDqdhQuJkuw4NOtaxYe3xii4=
-github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw=
-github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE=
-github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA=
+github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo=
+github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A=
+github.com/quic-go/qtls-go1-20 v0.4.1 h1:D33340mCNDAIKBqXuAvexTNMUByrYmFYVfKfDN5nfFs=
+github.com/quic-go/qtls-go1-20 v0.4.1/go.mod h1:X9Nh97ZL80Z+bX/gUXMbipO6OxdiDi58b/fMC9mAL+k=
+github.com/quic-go/quic-go v0.40.0 h1:GYd1iznlKm7dpHD7pOVpUvItgMPo/jrMgDWZhMCecqw=
+github.com/quic-go/quic-go v0.40.0/go.mod h1:PeN7kuVJ4xZbxSv/4OX6S1USOX8MJvydwpTx31vx60c=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
-github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
-github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
+github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA=
-github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU=
-github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM=
-github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
-go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA=
-go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE=
-golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw=
-golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
-golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI=
-golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+go.uber.org/mock v0.3.0 h1:3mUxI1No2/60yUYax92Pt8eNOEecx2D3lcXZh2NEZJo=
+go.uber.org/mock v0.3.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc=
+golang.org/x/crypto v0.4.0 h1:UVQgzMY87xqpKNgb+kDsll2Igd33HszWHFLmpaRMq/8=
+golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80=
+golang.org/x/exp v0.0.0-20221205204356-47842c84f3db h1:D/cFflL63o2KSLJIwjlcIt8PR064j/xsmdEJL/YvY/o=
+golang.org/x/exp v0.0.0-20221205204356-47842c84f3db/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc=
golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d h1:RNPAfi2nHY7C2srAV8A49jpsYr0ADedCk1wq6fTMTvs=
golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=
-golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
-golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
-golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
-golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo=
-golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/net v0.0.0-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
-golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
-golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
-golang.org/x/net v0.0.0-20210428140749-89ef3d95e781 h1:DzZ89McO9/gWPsQXS/FVKAlG02ZjaQ6AlZRBimEYOd0=
-golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
-golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
-golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
-golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
-golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
-golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw=
-golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20181029174526-d69651ed3497/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20190316082340-a2f829d7f35f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210510120138-977fb7262007 h1:gG67DSER+11cZvqIMb8S8bt0vZtiN6xWYARwirrOSfE=
-golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
-golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
-golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
+golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU=
+golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
+golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M=
+golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
+golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU=
+golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=
+golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
-golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
-golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.1.1 h1:wGiQel/hW0NnEkJUk8lbzkX2gFJU6PFxf1v5OlCfuOs=
-golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
-golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
-golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
-google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
-google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y=
-google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
-google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
-google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
-google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
-google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
-google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
-google.golang.org/genproto v0.0.0-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
-google.golang.org/genproto v0.0.0-20181202183823-bd91e49a0898/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg=
-google.golang.org/genproto v0.0.0-20190306203927-b5d61aea6440/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
-google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio=
-google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
-google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
-google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
-google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
-google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
-google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
-google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
-google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
-google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
-google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk=
-google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo=
+golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc=
+google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
-gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
-gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
-gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
-gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
-gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
-gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o=
-honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck=
-sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
diff --git a/main.go b/main.go
index 8c64018..2290108 100644
--- a/main.go
+++ b/main.go
@@ -16,7 +16,7 @@ import (
"github.com/kolesa-team/go-webp/encoder"
"github.com/kolesa-team/go-webp/webp"
- "github.com/lucas-clemente/quic-go/http3"
+ "github.com/quic-go/quic-go/http3"
)
// http/3 client

View File

@@ -0,0 +1,40 @@
{
lib,
fetchFromGitHub,
buildGoModule,
libwebp,
}:
buildGoModule {
pname = "http3-ytproxy";
version = "0-unstable-2022-07-03";
src = fetchFromGitHub {
owner = "TeamPiped";
repo = "http3-ytproxy";
rev = "4059da180bb9d7b0de10c1a041bd0e134f1b6408";
hash = "sha256-ilIOkZ9lcuSigh/mMU7IGpWlFMFb2/Y11ri3659S8+I=";
};
patches = [
# this patch was created by updating the quic-go dependency, bumping the go version
# and running `go mod tidy`
./dependencies.patch
];
vendorHash = "sha256-17y+kxlLSqCFoxinNNKzg7IqGpbiv0IBsUuC9EC8xnk=";
buildInputs = [ libwebp ];
ldflags = [
"-s"
"-w"
];
meta = with lib; {
description = "YouTube traffic proxy for video playback and images";
homepage = "https://github.com/TeamPiped/http3-ytproxy";
license = licenses.agpl3Only;
maintainers = with maintainers; [ _999eagle ];
mainProgram = "http3-ytproxy";
};
}

View File

@@ -0,0 +1,70 @@
{
curl,
expat,
fetchFromGitHub,
fuse3,
gumbo,
help2man,
lib,
libuuid,
meson,
ninja,
nix-update-script,
pkg-config,
stdenv,
testers,
}:
stdenv.mkDerivation (finalAttrs: {
pname = "httpdirfs";
version = "1.2.7";
src = fetchFromGitHub {
owner = "fangfufu";
repo = "httpdirfs";
tag = finalAttrs.version;
hash = "sha256-6TGptKWX0hSNL3Z3ioP7puzozWLiMhCybN7hATQdD/k=";
};
nativeBuildInputs = [
help2man
meson
ninja
pkg-config
];
buildInputs = [
curl
expat
fuse3
gumbo
libuuid
];
env.NIX_CFLAGS_COMPILE = toString [
"-Wno-error=attribute-warning"
"-Wno-error=pedantic"
];
passthru = {
tests.version = testers.testVersion {
command = "${lib.getExe finalAttrs.finalPackage} --version";
package = finalAttrs.finalPackage;
};
updateScript = nix-update-script { };
};
meta = {
changelog = "https://github.com/fangfufu/httpdirfs/releases/tag/${finalAttrs.version}";
description = "FUSE filesystem for HTTP directory listings";
homepage = "https://github.com/fangfufu/httpdirfs";
license = lib.licenses.gpl3Only;
mainProgram = "httpdirfs";
maintainers = with lib.maintainers; [
sbruder
schnusch
anthonyroussel
];
platforms = lib.platforms.linux;
};
})

View File

@@ -0,0 +1,35 @@
{
buildGoModule,
fetchFromGitHub,
lib,
libpcap,
}:
buildGoModule {
pname = "httpdump";
version = "0-unstable-2023-05-07";
src = fetchFromGitHub {
owner = "hsiafan";
repo = "httpdump";
rev = "e971e00e0136d5c770c4fdddb1c2095327d419d8";
hash = "sha256-3BzvIaZKBr/HHplJe5hM7u8kigmMHxCvkiVXFZopUCQ=";
};
vendorHash = "sha256-NKCAzx1+BkqZGeAORl7gCA7f9PSsyKxP2eggZyBB2l8=";
propagatedBuildInputs = [ libpcap ];
ldflags = [
"-s"
"-w"
];
meta = with lib; {
description = "Parse and display HTTP traffic from network device or pcap file";
mainProgram = "httpdump";
homepage = "https://github.com/hsiafan/httpdump";
license = with licenses; [ bsd2 ];
maintainers = with maintainers; [ fab ];
};
}

View File

@@ -0,0 +1,48 @@
{
lib,
stdenv,
fetchFromGitHub,
autoreconfHook,
openssl,
}:
stdenv.mkDerivation {
pname = "httperf";
version = "0.9.1";
src = fetchFromGitHub {
repo = "httperf";
owner = "httperf";
rev = "3209c7f9b15069d4b79079e03bafba5b444569ff";
sha256 = "0p48z9bcpdjq3nsarl26f0xbxmqgw42k5qmfy8wv5bcrz6b3na42";
};
nativeBuildInputs = [ autoreconfHook ];
propagatedBuildInputs = [ openssl ];
configurePhase = ''
runHook preConfigure
autoreconf -i
mkdir -pv build
cd build
../configure
runHook postConfigure
'';
installPhase = ''
mkdir -vp $out/bin
mv -v src/httperf $out/bin
'';
meta = with lib; {
description = "HTTP load generator";
homepage = "https://github.com/httperf/httperf";
maintainers = [ ];
license = licenses.gpl2Plus;
platforms = platforms.all;
mainProgram = "httperf";
};
}

View File

@@ -0,0 +1,54 @@
{
fetchurl,
lib,
stdenv,
pkg-config,
fuse,
openssl,
asciidoc,
docbook_xml_dtd_45,
docbook_xsl,
libxml2,
libxslt,
}:
stdenv.mkDerivation rec {
pname = "httpfs2";
version = "0.1.5";
src = fetchurl {
url = "mirror://sourceforge/httpfs/httpfs2/httpfs2-${version}.tar.gz";
sha256 = "1h8ggvhw30n2r6w11n1s458ypggdqx6ldwd61ma4yd7binrlpjq1";
};
nativeBuildInputs = [ pkg-config ];
buildInputs = [
fuse
openssl
asciidoc
docbook_xml_dtd_45
docbook_xsl
libxml2
libxslt
];
installPhase = ''
mkdir -p "$out/bin"
cp -v httpfs2 "$out/bin"
mkdir -p "$out/share/man/man1"
cp -v *.1 "$out/share/man/man1"
'';
meta = {
description = "FUSE-based HTTP filesystem for Linux";
mainProgram = "httpfs2";
homepage = "https://httpfs.sourceforge.net/";
license = lib.licenses.gpl2Plus;
platforms = lib.platforms.unix;
maintainers = [ ];
};
}

View File

@@ -0,0 +1,45 @@
{
appimageTools,
lib,
fetchurl,
stdenv,
}:
appimageTools.wrapType2 rec {
pname = "httpie-desktop";
version = "2025.2.0";
src =
if stdenv.hostPlatform.system == "aarch64-linux" then
fetchurl {
url = "https://github.com/httpie/desktop/releases/download/v${version}/HTTPie-${version}-arm64.AppImage";
hash = "sha256-FBzjlYwgCULgjaJUPALlqqRj7fZMps7hybt5m5EkeAo=";
}
else
fetchurl {
url = "https://github.com/httpie/desktop/releases/download/v${version}/HTTPie-${version}.AppImage";
hash = "sha256-qFDiFXQbYAhweQhgYfZW/lUMtmw09tqT9t/GPJRtZU8=";
};
extraInstallCommands =
let
contents = appimageTools.extractType2 { inherit pname version src; };
in
''
install -Dm644 ${contents}/httpie.desktop $out/share/applications/httpie.desktop
substituteInPlace $out/share/applications/httpie.desktop \
--replace-fail 'Exec=AppRun' 'Exec=httpie-desktop'
cp -r ${contents}/usr/share/* $out/share
'';
meta = {
description = "Cross-platform API testing client for humans. Painlessly test REST, GraphQL, and HTTP APIs";
homepage = "https://github.com/httpie/desktop";
license = lib.licenses.unfree;
maintainers = with lib.maintainers; [ luftmensch-luftmensch ];
mainProgram = "httpie-desktop";
platforms = [
"x86_64-linux"
"aarch64-linux"
];
};
}

View File

@@ -0,0 +1,68 @@
{
cmake,
fetchFromGitHub,
fftw,
gettext,
lib,
libintl,
ncurses,
nix-update-script,
openssl,
stdenv,
testers,
}:
stdenv.mkDerivation (finalAttrs: {
pname = "httping";
version = "4.4.0";
src = fetchFromGitHub {
owner = "folkertvanheusden";
repo = "HTTPing";
tag = "v${finalAttrs.version}";
hash = "sha256-qvi+8HwEipI8vkhPgFSN+q+3BsUCQTOqPVUUzzDn3Uo=";
};
nativeBuildInputs = [
cmake
gettext
];
buildInputs = [
fftw
libintl
ncurses
openssl
];
installPhase = ''
runHook preInstall
install -D httping $out/bin/httping
runHook postInstall
'';
passthru = {
tests.version = testers.testVersion {
command = "${lib.getExe finalAttrs.finalPackage} --version";
package = finalAttrs.finalPackage;
version = "v${finalAttrs.version}";
};
updateScript = nix-update-script { };
};
meta = {
changelog = "https://github.com/folkertvanheusden/HTTPing/releases/tag/v${finalAttrs.version}";
description = "Ping with HTTP requests";
homepage = "https://vanheusden.com/httping";
license = lib.licenses.agpl3Only;
longDescription = ''
Give httping an url, and it'll show you how long it takes to connect,
send a request and retrieve the reply (only the headers). Be aware that
the transmission across the network also takes time! So it measures the
latency of the webserver + network. It supports IPv6.
'';
mainProgram = "httping";
maintainers = [ lib.maintainers.anthonyroussel ];
platforms = lib.platforms.linux;
};
})

View File

@@ -0,0 +1,31 @@
{
lib,
buildGoModule,
fetchFromGitHub,
}:
buildGoModule rec {
pname = "httplab";
version = "0.4.2";
src = fetchFromGitHub {
owner = "qustavo";
repo = "httplab";
rev = "v${version}";
hash = "sha256-UL1i8JpgofXUB+jtW2EtSR1pM/Fdqnbg2EXPJAjc0H0=";
};
vendorHash = "sha256-vL3a9eO5G0WqnqcIjA9D2XM7iQ87JH0q+an2nLcG28A=";
ldflags = [
"-s"
"-w"
];
meta = with lib; {
homepage = "https://github.com/qustavo/httplab";
description = "Interactive WebServer";
license = licenses.mit;
mainProgram = "httplab";
};
}

View File

@@ -0,0 +1,34 @@
{
lib,
cmake,
fetchFromGitHub,
openssl,
stdenv,
}:
stdenv.mkDerivation (finalAttrs: {
pname = "httplib";
version = "0.19.0";
src = fetchFromGitHub {
owner = "yhirose";
repo = "cpp-httplib";
rev = "v${finalAttrs.version}";
hash = "sha256-OLwD7mpwqG7BUugUca+CJpPMaabJzUMC0zYzJK9PBCg=";
};
nativeBuildInputs = [ cmake ];
buildInputs = [ openssl ];
strictDeps = true;
meta = {
homepage = "https://github.com/yhirose/cpp-httplib";
description = "C++ header-only HTTP/HTTPS server and client library";
changelog = "https://github.com/yhirose/cpp-httplib/releases/tag/${finalAttrs.src.rev}";
license = lib.licenses.mit;
maintainers = [ ];
platforms = lib.platforms.all;
};
})

View File

@@ -0,0 +1,54 @@
{
lib,
rustPlatform,
fetchCrate,
installShellFiles,
makeWrapper,
pkg-config,
ronn,
openssl,
}:
rustPlatform.buildRustPackage rec {
pname = "httplz";
version = "1.13.2";
src = fetchCrate {
inherit version;
pname = "https";
hash = "sha256-uxEMgSrcxMZD/3GQuH9S/oYtMUPzgMR61ZzLcb65zXU=";
};
cargoHash = "sha256-DXSHaiiIRdyrlX4UYPFD3aTAv65k3x/PU2VW047odH0=";
nativeBuildInputs = [
installShellFiles
makeWrapper
pkg-config
ronn
];
buildInputs = [ openssl ];
cargoBuildFlags = [
"--bin"
"httplz"
];
postInstall = ''
sed -E 's/http(`| |\(|$)/httplz\1/g' http.md > httplz.1.ronn
RUBYOPT=-Eutf-8:utf-8 ronn --organization "http developers" -r httplz.1.ronn
installManPage httplz.1
wrapProgram $out/bin/httplz \
--prefix PATH : "${openssl}/bin"
'';
meta = {
description = "Basic http server for hosting a folder fast and simply";
mainProgram = "httplz";
homepage = "https://github.com/thecoshman/http";
changelog = "https://github.com/thecoshman/http/releases/tag/v${version}";
license = lib.licenses.mit;
maintainers = with lib.maintainers; [ figsoda ];
};
}

View File

@@ -0,0 +1,33 @@
{
lib,
buildGoModule,
fetchFromGitHub,
}:
buildGoModule rec {
pname = "httpref";
version = "1.6.1";
src = fetchFromGitHub {
owner = "dnnrly";
repo = "httpref";
rev = "v${version}";
hash = "sha256-T5fR9cyqsM6Kw6kFqZedoSxyvFkkxNpuErscwiUTMa0=";
};
vendorHash = "sha256-9Ei4Lfll79f/+iuO5KesUMaTgkS9nq+1tma/dhOZ7Qw=";
ldflags = [
"-s"
"-w"
];
meta = with lib; {
description = "Command line, offline, access to HTTP status code, common header, and port references";
mainProgram = "httpref";
homepage = "https://github.com/dnnrly/httpref";
changelog = "https://github.com/dnnrly/httpref/releases/tag/${src.rev}";
license = licenses.asl20;
maintainers = with maintainers; [ figsoda ];
};
}

View File

@@ -0,0 +1,32 @@
{
lib,
buildGoModule,
fetchFromGitHub,
}:
buildGoModule rec {
pname = "httprobe";
version = "0.2";
src = fetchFromGitHub {
owner = "tomnomnom";
repo = "httprobe";
rev = "v${version}";
hash = "sha256-k/Ev+zpYF+DcnQvMbbRzoJ4co83q3pi/D9T4DhtGR/I=";
};
vendorHash = null;
ldflags = [
"-s"
"-w"
];
meta = with lib; {
description = "Take a list of domains and probe for working HTTP and HTTPS servers";
homepage = "https://github.com/tomnomnom/httprobe";
license = licenses.mit;
maintainers = with maintainers; [ figsoda ];
mainProgram = "httprobe";
};
}

View File

@@ -0,0 +1,61 @@
{
lib,
stdenv,
fetchFromGitHub,
cmake,
gtest,
c-ares,
curl,
libev,
}:
stdenv.mkDerivation rec {
pname = "https-dns-proxy";
# there are no stable releases (yet?)
version = "0-unstable-2024-11-18";
src = fetchFromGitHub {
owner = "aarond10";
repo = "https_dns_proxy";
rev = "484bd153bb85a51df1c5bede1b091be76537e0a7";
hash = "sha256-T4l3kQ2hPgmyKE7xzlkDDUD6AQi8dQPJQnw8NhUUhDY=";
};
postPatch = ''
substituteInPlace https_dns_proxy.service.in \
--replace "\''${CMAKE_INSTALL_PREFIX}/" ""
substituteInPlace munin/https_dns_proxy.plugin \
--replace '--unit https_dns_proxy.service' '--unit https-dns-proxy.service'
'';
nativeBuildInputs = [
cmake
gtest
];
buildInputs = [
c-ares
curl
libev
];
postInstall = ''
install -Dm444 -t $out/share/doc/${pname} ../{LICENSE,*.md}
install -Dm444 -t $out/share/${pname}/munin ../munin/*
# the systemd service definition is garbage, and we use our own with NixOS
mv $out/lib/systemd $out/share/${pname}
rmdir $out/lib
'';
# upstream wants to add tests and the gtest framework is in place, so be ready
# for when that happens despite there being none as of right now
doCheck = true;
meta = with lib; {
description = "DNS to DNS over HTTPS (DoH) proxy";
license = licenses.mit;
maintainers = with maintainers; [ peterhoeg ];
platforms = platforms.linux;
mainProgram = "https_dns_proxy";
};
}

View File

@@ -0,0 +1,35 @@
{
lib,
fetchFromGitHub,
curl,
python3Packages,
glibcLocales,
}:
python3Packages.buildPythonApplication rec {
pname = "httpstat";
version = "1.3.2";
format = "pyproject";
src = fetchFromGitHub {
owner = "reorx";
repo = "httpstat";
rev = version;
sha256 = "sha256-dOHFLw8suvpuZkcKEzq5HktMYBGE7+vtTD609TkAFfw=";
};
build-system = with python3Packages; [ setuptools ];
doCheck = false; # No tests
buildInputs = [ glibcLocales ];
runtimeDeps = [ curl ];
LC_ALL = "en_US.UTF-8";
meta = {
description = "Curl statistics made simple";
mainProgram = "httpstat";
homepage = "https://github.com/reorx/httpstat";
license = lib.licenses.mit;
maintainers = with lib.maintainers; [ nequissimus ];
};
}

View File

@@ -0,0 +1,36 @@
{
lib,
buildGoModule,
fetchFromGitHub,
}:
buildGoModule (finalAttrs: {
pname = "httptap";
version = "0.1.1";
src = fetchFromGitHub {
owner = "monasticacademy";
repo = "httptap";
tag = "v${finalAttrs.version}";
hash = "sha256-Cn5u6q0r06SJp4uhF7j5K6yNZv8Q3WNxlDd5Vxmshhw=";
};
vendorHash = "sha256-yTtUt+kfDwN6W4caHCAYFjpYzhaqZUbLe+Nz7JKAXu8=";
env.CGO_ENABLED = 0;
subPackages = [ "." ];
ldflags = [
"-s"
"-w"
];
meta = {
description = "View HTTP/HTTPS requests made by any Linux program";
homepage = "https://github.com/monasticacademy/httptap";
license = lib.licenses.mit;
maintainers = with lib.maintainers; [ jpetrucciani ];
mainProgram = "httptap";
};
})

View File

@@ -0,0 +1,45 @@
diff --git a/pack.ts b/pack.ts
index 0212d09..03ce86a 100644
--- a/pack.ts
+++ b/pack.ts
@@ -75,39 +75,7 @@ const packageApp = async () => {
delete pJson.scripts.prepack; // We don't want to rebuild - all built code will be in the packed content
await fs.writeJson(path.join(OUTPUT_DIR, 'package.json'), pJson);
- const buildScript = path.join(OUTPUT_DIR, 'build-release.sh');
-
- // Run build-release in this folder, for each platform. For each bundle, we copy in
- // only the relevant platform-specific NSS files.
- console.log('Building for Linux x64');
- await fs.mkdir(path.join(OUTPUT_DIR, 'nss'));
- await fs.copy(path.join(__dirname, 'nss', 'linux'), path.join(OUTPUT_DIR, 'nss', 'linux'));
- await spawn(buildScript, ['linux', 'x64'], { cwd: OUTPUT_DIR, stdio: 'inherit' });
-
- console.log('Building for Linux arm64');
- await spawn(buildScript, ['linux', 'arm64'], { cwd: OUTPUT_DIR, stdio: 'inherit' });
-
- console.log('Building for Darwin x64');
- await fs.remove(path.join(OUTPUT_DIR, 'nss', 'linux'));
- await fs.copy(path.join(__dirname, 'nss', 'darwin'), path.join(OUTPUT_DIR, 'nss', 'darwin'));
- await spawn(buildScript, ['darwin', 'x64'], { cwd: OUTPUT_DIR, stdio: 'inherit' });
-
- console.log('Building for Darwin arm64');
- await spawn(buildScript, ['darwin', 'arm64'], { cwd: OUTPUT_DIR, stdio: 'inherit' });
-
- console.log('Building for Win32');
- await fs.remove(path.join(OUTPUT_DIR, 'nss', 'darwin'));
- await fs.copy(path.join(__dirname, 'nss', 'win32'), path.join(OUTPUT_DIR, 'nss', 'win32'));
- await spawn(buildScript, ['win32', 'x64'], { cwd: OUTPUT_DIR, stdio: 'inherit' });
-
- // Oclif builds a nodeless platform-agnostic bundle too (although in our case, nothing is
- // really platform agnostic). Not necessary, probably won't work - drop it.
- await fs.remove(path.join(
- OUTPUT_DIR,
- 'dist',
- `v${pJson.version}`,
- `httptoolkit-server-v${pJson.version}.tar.gz`
- ));
+ await spawn('npm', ['exec', '--', 'oclif-dev', 'pack', '--targets=linux-x64'], { cwd: OUTPUT_DIR, stdio: 'inherit' });
}
packageApp().catch(e => {

View File

@@ -0,0 +1,177 @@
{
lib,
nodejs_20,
buildNpmPackage,
fetchFromGitHub,
writeShellScriptBin,
nss,
cmake,
pkg-config,
openssl,
libdatachannel,
plog,
}:
let
nodejs = nodejs_20;
buildNpmPackage' = buildNpmPackage.override { inherit nodejs; };
version = "1.23.0";
src = fetchFromGitHub {
owner = "httptoolkit";
repo = "httptoolkit-server";
tag = "v${version}";
hash = "sha256-rcjgV71nu1Id4CQAfB9r0583qXAFk3eqDbdPWgqhtuw=";
};
overridesNodeModules = buildNpmPackage' {
pname = "httptoolkit-server-overrides-node-modules";
inherit version src;
sourceRoot = "${src.name}/overrides/js";
npmDepsHash = "sha256-MtUJY9IxzkGPuoIXHAr9nNNF+NpEf2b/oAYauJPwdaw=";
dontBuild = true;
installPhase = ''
mkdir -p $out
cp -r node_modules $out/node_modules
'';
};
nodeDatachannel = buildNpmPackage' {
pname = "node-datachannel";
version = "0.12.0";
src = fetchFromGitHub {
owner = "murat-dogan";
repo = "node-datachannel";
tag = "v${nodeDatachannel.version}";
hash = "sha256-xjYja+e2Z7X5cU4sEuSsJzG0gtmTPl3VrUf+ypd3zdw=";
};
npmFlags = [ "--ignore-scripts" ];
makeCacheWritable = true;
npmDepsHash = "sha256-Qhib9ZGulTXjoYcZIWunf3/BSd2SLXZuWEmMcstaphs=";
nativeBuildInputs = [
cmake
pkg-config
];
buildInputs = [
openssl
libdatachannel
plog
];
dontUseCmakeConfigure = true;
env.NIX_CFLAGS_COMPILE = "-I${nodejs}/include/node";
env.CXXFLAGS = "-include stdexcept"; # for GCC13
preBuild = ''
# don't use static libs and don't use FetchContent
# don't try to link plog (it's headers-only)
substituteInPlace CMakeLists.txt \
--replace-fail 'OPENSSL_USE_STATIC_LIBS TRUE' 'OPENSSL_USE_STATIC_LIBS FALSE' \
--replace-fail 'if(NOT libdatachannel)' 'if(false)' \
--replace-fail 'datachannel-static' 'datachannel' \
--replace-fail 'plog::plog' ""
# don't fetch node headers
substituteInPlace node_modules/cmake-js/lib/dist.js \
--replace-fail '!this.downloaded' 'false'
npm rebuild --verbose
'';
installPhase = ''
runHook preInstall
install -Dm755 build/Release/*.node -t $out/build/Release
runHook postInstall
'';
};
in
buildNpmPackage' {
pname = "httptoolkit-server";
inherit version src;
patches = [ ./only-build-for-one-platform.patch ];
npmDepsHash = "sha256-9Vy7i2L0yc8BdmoJvGr2g+OCwpdQUC/zVCUU7FcyCtk=";
npmFlags = [ "--ignore-scripts" ];
makeCacheWritable = true;
nativeBuildInputs = [
# the build system uses the `git` executable to get the current revision
# we use a fake git to provide it with a fake revision
(writeShellScriptBin "git" "echo '???'")
];
postConfigure = ''
# make sure `oclif-dev' doesn't fetch `node` binary to bundle with the app
substituteInPlace node_modules/@oclif/dev-cli/lib/tarballs/node.js --replace-fail \
'async function fetchNodeBinary({ nodeVersion, output, platform, arch, tmp }) {' \
'async function fetchNodeBinary({ nodeVersion, output, platform, arch, tmp }) { return;'
# manually place our prebuilt `node-datachannel` binary into its place, since we used '--ignore-scripts'
ln -s ${nodeDatachannel}/build node_modules/node-datachannel/build
cp -r ${overridesNodeModules}/node_modules overrides/js/node_modules
# don't run `npm ci` in `overrides/js` since we already copied node_modules into the directory
substituteInPlace prepare.ts --replace-fail "'ci', '--production'" "'--version'"
patchShebangs *.sh
'';
preBuild = ''
npm run build:src
'';
npmBuildScript = "build:release";
installPhase = ''
runHook preInstall
# we don't actually use any of the generated tarballs, we just copy from the tmp directory, since that's easier
mkdir -p $out/share/httptoolkit-server
cp -r build/tmp/httptoolkit-server/* -r $out/share/httptoolkit-server
# remove unneeded executables
rm -r $out/share/httptoolkit-server/bin/httptoolkit-server*
# since `oclif-dev pack` ran `npm install` again, we need to place the prebuilt binary here again
ln -s ${nodeDatachannel}/build $out/share/httptoolkit-server/node_modules/node-datachannel/build
# disable updating functionality
substituteInPlace $out/share/httptoolkit-server/node_modules/@oclif/plugin-update/lib/commands/update.js \
--replace-fail "await this.skipUpdate()" "'cannot update nix based package'"
# the app determines if it's in production by checking if HTTPTOOLKIT_SERVER_BINPATH is set to anything
makeWrapper $out/share/httptoolkit-server/bin/run $out/bin/httptoolkit-server \
--set HTTPTOOLKIT_SERVER_BINPATH dummy \
--prefix PATH : ${lib.makeBinPath [ nss.tools ]}
runHook postInstall
'';
passthru = {
inherit nodeDatachannel;
};
meta = {
description = "Backend for HTTP Toolkit";
homepage = "https://httptoolkit.com/";
license = lib.licenses.agpl3Plus;
mainProgram = "httptoolkit-server";
maintainers = with lib.maintainers; [ tomasajt ];
platforms = lib.platforms.unix;
};
}

View File

@@ -0,0 +1,59 @@
diff --git a/package-lock.json b/package-lock.json
index 8823235..a014292 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -498,10 +498,11 @@
}
},
"node_modules/@electron/rebuild/node_modules/node-abi": {
- "version": "3.74.0",
- "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.74.0.tgz",
- "integrity": "sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w==",
+ "version": "3.77.0",
+ "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.77.0.tgz",
+ "integrity": "sha512-DSmt0OEcLoK4i3NuscSbGjOf3bqiDEutejqENSplMSFA/gmB8mkED9G4pKWnPl7MDU4rSHebKPHeitpDfyH0cQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"semver": "^7.3.5"
},
@@ -5239,9 +5240,10 @@
}
},
"node_modules/node-abi": {
- "version": "2.30.0",
- "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.30.0.tgz",
- "integrity": "sha512-g6bZh3YCKQRdwuO/tSZZYJAw622SjsRfJ2X0Iy4sSOHZ34/sPPdVBn8fev2tj7njzLwuqPw9uMtGsGkO5kIQvg==",
+ "version": "2.30.1",
+ "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.30.1.tgz",
+ "integrity": "sha512-/2D0wOQPgaUWzVSVgRMx+trKJRC2UG4SUc4oCJoXx9Uxjtp0Vy3/kt7zcbxHF8+Z/pK3UloLWzBISg72brfy1w==",
+ "license": "MIT",
"dependencies": {
"semver": "^5.4.1"
}
@@ -7774,9 +7776,9 @@
}
},
"node-abi": {
- "version": "3.74.0",
- "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.74.0.tgz",
- "integrity": "sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w==",
+ "version": "3.77.0",
+ "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.77.0.tgz",
+ "integrity": "sha512-DSmt0OEcLoK4i3NuscSbGjOf3bqiDEutejqENSplMSFA/gmB8mkED9G4pKWnPl7MDU4rSHebKPHeitpDfyH0cQ==",
"dev": true,
"requires": {
"semver": "^7.3.5"
@@ -11329,9 +11331,9 @@
"dev": true
},
"node-abi": {
- "version": "2.30.0",
- "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.30.0.tgz",
- "integrity": "sha512-g6bZh3YCKQRdwuO/tSZZYJAw622SjsRfJ2X0Iy4sSOHZ34/sPPdVBn8fev2tj7njzLwuqPw9uMtGsGkO5kIQvg==",
+ "version": "2.30.1",
+ "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.30.1.tgz",
+ "integrity": "sha512-/2D0wOQPgaUWzVSVgRMx+trKJRC2UG4SUc4oCJoXx9Uxjtp0Vy3/kt7zcbxHF8+Z/pK3UloLWzBISg72brfy1w==",
"requires": {
"semver": "^5.4.1"
},

View File

@@ -0,0 +1,114 @@
{
lib,
stdenv,
buildNpmPackage,
fetchFromGitHub,
makeWrapper,
makeDesktopItem,
copyDesktopItems,
electron_37,
httptoolkit-server,
}:
let
electron = electron_37;
in
buildNpmPackage rec {
pname = "httptoolkit";
version = "1.22.1";
src = fetchFromGitHub {
owner = "httptoolkit";
repo = "httptoolkit-desktop";
tag = "v${version}";
hash = "sha256-6iiXOBVtPLdW9MWUcu2Hggm7uPHudASebRPQ34JJTMQ=";
};
patches = [
# generated via running: `npm update node-abi`
./bump-node-abi.patch
];
npmDepsHash = "sha256-WtnL9Gf1zGWnIjMifh0l3fwaeur+iI1l/Vwta+X6EAM=";
makeCacheWritable = true;
env = {
ELECTRON_SKIP_BINARY_DOWNLOAD = "1";
# disable code signing on Darwin
CSC_IDENTITY_AUTO_DISCOVERY = "false";
};
nativeBuildInputs = [
makeWrapper
]
++ lib.optionals stdenv.hostPlatform.isLinux [ copyDesktopItems ];
npmBuildScript = "build:src";
postBuild = ''
substituteInPlace package.json --replace-fail \
'"forceCodeSigning": true' \
'"forceCodeSigning": false'
cp -rL ${electron.dist} electron-dist
chmod -R u+w electron-dist
npm exec electron-builder -- \
--dir \
-c.electronDist=electron-dist \
-c.electronVersion=${electron.version}
'';
installPhase = ''
runHook preInstall
${lib.optionalString stdenv.hostPlatform.isLinux ''
mkdir -p $out/share/httptoolkit
cp -r dist/*-unpacked/{locales,resources{,.pak}} $out/share/httptoolkit
ln -s ${httptoolkit-server} $out/share/httptoolkit/resources/httptoolkit-server
install -Dm644 src/icons/icon.svg $out/share/icons/hicolor/scalable/apps/httptoolkit.svg
makeWrapper ${lib.getExe electron} $out/bin/httptoolkit \
--add-flags $out/share/httptoolkit/resources/app.asar \
--add-flags "\''${NIXOS_OZONE_WL:+\''${WAYLAND_DISPLAY:+--ozone-platform-hint=auto --enable-features=WaylandWindowDecorations --enable-wayland-ime=true}}" \
--inherit-argv0
''}
${lib.optionalString stdenv.hostPlatform.isDarwin ''
mkdir -p $out/Applications
cp -r dist/mac*/"HTTP Toolkit.app" $out/Applications
ln -s ${httptoolkit-server} "$out/Applications/HTTP Toolkit.app/Contents/Resources/httptoolkit-server"
makeWrapper "$out/Applications/HTTP Toolkit.app/Contents/MacOS/HTTP Toolkit" $out/bin/httptoolkit
''}
runHook postInstall
'';
desktopItems = [
(makeDesktopItem {
name = "httptoolkit";
desktopName = "HTTP Toolkit";
exec = "httptoolkit %U";
terminal = false;
icon = "httptoolkit";
startupWMClass = "HTTP Toolkit";
comment = meta.description;
categories = [ "Development" ];
startupNotify = true;
})
];
meta = {
description = "HTTP(S) debugging, development & testing tool";
homepage = "https://httptoolkit.com/";
license = lib.licenses.agpl3Plus;
mainProgram = "httptoolkit";
maintainers = with lib.maintainers; [ tomasajt ];
platforms = electron.meta.platforms;
};
}

View File

@@ -0,0 +1,30 @@
{
lib,
stdenv,
fetchFromGitHub,
autoreconfHook,
}:
stdenv.mkDerivation {
version = "3.3-unstable-2023-05-08";
pname = "httptunnel";
src = fetchFromGitHub {
owner = "larsbrinkhoff";
repo = "httptunnel";
rev = "d8f91af976c97a6006a5bd1ad7149380c39ba454";
hash = "sha256-fUaVHE3nxq3fU7DYCvaQTOoMzax/qFH8cMegFLLybNk=";
};
nativeBuildInputs = [
autoreconfHook
];
meta = with lib; {
description = "Creates a bidirectional virtual data connection tunnelled in HTTP requests";
homepage = "http://www.gnu.org/software/httptunnel/httptunnel.html";
license = licenses.gpl2Only;
maintainers = with maintainers; [ koral ];
platforms = platforms.unix;
};
}

View File

@@ -0,0 +1,25 @@
{
lib,
stdenv,
fetchurl,
}:
stdenv.mkDerivation rec {
pname = "httpunit";
version = "1.7";
src = fetchurl {
url = "mirror://sourceforge/httpunit/httpunit-${version}.zip";
sha256 = "09gnayqgizd8cjqayvdpkxrc69ipyxawc96aznfrgdhdiwv8l5zf";
};
buildCommand = ''
cp ./* $out
'';
meta = with lib; {
homepage = "https://httpunit.sourceforge.net";
platforms = platforms.unix;
license = licenses.mit;
};
}

View File

@@ -0,0 +1,50 @@
{
lib,
buildGoModule,
fetchFromGitHub,
versionCheckHook,
}:
buildGoModule rec {
pname = "httpx";
version = "1.7.1";
src = fetchFromGitHub {
owner = "projectdiscovery";
repo = "httpx";
tag = "v${version}";
hash = "sha256-PJN7Pmor2pZauW70QDAs4U8Q5kjBrjfyWqEgkUNK+MQ=";
};
vendorHash = "sha256-loxc8ddnape3d0TVvmAw76oqKJOJ6uFKNnPkPbEXEJ8=";
subPackages = [ "cmd/httpx" ];
nativeInstallCheckInputs = [ versionCheckHook ];
ldflags = [
"-s"
"-w"
];
# Tests require network access
doCheck = false;
doInstallCheck = true;
versionCheckProgramArg = "-version";
meta = {
description = "Fast and multi-purpose HTTP toolkit";
longDescription = ''
httpx is a fast and multi-purpose HTTP toolkit allow to run multiple
probers using retryablehttp library, it is designed to maintain the
result reliability with increased threads.
'';
homepage = "https://github.com/projectdiscovery/httpx";
changelog = "https://github.com/projectdiscovery/httpx/releases/tag/v${version}";
license = lib.licenses.mit;
maintainers = with lib.maintainers; [ fab ];
mainProgram = "httpx";
};
}

View File

@@ -0,0 +1,54 @@
{
lib,
python3Packages,
fetchPypi,
curl,
}:
python3Packages.buildPythonPackage rec {
pname = "httpy-cli";
version = "1.1.0";
pyproject = true;
src = fetchPypi {
inherit version;
pname = "httpy-cli";
hash = "sha256-uhF/jF4buHMDiXOuuqjskynioz4qVBevQhdcUbH+91Q=";
};
propagatedBuildInputs = with python3Packages; [
colorama
pygments
requests
urllib3
];
build-system = with python3Packages; [
setuptools
];
pythonImportsCheck = [
"httpy"
];
nativeCheckInputs = [
python3Packages.pytest
curl
];
checkPhase = ''
runHook preCheck
echo "line1\nline2\nline3" > tests/test_file.txt
# ignore the test_args according to pytest.ini in the repo
pytest tests/ --ignore=tests/test_args.py
runHook postCheck
'';
meta = with lib; {
description = "Modern, user-friendly, programmable command-line HTTP client for the API";
homepage = "https://github.com/knid/httpy";
license = licenses.mit;
mainProgram = "httpy";
maintainers = with maintainers; [ eymeric ];
};
}

View File

@@ -0,0 +1,40 @@
{
lib,
buildNpmPackage,
fetchFromGitHub,
versionCheckHook,
nix-update-script,
}:
buildNpmPackage rec {
pname = "httpyac";
version = "6.16.7";
src = fetchFromGitHub {
owner = "anweber";
repo = "httpyac";
tag = version;
hash = "sha256-6qhKOb2AJrDhZLRU6vrDfuW9KED+5TLf4hHH/0iADeA=";
};
npmDepsHash = "sha256-X3Yz+W7lijOLP+tEuO0JOpeOMOGdUYN6OpxPYHwFQEo=";
nativeInstallCheckInputs = [
versionCheckHook
];
versionCheckProgramArg = "--version";
doInstallCheck = true;
passthru = {
updateScript = nix-update-script { };
};
meta = {
changelog = "https://github.com/anweber/httpyac/blob/${src.rev}/CHANGELOG.md";
description = "Command Line Interface for *.http and *.rest files. Connect with http, gRPC, WebSocket and MQTT";
homepage = "https://github.com/anweber/httpyac";
license = lib.licenses.mit;
mainProgram = "httpyac";
maintainers = [ ];
platforms = lib.platforms.all;
};
}

View File

@@ -0,0 +1,33 @@
{
lib,
stdenv,
fetchurl,
zlib,
openssl,
libiconv,
}:
stdenv.mkDerivation rec {
version = "3.49.2";
pname = "httrack";
src = fetchurl {
url = "https://mirror.httrack.com/httrack-${version}.tar.gz";
sha256 = "09a0gm67nml86qby1k1gh7rdxamnrnzwr6l9r5iiq94favjs0xrl";
};
buildInputs = [
libiconv
openssl
zlib
];
enableParallelBuilding = true;
meta = with lib; {
description = "Easy-to-use offline browser / website mirroring utility";
homepage = "http://www.httrack.com";
license = licenses.gpl3;
platforms = with platforms; unix;
};
}