389 const auto &getRequest = [&](
const auto &exp ) ->
decltype(
_activeItems)::iterator {
391 ERR <<
"Ignoring invalid request!" << std::endl;
396 if ( ! elem._request )
398 return exp->requestId() == elem._request->provideMessage().requestId();
402 ERR <<
"Ignoring unknown request ID: " << exp->requestId() << std::endl;
409 const auto &sendErrorToWorker = [&](
const uint32_t reqId,
const MessageCodes code,
const std::string &reason,
bool transient = false ) {
412 ERR <<
"Failed to send Error message to worker process." << std::endl;
432 const auto &reqIter = getRequest( provMsg );
434 if ( provMsg->code() == ProvideMessage::Code::ProvideFinished && fileNeedsCleanup ) {
436 if ( !
_parent.isInCache(locFName) ) {
437 MIL <<
"Received a ProvideFinished message for a non existant request. Since this worker reported to create file artifacts, the file is cleaned up." << std::endl;
444 auto &req = *reqIter;
445 auto &reqRef =req._request;
447 const auto code = provMsg->code();
449 if ( code >= ProvideMessage::Code::FirstInformalCode && code <= ProvideMessage::Code::LastInformalCode ) {
452 if ( reqRef && reqRef->owner() )
453 reqRef->owner()->informalMessage ( *
this, reqRef, *provMsg );
456 }
else if ( code >= ProvideMessage::Code::FirstSuccessCode && code <= ProvideMessage::Code::LastSuccessCode ) {
464 if ( code == ProvideMessage::Code::ProvideFinished ) {
470 std::optional<zypp::ManagedFile> dataRef;
472 if ( !reqIter->isFileRequest() ) {
473 ERR <<
"Invalid message for request ID: " << reqIter->_request->provideMessage().requestId() << std::endl;
479 bool isCheckExistsOnly = isCheckExistsOnlyVal.valid() ? isCheckExistsOnlyVal.asBool() :
false;
482 if ( doesDownload && !isCheckExistsOnly ) {
485 dataRef =
_parent.addToFileCache ( locFName );
487 MIL <<
"CACHE MISS, file " << locFName <<
" was already removed, queueing again" << std::endl;
488 if ( reqRef->owner() )
489 reqRef->owner()->cacheMiss( reqRef );
490 reqRef->provideMessage().setRequestId(
InvalidId );
498 dataRef =
_parent.addToFileCache ( locFName );
503 reqRef->setCurrentQueue(
nullptr);
504 auto resp =
ProvideMessage::createErrorResponse ( provMsg->requestId(), ProvideMessage::Code::InternalError,
"File vanished between downloading and adding it to cache." );
505 if ( reqRef->owner() )
506 reqRef->owner()->finishReq( *
this, reqRef, resp );
515 reqRef->setCurrentQueue(
nullptr);
516 if ( reqRef->owner() )
517 reqRef->owner()->finishReq( *
this, reqRef, *provMsg );
522 }
else if ( code >= ProvideMessage::Code::FirstClientErrCode && code <= ProvideMessage::Code::LastSrvErrCode ) {
531 reqRef->setCurrentQueue(
nullptr);
533 if ( reqRef->owner() )
534 reqRef->owner()->finishReq( *
this, reqRef, *provMsg );
540 }
else if ( code >= ProvideMessage::Code::FirstRedirCode && code <= ProvideMessage::Code::LastRedirCode ) {
550 reqRef->setCurrentQueue(
nullptr);
551 if ( reqRef->owner() )
552 reqRef->owner()->finishReq( *
this, reqRef, *provMsg );
557 }
else if ( code >= ProvideMessage::Code::FirstControllerCode && code <= ProvideMessage::Code::LastControllerCode ) {
559 ERR <<
"Received Controller message from worker, this is a fatal error. Cancelling all requests!" << std::endl;
563 }
else if ( code >= ProvideMessage::Code::FirstWorkerCode && code <= ProvideMessage::Code::LastWorkerCode ) {
565 if ( code == ProvideMessage::Code::AuthDataRequest ) {
566 if ( !reqIter->isFileRequest() && !reqIter->isAttachRequest() ) {
567 ERR <<
"Invalid message for request ID: " << reqRef->provideMessage().requestId() << std::endl;
574 if ( !sendErrorToWorker( reqRef->provideMessage().requestId(), ProvideMessage::Code::NoAuthData,
"Item was cancelled") )
580 if ( !reqRef->owner() ) {
581 if ( !sendErrorToWorker( reqRef->provideMessage().requestId(), ProvideMessage::Code::NoAuthData,
"Request has no owner" ) )
586 if ( !reqRef->activeUrl() ) {
587 if ( !sendErrorToWorker( reqRef->provideMessage().requestId(), ProvideMessage::Code::NoAuthData,
"Item has no active URL, this is a bug." ) )
595 std::map<std::string, std::string> extraVals;
596 for(
const auto &hdr : provMsg->headers() ) {
602 if ( !hdr.second.isString() ) {
603 WAR <<
"Ignoring non string value for " << hdr.first << std::endl;
607 extraVals[hdr.first] = hdr.second.asString();
612 if ( !sendErrorToWorker( reqRef->provideMessage().requestId(), ProvideMessage::Code::NoAuthData,
"No auth given by user." ) )
617 auto r =
ProvideMessage::createAuthInfo ( reqRef->provideMessage().requestId(), authOpt->username(), authOpt->password(), authOpt->lastDatabaseUpdate(), authOpt->extraValues() );
619 ERR <<
"Failed to send AuthorizationInfo to worker process." << std::endl;
627 if ( !sendErrorToWorker( reqRef->provideMessage().requestId(), ProvideMessage::Code::NoAuthData, e.
asString() ) )
632 }
else if ( code == ProvideMessage::Code::MediaChangeRequest ) {
634 if ( !reqIter->isAttachRequest() ) {
635 ERR <<
"Invalid message for request ID: " << reqIter->_request->provideMessage().requestId() << std::endl;
642 if ( !sendErrorToWorker( reqRef->provideMessage().requestId(), ProvideMessage::Code::MediaChangeAbort,
"Item was cancelled" ) )
647 MIL <<
"Worker sent a MediaChangeRequest, asking the user to insert the correct medium" << std::endl;
650 std::vector<std::string> freeDevs;
652 freeDevs.push_back( val.asString() );
655 std::optional<std::string> desc;
657 if ( descVal.valid () && descVal.isString() )
658 desc = descVal.asString();
660 auto res =
_parent._sigMediaChange.emit(
671 MIL <<
"Sending back a MediaChanged message, retrying to find medium " << std::endl;
674 ERR <<
"Failed to send MediaChanged to worker process." << std::endl;
681 MIL <<
"Sending back a MediaChangeFailure message, request will fail " << std::endl;
682 if ( !sendErrorToWorker( reqRef->provideMessage().requestId(), ProvideMessage::Code::MediaChangeAbort,
"Cancelled by User" ) )
687 MIL <<
"Sending back a MediaChangeFailure message, request will fail " << std::endl;
688 if ( !sendErrorToWorker( reqRef->provideMessage().requestId(), ProvideMessage::Code::MediaChangeSkip,
"Skipped by User" ) )
695 ERR <<
"Unsupported worker request: "<<code<<
", this is a fatal error!" << std::endl;
702 ERR <<
"Received unsupported message " << msg->command() <<
" with code " << code <<
" ignoring! " << std::endl;
706 ERR <<
"Received unsupported message " << msg->command() <<
"ignoring" << std::endl;