diff options
author | Sven-Hendrik Haase <svenstaro@gmail.com> | 2021-08-25 02:50:12 +0000 |
---|---|---|
committer | Sven-Hendrik Haase <svenstaro@gmail.com> | 2021-08-25 02:50:12 +0000 |
commit | 23df30be5491b76d3caf07b4015225a18bfbbaea (patch) | |
tree | d909ac7bcf5e9428f9cfd2375efd590afc58d9b4 /src | |
parent | Merge pull request #575 from svenstaro/dependabot/cargo/serde-1.0.129 (diff) | |
download | miniserve-23df30be5491b76d3caf07b4015225a18bfbbaea.tar.gz miniserve-23df30be5491b76d3caf07b4015225a18bfbbaea.zip |
Upgrade qrcodegen (fixes #568)
Diffstat (limited to 'src')
-rw-r--r-- | src/listing.rs | 35 |
1 files changed, 33 insertions, 2 deletions
diff --git a/src/listing.rs b/src/listing.rs index 43cfb0e..ef2ed8b 100644 --- a/src/listing.rs +++ b/src/listing.rs @@ -244,9 +244,9 @@ pub fn directory_listing( let res = match QrCode::encode_text(&url, QrCodeEcc::Medium) { Ok(qr) => HttpResponse::Ok() .header("Content-Type", "image/svg+xml") - .body(qr.to_svg_string(2)), + .body(qr_to_svg_string(&qr, 2)), Err(err) => { - log::error!("URL is too long: {:?}", err); + log::error!("URL is invalid (too long?): {:?}", err); HttpResponse::UriTooLong().body(Body::Empty) } }; @@ -452,3 +452,34 @@ pub fn extract_query_parameters(req: &HttpRequest) -> QueryParameters { } } } + +// Returns a string of SVG code for an image depicting +// the given QR Code, with the given number of border modules. +// The string always uses Unix newlines (\n), regardless of the platform. +fn qr_to_svg_string(qr: &QrCode, border: i32) -> String { + assert!(border >= 0, "Border must be non-negative"); + let mut result = String::new(); + result += "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; + result += "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n"; + let dimension = qr + .size() + .checked_add(border.checked_mul(2).unwrap()) + .unwrap(); + result += &format!( + "<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" viewBox=\"0 0 {0} {0}\" stroke=\"none\">\n", dimension); + result += "\t<rect width=\"100%\" height=\"100%\" fill=\"#FFFFFF\"/>\n"; + result += "\t<path d=\""; + for y in 0..qr.size() { + for x in 0..qr.size() { + if qr.get_module(x, y) { + if x != 0 || y != 0 { + result += " "; + } + result += &format!("M{},{}h1v1h-1z", x + border, y + border); + } + } + } + result += "\" fill=\"#000000\"/>\n"; + result += "</svg>\n"; + result +} |