
module ietf-http {


    namespace "urn:opencord:params:xml:ns:voltha:ietf-http";
    prefix http;


    organization "CORD";
    contact
        " Any name";

    description
        "";

    revision "2016-11-15" {
        description "Initial revision.";
        reference "reference";
    }


    grouping HttpRule {
        description
            "`HttpRule` defines the mapping of an RPC method to one or more HTTP REST API
 methods. The mapping determines what portions of the request message are
 populated from the path, query parameters, or body of the HTTP request.  The
 mapping is typically specified as an `google.api.http` annotation, see
  google api annotations.proto  for details.

 The mapping consists of a mandatory field specifying a path template and an
 optional `body` field specifying what data is represented in the HTTP request
 body. The field name for the path indicates the HTTP method. Example:

 ```
 package google.storage.v2;

 import  google api annotations.proto ;

 service Storage  
   rpc CreateObject(CreateObjectRequest) returns (Object)  
     option (google.api.http)  
       post:   v2  bucket_name=buckets    objects 
       body:  object 
      ;
    ;
  
 ```

 Here `bucket_name` and `object` bind to fields of the request message
 `CreateObjectRequest`.

 The rules for mapping HTTP path, query parameters, and body fields
 to the request message are as follows:

 1. The `body` field specifies either ` ` or a field path, or is
    omitted. If omitted, it assumes there is no HTTP body.
 2. Leaf fields (recursive expansion of nested messages in the
    request) can be classified into three types:
     (a) Matched in the URL template.
     (b) Covered by body (if body is ` `, everything except (a) fields;
         else everything under the body field)
     (c) All other fields.
 3. URL query parameters found in the HTTP request are mapped to (c) fields.
 4. Any body sent with an HTTP request can contain only (b) fields.

 The syntax of the path template is as follows:

     Template =     Segments   Verb   ;
     Segments = Segment       Segment   ;
     Segment  =     |      | LITERAL | Variable ;
     Variable =     FieldPath    =  Segments       ;
     FieldPath = IDENT    .  IDENT   ;
     Verb     =  :  LITERAL ;

 ` ` matches a single path component, `  ` zero or more path components, and
 `LITERAL` a constant.  A `Variable` can match an entire path as specified
 again by a template; this nested template must not contain further variables.
 If no template is given with a variable, it matches a single path component.
 The notation ` var ` is henceforth equivalent to ` var=  `.

 Use CustomHttpPattern to specify any HTTP method that is not included in the
 pattern field, such as HEAD, or     to leave the HTTP method unspecified for
 a given URL path rule. The wild-card rule is useful for services that provide
 content to Web (HTML) clients.";
        leaf get {
            type  string; 
            description
                "Used for listing and getting information about resources.";
        }

        leaf put {
            type  string; 
            description
                "Used for updating a resource.";
        }

        leaf post {
            type  string; 
            description
                "Used for creating a resource.";
        }

        leaf delete {
            type  string; 
            description
                "Used for deleting a resource.";
        }

        leaf patch {
            type  string; 
            description
                "Used for updating a resource.";
        }

        container custom {
            uses  CustomHttpPattern;

            description
                "Custom pattern is used for defining custom verbs.";
        }

        leaf body {
            type  string; 
            description
                "The name of the request field whose value is mapped to the HTTP body, or
 ` ` for mapping all fields not captured by the path pattern to the HTTP
 body.";
        }

        list additional_bindings {
            key "get";
            uses  HttpRule;

            description
                "Additional HTTP bindings for the selector. Nested bindings must not
 specify a selector and must not contain additional bindings.";
        }

    }

    grouping CustomHttpPattern {
        description
            "A custom pattern is used for defining custom HTTP verb.";
        leaf kind {
            type  string; 
            description
                "The name of this custom HTTP verb.";
        }

        leaf path {
            type  string; 
            description
                "The path matched by this custom verb.";
        }

    }

}