Files
photocraft/crates/ipp
Dylan M. Taylor f960a65eb3 ipp: resume the reply's header search where the last read stopped (#11049)
read_response searched every byte read so far for the blank line after
each read, so a server trickling a 16 MiB reply in tiny fragments made
the client rescan it once per fragment. Resume the search three bytes
before the previous end.
2026-11-03 20:31:14 -05:00
..

photocraft-ipp

A small IPP (Internet Printing Protocol, RFC 8010/8011) client for the local CUPS server, in pure Rust with no dependencies. It does in-process what lp does from the command line, so PhotoCraft can print where there is no lp binary (a Flatpak sandbox with --socket=cups, a minimal container) and can read the printer list and the default printer first instead of handing CUPS's errors to the user.

let ep = photocraft_ipp::Endpoint::detect().ok_or("no CUPS server")?;   // socket, then localhost:631
let printers = photocraft_ipp::printers(&ep)?;                            // name, info, state, default
let id = photocraft_ipp::print_job(&ep, &photocraft_ipp::Job { printer: "Office", title: "photo", user: "me", copies: 2, document: &pdf, format: "application/pdf" })?;

Three operations: CUPS-Get-Printers, CUPS-Get-Default, Print-Job. HTTP/1.1 over the CUPS domain socket (/run/cups/cups.sock, or CUPS_SERVER as a path) or TCP (localhost:631, or CUPS_SERVER as host[:port]), chunked replies included. Replies are capped at 16 MiB and parsed with bounds checks; an IPP error status becomes Error::Status with the server's own message. Tests run against an in-process fake server over TCP and a Unix socket.

Standalone: it depends on no other PhotoCraft crate. Used by photocraft-engine's print commands on Unix; Windows printing lives in photocraft-winprint.