Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(18)

Side by Side Diff: chrome/service/cloud_print/printer_job_handler.cc

Issue 2888763004: Network traffic annotation added to CloudPrintUrlFetcher. (Closed)
Patch Set: Annotations updated. Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/service/cloud_print/printer_job_handler.h" 5 #include "chrome/service/cloud_print/printer_job_handler.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/bind_helpers.h" 8 #include "base/bind_helpers.h"
9 #include "base/files/file_util.h" 9 #include "base/files/file_util.h"
10 #include "base/json/json_reader.h" 10 #include "base/json/json_reader.h"
11 #include "base/location.h" 11 #include "base/location.h"
12 #include "base/md5.h" 12 #include "base/md5.h"
13 #include "base/metrics/histogram_macros.h" 13 #include "base/metrics/histogram_macros.h"
14 #include "base/single_thread_task_runner.h" 14 #include "base/single_thread_task_runner.h"
15 #include "base/strings/string_number_conversions.h" 15 #include "base/strings/string_number_conversions.h"
16 #include "base/strings/stringprintf.h" 16 #include "base/strings/stringprintf.h"
17 #include "base/strings/utf_string_conversions.h" 17 #include "base/strings/utf_string_conversions.h"
18 #include "base/threading/thread_task_runner_handle.h" 18 #include "base/threading/thread_task_runner_handle.h"
19 #include "base/values.h" 19 #include "base/values.h"
20 #include "build/build_config.h" 20 #include "build/build_config.h"
21 #include "chrome/common/cloud_print/cloud_print_constants.h" 21 #include "chrome/common/cloud_print/cloud_print_constants.h"
22 #include "chrome/common/cloud_print/cloud_print_helpers.h" 22 #include "chrome/common/cloud_print/cloud_print_helpers.h"
23 #include "chrome/grit/generated_resources.h" 23 #include "chrome/grit/generated_resources.h"
24 #include "chrome/service/cloud_print/cloud_print_service_helpers.h" 24 #include "chrome/service/cloud_print/cloud_print_service_helpers.h"
25 #include "chrome/service/cloud_print/job_status_updater.h" 25 #include "chrome/service/cloud_print/job_status_updater.h"
26 #include "net/base/mime_util.h" 26 #include "net/base/mime_util.h"
27 #include "net/http/http_response_headers.h" 27 #include "net/http/http_response_headers.h"
28 #include "net/http/http_status_code.h" 28 #include "net/http/http_status_code.h"
29 #include "net/traffic_annotation/network_traffic_annotation.h"
29 #include "printing/printing_utils.h" 30 #include "printing/printing_utils.h"
30 #include "ui/base/l10n/l10n_util.h" 31 #include "ui/base/l10n/l10n_util.h"
31 #include "url/gurl.h" 32 #include "url/gurl.h"
32 33
33 namespace cloud_print { 34 namespace cloud_print {
34 35
35 namespace { 36 namespace {
36 37
37 base::subtle::Atomic32 g_total_jobs_started = 0; 38 base::subtle::Atomic32 g_total_jobs_started = 0;
38 base::subtle::Atomic32 g_total_jobs_done = 0; 39 base::subtle::Atomic32 g_total_jobs_done = 0;
(...skipping 10 matching lines...) Expand all
49 JOB_HANDLER_SET_IN_PROGRESS, 50 JOB_HANDLER_SET_IN_PROGRESS,
50 JOB_HANDLER_SET_START_PRINTING, 51 JOB_HANDLER_SET_START_PRINTING,
51 JOB_HANDLER_START_SPOOLING, 52 JOB_HANDLER_START_SPOOLING,
52 JOB_HANDLER_SPOOLED, 53 JOB_HANDLER_SPOOLED,
53 JOB_HANDLER_JOB_COMPLETED, 54 JOB_HANDLER_JOB_COMPLETED,
54 JOB_HANDLER_INVALID_TICKET, 55 JOB_HANDLER_INVALID_TICKET,
55 JOB_HANDLER_INVALID_DATA, 56 JOB_HANDLER_INVALID_DATA,
56 JOB_HANDLER_MAX, 57 JOB_HANDLER_MAX,
57 }; 58 };
58 59
60 net::PartialNetworkTrafficAnnotationTag kPartialTrafficAnnotation =
61 net::DefinePartialNetworkTrafficAnnotation("printer_job_handler",
62 "cloud_print",
63 R"(
64 semantics {
65 description:
66 "Handles Cloud Print jobs for a particular printer, including "
67 "connecting to printer, sending jobs, updating jobs, and gettings "
msramek 2017/06/08 21:23:32 typo: getting
Ramin Halavati 2017/06/09 04:55:46 Done.
68 "status."
69 trigger:
70 "Automatic checking if printer is available, registering parinter, "
msramek 2017/06/08 21:23:32 typo: printer
Ramin Halavati 2017/06/09 04:55:46 Done.
71 "and starting or continuing a printer task."
72 data:
73 "Cloud Print server URL, printer id, job details."
74 })");
75
59 } // namespace 76 } // namespace
60 77
61 PrinterJobHandler::PrinterInfoFromCloud::PrinterInfoFromCloud() 78 PrinterJobHandler::PrinterInfoFromCloud::PrinterInfoFromCloud()
62 : current_xmpp_timeout(0), pending_xmpp_timeout(0) { 79 : current_xmpp_timeout(0), pending_xmpp_timeout(0) {
63 } 80 }
64 81
65 PrinterJobHandler::PrinterInfoFromCloud::PrinterInfoFromCloud( 82 PrinterJobHandler::PrinterInfoFromCloud::PrinterInfoFromCloud(
66 const PrinterInfoFromCloud& other) = default; 83 const PrinterInfoFromCloud& other) = default;
67 84
68 PrinterJobHandler::PrinterJobHandler( 85 PrinterJobHandler::PrinterJobHandler(
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after
310 job_queue_handler_.GetJobsFromQueue(*json_data); 327 job_queue_handler_.GetJobsFromQueue(*json_data);
311 if (!jobs.empty()) { 328 if (!jobs.empty()) {
312 if (jobs[0].time_remaining_.is_zero()) { 329 if (jobs[0].time_remaining_.is_zero()) {
313 job_available = true; 330 job_available = true;
314 job_details_ = jobs[0]; 331 job_details_ = jobs[0];
315 job_start_time_ = base::Time::Now(); 332 job_start_time_ = base::Time::Now();
316 base::subtle::NoBarrier_AtomicIncrement(&g_total_jobs_started, 1); 333 base::subtle::NoBarrier_AtomicIncrement(&g_total_jobs_started, 1);
317 UMA_HISTOGRAM_ENUMERATION("CloudPrint.JobHandlerEvent", 334 UMA_HISTOGRAM_ENUMERATION("CloudPrint.JobHandlerEvent",
318 JOB_HANDLER_JOB_STARTED, JOB_HANDLER_MAX); 335 JOB_HANDLER_JOB_STARTED, JOB_HANDLER_MAX);
319 SetNextDataHandler(&PrinterJobHandler::HandlePrintTicketResponse); 336 SetNextDataHandler(&PrinterJobHandler::HandlePrintTicketResponse);
320 request_ = CloudPrintURLFetcher::Create(); 337 request_ = CloudPrintURLFetcher::Create(kPartialTrafficAnnotation);
321 if (print_system_->UseCddAndCjt()) { 338 if (print_system_->UseCddAndCjt()) {
322 request_->StartGetRequest( 339 request_->StartGetRequest(
323 CloudPrintURLFetcher::REQUEST_TICKET, 340 CloudPrintURLFetcher::REQUEST_TICKET,
324 GetUrlForJobCjt(cloud_print_server_url_, job_details_.job_id_, 341 GetUrlForJobCjt(cloud_print_server_url_, job_details_.job_id_,
325 job_fetch_reason_), 342 job_fetch_reason_),
326 this, kJobDataMaxRetryCount, std::string()); 343 this, kJobDataMaxRetryCount, std::string());
327 } else { 344 } else {
328 request_->StartGetRequest( 345 request_->StartGetRequest(
329 CloudPrintURLFetcher::REQUEST_TICKET, 346 CloudPrintURLFetcher::REQUEST_TICKET,
330 GURL(job_details_.print_ticket_url_), this, kJobDataMaxRetryCount, 347 GURL(job_details_.print_ticket_url_), this, kJobDataMaxRetryCount,
(...skipping 27 matching lines...) Expand all
358 << ", printer id: " << printer_info_cloud_.printer_id; 375 << ", printer id: " << printer_info_cloud_.printer_id;
359 std::string mime_type; 376 std::string mime_type;
360 source->GetResponseHeaders()->GetMimeType(&mime_type); 377 source->GetResponseHeaders()->GetMimeType(&mime_type);
361 if (print_system_->ValidatePrintTicket(printer_info_.printer_name, data, 378 if (print_system_->ValidatePrintTicket(printer_info_.printer_name, data,
362 mime_type)) { 379 mime_type)) {
363 UMA_HISTOGRAM_ENUMERATION("CloudPrint.JobHandlerEvent", 380 UMA_HISTOGRAM_ENUMERATION("CloudPrint.JobHandlerEvent",
364 JOB_HANDLER_VALID_TICKET, JOB_HANDLER_MAX); 381 JOB_HANDLER_VALID_TICKET, JOB_HANDLER_MAX);
365 job_details_.print_ticket_ = data; 382 job_details_.print_ticket_ = data;
366 job_details_.print_ticket_mime_type_ = mime_type; 383 job_details_.print_ticket_mime_type_ = mime_type;
367 SetNextDataHandler(&PrinterJobHandler::HandlePrintDataResponse); 384 SetNextDataHandler(&PrinterJobHandler::HandlePrintDataResponse);
368 request_ = CloudPrintURLFetcher::Create(); 385 request_ = CloudPrintURLFetcher::Create(kPartialTrafficAnnotation);
369 std::string accept_headers = "Accept: "; 386 std::string accept_headers = "Accept: ";
370 accept_headers += print_system_->GetSupportedMimeTypes(); 387 accept_headers += print_system_->GetSupportedMimeTypes();
371 request_->StartGetRequest(CloudPrintURLFetcher::REQUEST_DATA, 388 request_->StartGetRequest(CloudPrintURLFetcher::REQUEST_DATA,
372 GURL(job_details_.print_data_url_), this, kJobDataMaxRetryCount, 389 GURL(job_details_.print_data_url_), this, kJobDataMaxRetryCount,
373 accept_headers); 390 accept_headers);
374 } else { 391 } else {
375 UMA_HISTOGRAM_ENUMERATION("CloudPrint.JobHandlerEvent", 392 UMA_HISTOGRAM_ENUMERATION("CloudPrint.JobHandlerEvent",
376 JOB_HANDLER_INVALID_TICKET, JOB_HANDLER_MAX); 393 JOB_HANDLER_INVALID_TICKET, JOB_HANDLER_MAX);
377 // The print ticket was not valid. We are done here. 394 // The print ticket was not valid. We are done here.
378 ValidatePrintTicketFailed(); 395 ValidatePrintTicketFailed();
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
466 if (!task_in_progress_ && job_check_pending_) { 483 if (!task_in_progress_ && job_check_pending_) {
467 UMA_HISTOGRAM_ENUMERATION("CloudPrint.JobHandlerEvent", 484 UMA_HISTOGRAM_ENUMERATION("CloudPrint.JobHandlerEvent",
468 JOB_HANDLER_JOB_CHECK, JOB_HANDLER_MAX); 485 JOB_HANDLER_JOB_CHECK, JOB_HANDLER_MAX);
469 task_in_progress_ = true; 486 task_in_progress_ = true;
470 VLOG(1) << "CP_CONNECTOR: Changed task in progress" 487 VLOG(1) << "CP_CONNECTOR: Changed task in progress"
471 ", printer id: " << printer_info_cloud_.printer_id 488 ", printer id: " << printer_info_cloud_.printer_id
472 << ", task in progress: " << task_in_progress_; 489 << ", task in progress: " << task_in_progress_;
473 job_check_pending_ = false; 490 job_check_pending_ = false;
474 // We need to fetch any pending jobs for this printer 491 // We need to fetch any pending jobs for this printer
475 SetNextJSONHandler(&PrinterJobHandler::HandleJobMetadataResponse); 492 SetNextJSONHandler(&PrinterJobHandler::HandleJobMetadataResponse);
476 request_ = CloudPrintURLFetcher::Create(); 493 request_ = CloudPrintURLFetcher::Create(kPartialTrafficAnnotation);
477 request_->StartGetRequest( 494 request_->StartGetRequest(
478 CloudPrintURLFetcher::REQUEST_JOB_FETCH, 495 CloudPrintURLFetcher::REQUEST_JOB_FETCH,
479 GetUrlForJobFetch( 496 GetUrlForJobFetch(
480 cloud_print_server_url_, printer_info_cloud_.printer_id, 497 cloud_print_server_url_, printer_info_cloud_.printer_id,
481 job_fetch_reason_), 498 job_fetch_reason_),
482 this, 499 this,
483 kCloudPrintAPIMaxRetryCount, 500 kCloudPrintAPIMaxRetryCount,
484 std::string()); 501 std::string());
485 last_job_fetch_time_ = base::TimeTicks::Now(); 502 last_job_fetch_time_ = base::TimeTicks::Now();
486 VLOG(1) << "CP_CONNECTOR: Last job fetch time" 503 VLOG(1) << "CP_CONNECTOR: Last job fetch time"
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
558 if (error == JOB_SUCCESS) { 575 if (error == JOB_SUCCESS) {
559 DCHECK_EQ(status, PRINT_JOB_STATUS_IN_PROGRESS); 576 DCHECK_EQ(status, PRINT_JOB_STATUS_IN_PROGRESS);
560 UMA_HISTOGRAM_ENUMERATION("CloudPrint.JobHandlerEvent", 577 UMA_HISTOGRAM_ENUMERATION("CloudPrint.JobHandlerEvent",
561 JOB_HANDLER_SET_IN_PROGRESS, JOB_HANDLER_MAX); 578 JOB_HANDLER_SET_IN_PROGRESS, JOB_HANDLER_MAX);
562 SetNextJSONHandler( 579 SetNextJSONHandler(
563 &PrinterJobHandler::HandleInProgressStatusUpdateResponse); 580 &PrinterJobHandler::HandleInProgressStatusUpdateResponse);
564 } else { 581 } else {
565 SetNextJSONHandler( 582 SetNextJSONHandler(
566 &PrinterJobHandler::HandleFailureStatusUpdateResponse); 583 &PrinterJobHandler::HandleFailureStatusUpdateResponse);
567 } 584 }
568 request_ = CloudPrintURLFetcher::Create(); 585 request_ = CloudPrintURLFetcher::Create(kPartialTrafficAnnotation);
569 request_->StartGetRequest( 586 request_->StartGetRequest(
570 CloudPrintURLFetcher::REQUEST_UPDATE_JOB, 587 CloudPrintURLFetcher::REQUEST_UPDATE_JOB,
571 GetUrlForJobStatusUpdate(cloud_print_server_url_, job_details_.job_id_, 588 GetUrlForJobStatusUpdate(cloud_print_server_url_, job_details_.job_id_,
572 status, error), 589 status, error),
573 this, kCloudPrintAPIMaxRetryCount, std::string()); 590 this, kCloudPrintAPIMaxRetryCount, std::string());
574 } 591 }
575 592
576 void PrinterJobHandler::RunScheduledJobCheck() { 593 void PrinterJobHandler::RunScheduledJobCheck() {
577 CheckForJobs(kJobFetchReasonRetry); 594 CheckForJobs(kJobFetchReasonRetry);
578 } 595 }
(...skipping 30 matching lines...) Expand all
609 UMA_HISTOGRAM_LONG_TIMES("CloudPrint.SpoolingTime", 626 UMA_HISTOGRAM_LONG_TIMES("CloudPrint.SpoolingTime",
610 base::Time::Now() - spooling_start_time_); 627 base::Time::Now() - spooling_start_time_);
611 if (shutting_down_) 628 if (shutting_down_)
612 return; 629 return;
613 630
614 local_job_id_ = local_job_id; 631 local_job_id_ = local_job_id;
615 print_thread_.Stop(); 632 print_thread_.Stop();
616 633
617 // The print job has been spooled locally. We now need to create an object 634 // The print job has been spooled locally. We now need to create an object
618 // that monitors the status of the job and updates the server. 635 // that monitors the status of the job and updates the server.
619 scoped_refptr<JobStatusUpdater> job_status_updater( 636 scoped_refptr<JobStatusUpdater> job_status_updater(new JobStatusUpdater(
620 new JobStatusUpdater(printer_info_.printer_name, job_details_.job_id_, 637 printer_info_.printer_name, job_details_.job_id_, local_job_id_,
621 local_job_id_, cloud_print_server_url_, 638 cloud_print_server_url_, print_system_.get(), this,
622 print_system_.get(), this)); 639 kPartialTrafficAnnotation));
623 job_status_updater_list_.push_back(job_status_updater); 640 job_status_updater_list_.push_back(job_status_updater);
624 base::ThreadTaskRunnerHandle::Get()->PostTask( 641 base::ThreadTaskRunnerHandle::Get()->PostTask(
625 FROM_HERE, 642 FROM_HERE,
626 base::Bind(&JobStatusUpdater::UpdateStatus, job_status_updater)); 643 base::Bind(&JobStatusUpdater::UpdateStatus, job_status_updater));
627 644
628 CheckForJobs(kJobFetchReasonQueryMore); 645 CheckForJobs(kJobFetchReasonQueryMore);
629 646
630 VLOG(1) << "CP_CONNECTOR: Stopping printer job handler" 647 VLOG(1) << "CP_CONNECTOR: Stopping printer job handler"
631 << ", printer id: " << printer_info_cloud_.printer_id; 648 << ", printer id: " << printer_info_cloud_.printer_id;
632 base::ThreadTaskRunnerHandle::Get()->PostTask( 649 base::ThreadTaskRunnerHandle::Get()->PostTask(
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
745 printer_info_cloud_.current_xmpp_timeout), 762 printer_info_cloud_.current_xmpp_timeout),
746 mime_boundary, std::string(), &post_data); 763 mime_boundary, std::string(), &post_data);
747 } 764 }
748 765
749 printer_info_ = printer_info; 766 printer_info_ = printer_info;
750 if (!post_data.empty()) { 767 if (!post_data.empty()) {
751 net::AddMultipartFinalDelimiterForUpload(mime_boundary, &post_data); 768 net::AddMultipartFinalDelimiterForUpload(mime_boundary, &post_data);
752 std::string mime_type("multipart/form-data; boundary="); 769 std::string mime_type("multipart/form-data; boundary=");
753 mime_type += mime_boundary; 770 mime_type += mime_boundary;
754 SetNextJSONHandler(&PrinterJobHandler::HandlePrinterUpdateResponse); 771 SetNextJSONHandler(&PrinterJobHandler::HandlePrinterUpdateResponse);
755 request_ = CloudPrintURLFetcher::Create(); 772 request_ = CloudPrintURLFetcher::Create(kPartialTrafficAnnotation);
756 request_->StartPostRequest( 773 request_->StartPostRequest(
757 CloudPrintURLFetcher::REQUEST_UPDATE_PRINTER, 774 CloudPrintURLFetcher::REQUEST_UPDATE_PRINTER,
758 GetUrlForPrinterUpdate( 775 GetUrlForPrinterUpdate(
759 cloud_print_server_url_, printer_info_cloud_.printer_id), 776 cloud_print_server_url_, printer_info_cloud_.printer_id),
760 this, 777 this,
761 kCloudPrintAPIMaxRetryCount, 778 kCloudPrintAPIMaxRetryCount,
762 mime_type, 779 mime_type,
763 post_data, 780 post_data,
764 std::string()); 781 std::string());
765 } else { 782 } else {
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
800 this)) { 817 this)) {
801 OnJobSpoolFailed(); 818 OnJobSpoolFailed();
802 } 819 }
803 } 820 }
804 821
805 bool PrinterJobHandler::CurrentlyOnPrintThread() const { 822 bool PrinterJobHandler::CurrentlyOnPrintThread() const {
806 return print_thread_.task_runner()->BelongsToCurrentThread(); 823 return print_thread_.task_runner()->BelongsToCurrentThread();
807 } 824 }
808 825
809 } // namespace cloud_print 826 } // namespace cloud_print
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698