Difference between revisions of "Xebra Module Communication Protocol"

Line 13: Line 13:
 
For every request, the module sends a message of the following format to the server:
 
For every request, the module sends a message of the following format to the server:
 
<code>
 
<code>
REQUEST = (GET_HEADER, HEADERS_IN, HEADERS_OUT, SUBPROCESS_ENVIRONMENT_VARS, GET_ARGUMENTS)  
+
REQUEST = (GET_HEADER HEADERS_IN HEADERS_OUT SUBPROCESS_ENVIRONMENT_VARS GET_ARGUMENTS)  
         | (POST_HEADER, HEADERS_IN, HEADERS_OUT, SUBPROCESS_ENVIRONMENT_VARS, POST_ARGUMENTS)  
+
         | (POST_HEADER HEADERS_IN HEADERS_OUT SUBPROCESS_ENVIRONMENT_VARS POST_ARGUMENTS) ;
  
GET_HEADER = "GET", HEADER
+
GET_HEADER = "GET" HEADER;
POST_HEADER = "POST", HEADER
+
POST_HEADER = "POST" HEADER;
HEADER = " " , url, " HTTP/1.1"
+
HEADER = " " url " HTTP/1.1";
  
HEADERS_IN = "#HI#", {"#$#", item_name, "#%#", item_value}* , "#E#"
+
HEADERS_IN = "#HI#"  {"#$#" item_name "#%#" item_value} "#E#";
HEADERS_OUT = "#HO#", {"#$#", item_name, "#%#", item_value}* , "#E#"
+
HEADERS_OUT = "#HO#"  {"#$#" item_name "#%#" item_value} "#E#";
SUBPROCESS_ENVIRONMENT_VARS = "#SE#", {"#$#", item_name, "#%#", item_value}* , "#E#"
+
SUBPROCESS_ENVIRONMENT_VARS = "#SE#"  {"#$#" item_name "#%#" item_value} "#E#";
  
GET_ARGUMENTS = "#A#", {"$", arg_name, "=", arg_value}* , "#E#"
+
GET_ARGUMENTS = "#A#"  {"$" arg_name "=" arg_value} "#E#";
POST_ARGUMENTS = "#A##CT#", content_type, "#CTE#", (TABLE_POST_DATA | post_data) ,"#E#"
+
POST_ARGUMENTS = "#A##CT#" content_type "#CTE#"  (TABLE_POST_DATA | post_data) "#E#";
TABLE_POST_DATA = {"$", arg_name, "=", arg_value}*
+
TABLE_POST_DATA = {"$" arg_name "=" arg_value};
  
  
Line 39: Line 39:
 
The server answers with a response message of the following format:
 
The server answers with a response message of the following format:
 
<code>
 
<code>
RESPONSE = {COOKIE_ORDER}*, CONTENT_TYPE, HTML
+
RESPONSE = {COOKIE_ORDER} CONTENT_TYPE HTML;
COOKIE_ORDER = "#C#", cookie_name, "=", cookie_value, COOKIE_OPT, ";Version=1#CE#"
+
COOKIE_ORDER = "#C#" cookie_name "=" cookie_value COOKIE_OPT ";Version=1#CE#";
COOKIE_OPT = [';', "Domain=", cookie_domain],
+
COOKIE_OPT = [";" "Domain=" cookie_domain]
             [';', "Max-Age=", cookie_max_age],   
+
             [";" "Max-Age=" cookie_max_age]
             [';', "Path=", cookie_path],
+
             [";" "Path=" cookie_path]
             [';', "Secure"]
+
             [";" "Secure"];
CONTENT_TYPE = "#CT#", content-type
+
CONTENT_TYPE = "#CT#" content_type;
HTML = "#H#", html_code
+
HTML = "#H#" html_code;
 
</code>
 
</code>
  

Revision as of 13:45, 30 June 2009


Basic Communication

For every string message that is to be sent between a module and server, the sender first sends the length of the message ENCODED_MESSAGE_LENGTH and then the message MESSAGE. The max length FRAG_SIZE of a message to be sent is 65536 bytes. If a message is longer, it is divided into fragments. ENCODED_MESSAGE_LENGTH is called ENCODED_ because it also contains a FRAG_FLAG which specifies if the next message is a fragment and has to be assembled to a whole message after receiving.

Let's say the server wants so send a message of size 150'000 bytes to the module. The following would be sent: [65536 FRAG_FLAG=1][Message part 1...][65536 FRAG_FLAG=1][Message part 2....][18928 FRAG_FLAG=0][Message part 3....]

The ENCODED_MESSAGE_LENGTH is constructed as follows: The lenght of the message (integer) is shifted by 1 bit to the left. Then the most right bit is set to FRAG_FLAG.

Request Message

For every request, the module sends a message of the following format to the server:

REQUEST = (GET_HEADER HEADERS_IN HEADERS_OUT SUBPROCESS_ENVIRONMENT_VARS GET_ARGUMENTS) 
        | (POST_HEADER HEADERS_IN HEADERS_OUT SUBPROCESS_ENVIRONMENT_VARS POST_ARGUMENTS) ;
 
GET_HEADER = "GET" HEADER;
POST_HEADER = "POST" HEADER;
HEADER = " "  url " HTTP/1.1";
 
HEADERS_IN = "#HI#"  {"#$#" item_name "#%#" item_value}  "#E#";
HEADERS_OUT = "#HO#"  {"#$#" item_name "#%#" item_value}  "#E#";
SUBPROCESS_ENVIRONMENT_VARS = "#SE#"  {"#$#" item_name "#%#" item_value}  "#E#";
 
GET_ARGUMENTS = "#A#"  {"$" arg_name "=" arg_value}  "#E#";
POST_ARGUMENTS = "#A##CT#" content_type "#CTE#"  (TABLE_POST_DATA | post_data) "#E#";
TABLE_POST_DATA = {"$" arg_name "=" arg_value};

Example

 

Response Message

The server answers with a response message of the following format:

RESPONSE = {COOKIE_ORDER} CONTENT_TYPE HTML;
COOKIE_ORDER = "#C#" cookie_name "=" cookie_value COOKIE_OPT ";Version=1#CE#";
COOKIE_OPT = [";" "Domain=" cookie_domain]
             [";" "Max-Age=" cookie_max_age]  
             [";" "Path=" cookie_path]
             [";" "Secure"];
CONTENT_TYPE = "#CT#" content_type;
HTML = "#H#" html_code;

Example