diff -up cups-1.4.2/cups/util.c.str3435 cups-1.4.2/cups/util.c --- cups-1.4.2/cups/util.c.str3435 2009-06-22 21:44:34.000000000 +0100 +++ cups-1.4.2/cups/util.c 2009-12-08 12:11:38.647375446 +0000 @@ -1511,12 +1511,36 @@ cupsPrintFiles2( return (0); } - status = cupsStartDocument(http, name, job_id, docname, format, - i == (num_files - 1)); + do + { + cupsFileRewind(fp); + + status = cupsStartDocument(http, name, job_id, docname, format, + i == (num_files - 1)); + + while (status == HTTP_CONTINUE && + (bytes = cupsFileRead(fp, buffer, sizeof(buffer))) > 0) + status = cupsWriteRequestData(http, buffer, bytes); + + if (status == HTTP_UNAUTHORIZED) + { + char resource[1024]; /* Printer resource */ - while (status == HTTP_CONTINUE && - (bytes = cupsFileRead(fp, buffer, sizeof(buffer))) > 0) - status = cupsWriteRequestData(http, buffer, bytes); + snprintf(resource, sizeof(resource), "/printers/%s", name); + + if (!cupsDoAuthentication(http, "POST", resource)) + { + if (httpReconnect(http)) + { + _cupsSetError(IPP_SERVICE_UNAVAILABLE, NULL, 0); + return (0); + } + } + else + status = HTTP_AUTHORIZATION_CANCELED; + } + } + while (status == HTTP_UNAUTHORIZED); cupsFileClose(fp);