// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// Safe Browsing reporting protocol buffers.
//
// A ClientMalwareReportRequest is sent when a user opts-in to 
// sending detailed malware reports from the safe browsing interstitial page.
// 
// It is a list of Resource messages, which may contain the url of a
// resource such as the page in the address bar or any other resource
// that was loaded for this page.
//
// In addition to the url, a resource can contain HTTP request and response
// headers and bodies.

syntax = "proto2";

option optimize_for = LITE_RUNTIME;

package safe_browsing;

message ClientMalwareReportRequest {

  message HTTPHeader {
    required bytes name = 1;
    optional bytes value = 2;
  }

  message HTTPRequest {
    message FirstLine {
      optional bytes verb = 1;  // Also known as method, eg "GET"
      optional bytes uri = 2;
      optional bytes version = 3;
    }
    
    optional FirstLine firstline = 1;
    repeated HTTPHeader headers = 2;
    optional bytes body = 3;

    // bodydigest and bodylength can be useful if the report does not
    // contain the body itself.
    optional bytes bodydigest = 4;  
    optional int32 bodylength = 5;
  }

  message HTTPResponse {
    message FirstLine {
      optional int32 code = 1;
      optional bytes reason = 2;
      optional bytes version = 3;
    }

    optional FirstLine firstline = 1;
    repeated HTTPHeader headers = 2;
    optional bytes body = 3;

    // bodydigest and bodylength can be useful if the report does not
    // contain the body itself.
    optional bytes bodydigest = 4;
    optional int32 bodylength = 5;
    optional bytes remote_ip = 6;
  }

  message Resource {
    required int32 id = 1;
    optional string url = 2;
    optional HTTPRequest request = 3;
    optional HTTPResponse response = 4;

    optional int32 parent_id = 5;  // Id of the parent, if known.

    // A list of children. The order of the children in this list is
    // significant. The |parent_id| field for child nodes can be derived
    // from this, but this allows us to be more flexible.
    repeated int32 child_ids = 6;

    // Tag that was used to include this resource, eg "iframe"
    optional string tag_name = 7;
  }

  // URL of the resource that matches the safe browsing list.
  optional string malware_url = 1;

  // URL of the page in the address bar.
  optional string page_url = 2;

  optional string referrer_url = 3;
  repeated Resource resources = 4;

  // Whether the report has HTTP Responses.
  optional bool complete = 5;
}