aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSven-Hendrik Haase <svenstaro@gmail.com>2021-08-25 02:50:12 +0000
committerSven-Hendrik Haase <svenstaro@gmail.com>2021-08-25 02:50:12 +0000
commit23df30be5491b76d3caf07b4015225a18bfbbaea (patch)
treed909ac7bcf5e9428f9cfd2375efd590afc58d9b4 /src
parentMerge pull request #575 from svenstaro/dependabot/cargo/serde-1.0.129 (diff)
downloadminiserve-23df30be5491b76d3caf07b4015225a18bfbbaea.tar.gz
miniserve-23df30be5491b76d3caf07b4015225a18bfbbaea.zip
Upgrade qrcodegen (fixes #568)
Diffstat (limited to 'src')
-rw-r--r--src/listing.rs35
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
+}