<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE language SYSTEM "language.dtd">
<language name= "Varnish Test Case language" version= "0.1" kateversion= "2.4" section= "Configuration" extensions= "*.vtc;" mimetype= "" author= "Xavier Guerrin (xavier@tuxfamily.org)" license= "WTFPL" >
<highlighting >
<list name= "vtcClientKeywords" >
<item > fatal</item>
<item > gunzip</item>
<item > rxchunk</item>
</list>
<list name= "vtcServerKeywords" >
<item > accept</item>
<item > close</item>
<item > expect_close</item>
<item > fatal</item>
<item > rxbody</item>
<item > rxhdrs</item>
<item > rxreq</item>
</list>
<contexts >
<!-- default context: define main keywords -->
<context name= "vtcnormal_text" attribute= "Normal Text" lineEndContext= "#stay" >
<IncludeRules context= "global_directives_restricted" />
<IncludeRules context= "global_directives" />
</context>
<!-- directives that can be encountered at global scope but not within a loop -->
<context name= "global_directives_restricted" attribute= "Normal Text" lineEndContext= "#stay" >
<StringDetect firstNonSpace= "true" attribute= "Keyword" context= "varnishtest_declaration" String= "varnishtest" />
<StringDetect firstNonSpace= "true" attribute= "Keyword" context= "feature_instruction" String= "feature" />
<RegExpr attribute= "Keyword" context= "#stay" String= "^\s*random\s*$" />
</context>
<!-- directives that can be encountered at global scope, either directly or within a loop -->
<context name= "global_directives" attribute= "Normal Text" lineEndContext= "#stay" >
<IncludeRules context= "comments" />
<StringDetect firstNonSpace= "true" attribute= "Keyword" context= "client_declaration" String= "client" />
<StringDetect firstNonSpace= "true" attribute= "Keyword" context= "server_declaration" String= "server" />
<StringDetect firstNonSpace= "true" attribute= "Keyword" context= "varnish_declaration" String= "varnish" />
<StringDetect firstNonSpace= "true" attribute= "Keyword" context= "sema_instruction" String= "sema" />
<StringDetect firstNonSpace= "true" attribute= "Keyword" context= "shell_instruction" String= "shell" />
<StringDetect firstNonSpace= "true" attribute= "Keyword" context= "delay_instruction" String= "delay" />
<StringDetect firstNonSpace= "true" attribute= "Keyword" context= "global_loop_instruction" String= "loop" />
</context>
<!-- Strings delimited with double quotes -->
<context name= "strings" attribute= "Normal Text" lineEndContext= "#stay" >
<DetectChar char= """ context= "string" attribute= "String" />
</context>
<context name= "string" attribute= "String" lineEndContext= "#pop" >
<Detect2Chars attribute= "String" context= "#stay" char= "\" char1= """ />
<DetectChar attribute= "String" context= "#pop" char= """ />
</context>
<!-- The following contexts (quoted - , brace - and unquoted - strings) make their parent pop as soon as they parsed a string. -->
<context name= "quoted-strings" attribute= "Normal Text" lineEndContext= "#stay" >
<DetectChar char= """ context= "quoted-string" attribute= "String" />
</context>
<context name= "quoted-string" attribute= "String" lineEndContext= "#pop#pop" >
<Detect2Chars attribute= "String" context= "#stay" char= "\" char1= """ />
<DetectChar attribute= "String" context= "#pop#pop" char= """ />
</context>
<context name= "brace-strings" attribute= "Normal Text" lineEndContext= "#pop" >
<DetectChar attribute= "String" context= "brace-string" char= "{" beginRegion= "string_block" />
</context>
<context name= "brace-string" attribute= "String" lineEndContext= "#stay" >
<!--
strings delimited with braces do not require to escape closing braces;
therefore, we have to use an extra context to keep track of opening and closing braces
-->
<DetectChar attribute= "String" context= "brace-string-internal" char= "{" />
<DetectChar attribute= "String" context= "#pop#pop" char= "}" endRegion= "string_block" />
</context>
<context name= "brace-string-internal" attribute= "String" lineEndContext= "#stay" >
<DetectChar attribute= "String" context= "#pop" char= "}" />
</context>
<context name= "unquoted-strings" attribute= "String" lineEndContext= "#pop" >
<RegExpr attribute= "String" context= "unquoted-string" String= "[^ ]" />
</context>
<context name= "unquoted-string" attribute= "String" lineEndContext= "#pop#pop" >
<RegExpr attribute= "Normal Text" context= "#pop#pop" String= "\s" />
</context>
<!-- This context exits as soon as it parsed a string, be it defined between braces, quotes or spaces -->
<context name= "string-arg" attribute= "Normal Text" lineEndContext= "#stay" >
<IncludeRules context= "brace-strings" />
<IncludeRules context= "quoted-strings" />
<IncludeRules context= "unquoted-strings" />
</context>
<!-- This context exits as soon as it parsed an integer. -->
<context name= "int-arg" attribute= "Int" lineEndContext= "#pop" >
<Int attribute= "Decimal" context= "#pop" />
</context>
<!-- Comments -->
<context name= "shell-like-comment" attribute= "Comment" lineEndContext= "#pop" >
<IncludeRules context= "##Alerts" />
<IncludeRules context= "##Modelines" />
</context>
<context name= "comments" attribute= "Comment" lineEndContext= "#pop" >
<DetectChar char= "#" context= "shell-like-comment" attribute= "Comment" />
</context>
<!-- Define base elements that used within various contexts -->
<context name= "base_elements" attribute= "Normal Text" lineEndContext= "#stay" >
<RegExpr attribute= "HTTP announce" context= "#stay" String= "HTTP/[0-9.]+" />
<RegExpr attribute= "HTTP method" context= "#stay" String= "\s+(GET|HEAD|POST|PUT|DELETE|TRACE|OPTIONS|CONNECT|PATCH)" />
<RegExpr attribute= "HTTP WebDAV method" context= "#stay" String= "\s+(PROPFIND|PROPPATCH|MKCOL|COPY|MOVE|LOCK|UNLOCK|CONNECT|PATCH)" />
<RegExpr attribute= "HTTP custom method" context= "#stay" String= "\s+(PURGE|PURGESTR)" />
<Float attribute= "Float" context= "#stay" />
<Int attribute= "Decimal" context= "#stay" />
<IncludeRules context= "strings" />
<IncludeRules context= "comments" />
</context>
<!-- Define syntax within - expect options -->
<context name= "expectation_common" attribute= "Normal Text" lineEndContext= "#stay" >
<RegExpr attribute= "Keyword" context= "#stay" String= "<undef>" />
<IncludeRules context= "base_elements" />
<IncludeRules context= "vcl_operators" />
</context>
<context name= "expectation" attribute= "String" lineEndContext= "#pop" >
<IncludeRules context= "expectation_common" />
<IncludeRules context= "vcl_variables" />
</context>
<context name= "varnish_expectation" attribute= "Normal Text" lineEndContext= "#pop" >
<IncludeRules context= "expectation_common" />
<IncludeRules context= "varnishstat_variables" />
</context>
<!-- Define macros -->
<context name= "macro_accepted" attribute= "String" lineEndContext= "#pop" >
<Detect2Chars char= "$" char1= "{" attribute= "String" context= "macro_identifier" />
</context>
<context name= "macro_identifier" attribute= "String" lineEndContext= "#pop#pop" >
<DetectChar char= "}" attribute= "String" context= "#pop" />
</context>
<!-- Define syntax for main keywords' options -->
<context name= "common_options" attribute= "Normal Text" lineEndContext= "#stay" >
<IncludeRules context= "macro_accepted" />
<IncludeRules context= "base_elements" />
</context>
<context name= "client_options" attribute= "Normal Text" lineEndContext= "#stay" >
<RegExpr attribute= "Keyword" context= "#stay" String= "\-(?:run|wait|start|connect)" />
<RegExpr attribute= "Keyword" context= "expectation" String= "-expect" />
<IncludeRules context= "common_options" />
</context>
<context name= "server_options" attribute= "Normal Text" lineEndContext= "#stay" >
<RegExpr attribute= "Keyword" context= "#stay" String= "\-(?:start|wait|stop|repeat)" />
<RegExpr attribute= "Keyword" context= "expectation" String= "-expect" />
<IncludeRules context= "common_options" />
</context>
<context name= "varnish_options" attribute= "Normal Text" lineEndContext= "#stay" >
<RegExpr attribute= "Keyword" context= "#stay" String= "\-(?:start|stop|wait|wait-running|wait-stopped)" />
<RegExpr attribute= "Keyword" context= "string-arg" String= "\-(?:arg|cli|cliok|storage) " />
<RegExpr attribute= "Keyword" context= "clierr_options" String= "\-clierr " />
<RegExpr attribute= "Keyword" context= "varnish_expectation" String= "-expect" />
<IncludeRules context= "common_options" />
</context>
<context name= "clierr_options" attribute= "Normal Text" lineEndContext= "#pop" >
<!-- unlike clikok, clierr requires an integer argument first -->
<Int attribute= "Decimal" context= "clierr_command" />
<IncludeRules context= "comments" />
</context>
<context name= "clierr_command" attribute= "String" lineEndContext= "#pop" >
<IncludeRules context= "comments" />
</context>
<!-- Define syntax for the client - specific txreq keyword -->
<context name= "txreq_options" attribute= "String" lineEndContext= "#pop" >
<IncludeRules context= "comments" />
<RegExpr attribute= "TxReq Keyword" context= "string-arg" String= "\-(?:body|hdr|proto|req|url)" />
<LineContinue attribute= "Normal Text" context= "#stay" />
</context>
<!-- Define syntax for the client - specific rxresp keyword -->
<context name= "rxresp_options" attribute= "Normal Text" lineEndContext= "#pop" >
<StringDetect attribute= "RxResp Keyword" String= "-no_obj" />
<LineContinue attribute= "Normal Text" context= "#stay" />
</context>
<!-- Define syntax for the server - specific txresp keyword -->
<context name= "txresp_options" attribute= "Normal Text" lineEndContext= "#pop" >
<IncludeRules context= "comments" />
<RegExpr attribute= "TxResp Keyword" String= "-nolen" />
<RegExpr attribute= "TxResp Keyword" context= "string-arg" String= "\-(?:body|gzipbody|hdr|proto|msg) " />
<RegExpr attribute= "TxResp Keyword" context= "int-arg" String= "\-(?:bodylen|gzip(?:len|residual|level)|status)" />
<LineContinue attribute= "Normal Text" context= "#stay" />
</context>
<!-- varnishtest keyword -->
<context name= "varnishtest_declaration" attribute= "Normal Text" lineEndContext= "#pop" >
<IncludeRules context= "strings" />
<IncludeRules context= "comments" />
</context>
<!-- client keyword -->
<context name= "client_declaration" attribute= "Normal Text" lineEndContext= "#pop" >
<DetectIdentifier attribute= "Client Identifier" context= "client_identified" />
</context>
<context name= "client_identified" attribute= "String" lineEndContext= "#pop" >
<IncludeRules context= "client_options" />
<DetectChar attribute= "Region Marker" context= "client_definition" char= "{" beginRegion= "client_block" />
<LineContinue attribute= "Normal Text" context= "#stay" />
</context>
<context name= "client_definition" attribute= "Normal Text" lineEndContext= "#stay" >
<IncludeRules context= "comments" />
<!-- basic keywords that take no options -->
<keyword attribute= "Action Keyword" context= "#stay" String= "vtcClientKeywords" />
<StringDetect firstNonSpace= "true" attribute= "Action Keyword" context= "#stay" String= "non-fatal" />
<StringDetect firstNonSpace= "true" attribute= "Action Keyword" context= "expectation" String= "expect" />
<StringDetect firstNonSpace= "true" attribute= "Action Keyword" context= "txreq_options" String= "txreq" />
<StringDetect firstNonSpace= "true" attribute= "Action Keyword" context= "rxresp_options" String= "rxresp" />
<StringDetect firstNonSpace= "true" attribute= "Action Keyword" context= "sema_instruction" String= "sema" />
<StringDetect firstNonSpace= "true" attribute= "Action Keyword" context= "delay_instruction" String= "delay" />
<StringDetect firstNonSpace= "true" attribute= "Action Keyword" context= "send_instruction" String= "sendhex" />
<StringDetect firstNonSpace= "true" attribute= "Action Keyword" context= "send_instruction" String= "send" />
<StringDetect firstNonSpace= "true" attribute= "Action Keyword" context= "timeout_instruction" String= "timeout" />
<StringDetect firstNonSpace= "true" attribute= "Action Keyword" context= "client_loop_instruction" String= "loop" />
<DetectChar attribute= "Region Marker" context= "client_postdefinition" char= "}" endRegion= "client_block" />
</context>
<context name= "client_postdefinition" attribute= "Normal Text" lineEndContext= "#pop#pop#pop#pop" >
<IncludeRules context= "client_options" />
</context>
<!-- server keyword -->
<context name= "server_declaration" attribute= "Normal Text" lineEndContext= "#pop" >
<DetectIdentifier attribute= "Server Identifier" context= "server_identified" />
</context>
<context name= "server_identified" attribute= "String" lineEndContext= "#pop" >
<IncludeRules context= "server_options" />
<DetectChar attribute= "Region Marker" context= "server_definition" char= "{" beginRegion= "server_block" />
<LineContinue attribute= "Normal Text" context= "#stay" />
</context>
<context name= "server_definition" attribute= "Normal Text" lineEndContext= "#stay" >
<IncludeRules context= "comments" />
<!-- basic keywords that take no options -->
<keyword attribute= "Action Keyword" context= "#stay" String= "vtcServerKeywords" />
<StringDetect firstNonSpace= "true" attribute= "Action Keyword" context= "#stay" String= "non-fatal" />
<StringDetect firstNonSpace= "true" attribute= "Action Keyword" context= "expectation" String= "expect" />
<StringDetect firstNonSpace= "true" attribute= "Action Keyword" context= "txresp_options" String= "txresp" />
<StringDetect firstNonSpace= "true" attribute= "Action Keyword" context= "sema_instruction" String= "sema" />
<StringDetect firstNonSpace= "true" attribute= "Action Keyword" context= "delay_instruction" String= "delay" />
<StringDetect firstNonSpace= "true" attribute= "Action Keyword" context= "chunkedlen_instruction" String= "chunkedlen" />
<StringDetect firstNonSpace= "true" attribute= "Action Keyword" context= "send_instruction" String= "sendhex" />
<StringDetect firstNonSpace= "true" attribute= "Action Keyword" context= "send_instruction" String= "send" />
<StringDetect firstNonSpace= "true" attribute= "Action Keyword" context= "send_instruction" String= "chunked" />
<StringDetect firstNonSpace= "true" attribute= "Action Keyword" context= "timeout_instruction" String= "timeout" />
<StringDetect firstNonSpace= "true" attribute= "Action Keyword" context= "server_loop_instruction" String= "loop" />
<DetectChar attribute= "Region Marker" context= "server_postdefinition" char= "}" endRegion= "server_block" />
</context>
<context name= "server_postdefinition" attribute= "Normal Text" lineEndContext= "#pop#pop#pop#pop" >
<IncludeRules context= "server_options" />
</context>
<!-- varnish keyword -->
<context name= "varnish_declaration" attribute= "Normal Text" lineEndContext= "#pop" >
<DetectIdentifier attribute= "Varnish Identifier" context= "varnish_identified" />
</context>
<context name= "varnish_identified" attribute= "Normal Text" lineEndContext= "#pop" >
<IncludeRules context= "varnish_options" />
<RegExpr attribute= "Keyword" context= "varnish_vclannounced" String= "\s*\-(?:bad)?vcl(?:\+backend)?" />
<LineContinue attribute= "Normal Text" context= "#stay" />
</context>
<context name= "varnish_vclannounced" attribute= "Normal Text" lineEndContext= "#stay" >
<DetectChar attribute= "Region Marker" context= "varnish_vcldefinition" char= "{" beginRegion= "varnish_block" />
</context>
<context name= "varnish_vcldefinition" attribute= "Normal Text" lineEndContext= "#stay" >
<IncludeRules context= "##Varnish Configuration Language" />
<!-- varnish.xml may lack a few properties such as req/bereq/obj.{keep,ttl,grace} -->
<!-- also, according to v00033.vtc, storage.xxxx.{free,used}_space are correct Varnish properties;
+ have a look at the B/KB/MB/GB/TB notation and everything related to storage.* -->
<!-- basically, all v*.vtc files can teach us something about VCL since this is what they test -->
<DetectChar attribute= "Region Marker" context= "varnish_postvcldefinition" char= "}" endRegion= "varnish_block" />
</context>
<context name= "varnish_postvcldefinition" attribute= "Normal Text" lineEndContext= "#pop#pop#pop#pop#pop" >
<IncludeRules context= "varnish_options" />
</context>
<!-- sema keyword -->
<context name= "sema_instruction" attribute= "Normal Text" lineEndContext= "#pop" >
<DetectIdentifier attribute= "Sema Identifier" context= "sema_identified" />
</context>
<context name= "sema_identified" attribute= "Normal Text" lineEndContext= "#pop#pop" >
<RegExpr attribute= "Keyword" String= "sync" />
<Int attribute= "Decimal" context= "#stay" />
<IncludeRules context= "comments" />
</context>
<!-- delay keyword -->
<context name= "delay_instruction" attribute= "Normal Text" lineEndContext= "#pop" >
<Int attribute= "Decimal" context= "#stay" />
<Float attribute= "Float" context= "#stay" />
<IncludeRules context= "comments" />
</context>
<!-- feature keyword -->
<context name= "feature_instruction" attribute= "String" lineEndContext= "#pop" >
<IncludeRules context= "strings" />
<IncludeRules context= "comments" />
</context>
<!-- chunkedlen keyword -->
<context name= "chunkedlen_instruction" attribute= "Normal Text" lineEndContext= "#pop" >
<Int attribute= "Decimal" context= "#stay" />
<IncludeRules context= "comments" />
</context>
<!-- send / sendhex / chunk keywords -->
<context name= "send_instruction" attribute= "Normal Text" lineEndContext= "#pop" >
<IncludeRules context= "string-arg" />
<IncludeRules context= "comments" />
</context>
<!-- timeout keyword -->
<context name= "timeout_instruction" attribute= "Normal Text" lineEndContext= "#pop" >
<IncludeRules context= "int-arg" />
<IncludeRules context= "comments" />
</context>
<!-- loop keyword at global scope -->
<context name= "global_loop_instruction" attribute= "Normal Text" lineEndContext= "#stay" >
<Int attribute= "Decimal" context= "global_loop_defined" />
</context>
<context name= "global_loop_defined" attribute= "Normal Text" lineEndContext= "#stay" >
<DetectChar attribute= "Region Marker" context= "global_loop_code" char= "{" beginRegion= "loop_block" />
</context>
<context name= "global_loop_code" attribute= "Normal Text" lineEndContext= "#stay" >
<DetectChar attribute= "Region Marker" context= "#pop#pop#pop" char= "}" endRegion= "loop_block" />
<IncludeRules context= "global_directives" />
</context>
<!-- loop keyword for client definitions -->
<context name= "client_loop_instruction" attribute= "Normal Text" lineEndContext= "#stay" >
<Int attribute= "Decimal" context= "client_loop_defined" />
</context>
<context name= "client_loop_defined" attribute= "Normal Text" lineEndContext= "#stay" >
<DetectChar attribute= "Region Marker" context= "client_loop_code" char= "{" beginRegion= "loop_block" />
</context>
<context name= "client_loop_code" attribute= "Normal Text" lineEndContext= "#stay" >
<DetectChar attribute= "Region Marker" context= "#pop#pop#pop" char= "}" endRegion= "loop_block" />
<IncludeRules context= "client_definition" />
</context>
<!-- loop keyword for server definitions -->
<context name= "server_loop_instruction" attribute= "Normal Text" lineEndContext= "#stay" >
<Int attribute= "Decimal" context= "server_loop_defined" />
</context>
<context name= "server_loop_defined" attribute= "Normal Text" lineEndContext= "#stay" >
<DetectChar attribute= "Region Marker" context= "server_loop_code" char= "{" beginRegion= "loop_block" />
</context>
<context name= "server_loop_code" attribute= "Normal Text" lineEndContext= "#stay" >
<DetectChar attribute= "Region Marker" context= "#pop#pop#pop" char= "}" endRegion= "loop_block" />
<IncludeRules context= "server_definition" />
</context>
<!-- shell keyword, one - line version -->
<context name= "shell_instruction" attribute= "Normal Text" lineEndContext= "#stay" >
<DetectChar attribute= "Region Marker" context= "shell_code" char= "{" beginRegion= "shell_block" />
<IncludeRules context= "quoted-strings" />
<IncludeRules context= "comments" />
</context>
<context name= "shell_code" attribute= "Normal Text" lineEndContext= "#stay" >
<DetectChar attribute= "Region Marker" context= "#pop#pop" char= "}" endRegion= "shell_block" />
<!-- There does not seem to be a syntax highlighting dedicated to "standard shell" so let's use Bash instead -->
<IncludeRules context= "##Bash" />
</context>
<!-- Define keywords from other tools: variables and operators from the VCL language, varnishstat metrics -->
<context name= "vcl_variables" attribute= "Normal Text" lineEndContext= "#stay" >
<RegExpr attribute= "Variable" context= "#stay" String= "now" />
<RegExpr attribute= "Storage" context= "#stay" String= "storage\.[a-zA-Z0-9]+(?:\.(?:free_space|used_space|happy))?" />
<RegExpr attribute= "TCP Property" context= "#stay" String= "client\.(ip|identity)" />
<RegExpr attribute= "TCP Property" context= "#stay" String= "server\.(ip|hostname|identity|port)" />
<RegExpr attribute= "HTTP Property" context= "#stay" String= "req\.(request|url|proto|backend|restarts|esi_level|ttl|grace|keep|xid|esi|can_gzip|backend\.healthy|hash_ignore_busy|hash_always_miss)" />
<RegExpr attribute= "HTTP Property" context= "#stay" String= "bereq\.(request|url|proto|connect_timeout|first_byte_timeout|between_bytes_timeout)" />
<RegExpr attribute= "HTTP Property" context= "#stay" String= "obj\.(proto|status|response|hits|ttl|grace|keep|lastuse)" />
<RegExpr attribute= "HTTP Property" context= "#stay" String= "beresp\.(proto|saintmode|status|response|do_esi|do_stream|do_gzip|do_gunzip|ttl|grace|keep|backend\.(name|ip|port)|storage|cacheable)" />
<RegExpr attribute= "HTTP Property" context= "#stay" String= "resp\.(proto|status|response)" />
<RegExpr attribute= "HTTP X- Header" context= "#stay" String= "(req|bereq|resp|beresp|obj)\.http\.X-[-_A-Za-z0-9]*" />
<RegExpr attribute= "HTTP Header" context= "#stay" String= "(req|bereq|resp|beresp|obj)\.http\.[A-Za-z][-_A-Za-z0-9]*" />
</context>
<context name= "vcl_operators" attribute= "Operator" lineEndContext= "#stay" >
<DetectChar attribute= "Logical Operator" context= "#stay" char= "!" />
<Detect2Chars attribute= "Logical Operator" context= "#stay" char= "&" char1= "&" />
<Detect2Chars attribute= "Logical Operator" context= "#stay" char= "|" char1= "|" />
<Detect2Chars attribute= "Comparison Operator" context= "#stay" char= "=" char1= "=" />
<Detect2Chars attribute= "Comparison Operator" context= "#stay" char= "!" char1= "=" />
<Detect2Chars attribute= "Comparison Operator" context= "#stay" char= "<" char1= "=" />
<Detect2Chars attribute= "Comparison Operator" context= "#stay" char= ">" char1= "=" />
<DetectChar attribute= "Comparison Operator" context= "#stay" char= "<" />
<DetectChar attribute= "Comparison Operator" context= "#stay" char= ">" />
<DetectChar attribute= "Comparison Operator" context= "#stay" char= "~" />
<Detect2Chars attribute= "Comparison Operator" context= "#stay" char= "!" char1= "~" />
<DetectChar attribute= "Arithmetic Operator" context= "#stay" char= "+" />
<DetectChar attribute= "Arithmetic Operator" context= "#stay" char= "-" />
<DetectChar attribute= "Arithmetic Operator" context= "#stay" char= "*" />
<DetectChar attribute= "Arithmetic Operator" context= "#stay" char= "/" />
<Detect2Chars attribute= "Arithmetic Operator" context= "#stay" char= "+" char1= "=" />
<Detect2Chars attribute= "Arithmetic Operator" context= "#stay" char= "-" char1= "=" />
<Detect2Chars attribute= "Arithmetic Operator" context= "#stay" char= "*" char1= "=" />
<Detect2Chars attribute= "Arithmetic Operator" context= "#stay" char= "/" char1= "=" />
<Detect2Chars attribute= "Arithmetic Operator" context= "#stay" char= "+" char1= "+" />
<Detect2Chars attribute= "Arithmetic Operator" context= "#stay" char= "-" char1= "-" />
<Detect2Chars attribute= "Arithmetic Operator" context= "#stay" char= ">" char1= ">" />
<Detect2Chars attribute= "Arithmetic Operator" context= "#stay" char= "<" char1= "<" />
<DetectChar attribute= "Operator" context= "#stay" char= "=" />
</context>
<context name= "varnishstat_variables" attribute= "Normal Text" lineEndContext= "#stay" >
<RegExpr attribute= "VarnishStat metric" context= "#stay" String= "client_(?:conn|drop|req|drop_late)" />
<RegExpr attribute= "VarnishStat metric" context= "#stay" String= "cache_(?:hit(pass)?|miss)" />
<RegExpr attribute= "VarnishStat metric" context= "#stay" String= "backend_(?:conn|unhealthy|busy|fail|reuse|toolate|recycle|retry|req)" />
<RegExpr attribute= "VarnishStat metric" context= "#stay" String= "fetch_(?:head|length|chunked|eof|bad|close|oldhttp|zero|failed|1xx|204|304)" />
<RegExpr attribute= "VarnishStat metric" context= "#stay" String= "n_(?:sess_mem|sess|object|vampireobject|objectcore|objecthead|waitinglist|vbc|wrk|wrk_(?:create|failed|max|lqueue|queueddrop)|backend|expired|lru_nuked|lru_moved|obj(?:sendfile|write|overflow)|vcl|vcl_avail|vcl_discard|ban|ban_(?:gone|add|retire|obj_test|re_test|dups)|gzip|gunzip)" />
<RegExpr attribute= "VarnishStat metric" context= "#stay" String= "(?:losthdr|backend_req|accept_fail|uptime|vmods)" />
<RegExpr attribute= "VarnishStat metric" context= "#stay" String= "s_(?:sess|req|pipe|pass|fetch|hdrbytes|bodybytes)" />
<RegExpr attribute= "VarnishStat metric" context= "#stay" String= "sess_(?:closed|pipeline|readahead|linger|herd)" />
<RegExpr attribute= "VarnishStat metric" context= "#stay" String= "shm_(?:records|writes|flushes|cont|cycles)" />
<RegExpr attribute= "VarnishStat metric" context= "#stay" String= "sms_(?:nreq|nobj|nbytes|balloc|bfree)" />
<RegExpr attribute= "VarnishStat metric" context= "#stay" String= "hcb_(?:nolock|lock|insert)" />
<RegExpr attribute= "VarnishStat metric" context= "#stay" String= "esi_(?:errors|warnings)" />
<RegExpr attribute= "VarnishStat metric" context= "#stay" String= "dir_dns_(?:lookups|failed|hit|cache_full)" />
<RegExpr attribute= "VarnishStat metric" context= "#stay" String= "LCK\.(?:sm[spaf]|hsl|hcb|hcl|vcl|stat|sessmem|wstat|herder|wq|objhdr|exp|lru|cli|ban|vbp|vbe|backend)\.(?:creat|destroy|locks|colls)" />
<RegExpr attribute= "VarnishStat metric" context= "#stay" String= "SMA\.[a-zA-Z0-9_-]+\.(?:c_(?:req|fail|bytes|freed)|g_(?:alloc|bytes|space))" />
<RegExpr attribute= "VarnishStat metric" context= "#stay" String= "VBE\..+\.(?:happy|vcls)" />
</context>
</contexts>
<itemDatas >
<itemData name= "Normal Text" defStyleNum= "dsNormal" />
<itemData name= "Comment" defStyleNum= "dsComment" />
<itemData name= "Keyword" defStyleNum= "dsKeyword" />
<itemData name= "TxReq Keyword" defStyleNum= "dsKeyword" color= "#008000" bold= "0" />
<itemData name= "TxResp Keyword" defStyleNum= "dsKeyword" color= "#008000" bold= "0" />
<itemData name= "RxResp Keyword" defStyleNum= "dsKeyword" color= "#008000" bold= "0" />
<itemData name= "Action Keyword" defStyleNum= "dsKeyword" />
<itemData name= "Operator" defStyleNum= "dsKeyword" color= "#008000" bold= "0" />
<itemData name= "Comparison Operator" defStyleNum= "dsKeyword" color= "#008000" bold= "0" />
<itemData name= "Arithmetic Operator" defStyleNum= "dsKeyword" color= "#008000" bold= "0" />
<itemData name= "Logical Operator" defStyleNum= "dsKeyword" color= "#008000" bold= "0" />
<itemData name= "String" defStyleNum= "dsString" bold= "0" italic= "0" />
<itemData name= "Region Marker" defStyleNum= "dsNormal" />
<itemData name= "Storage" defStyleNum= "dsDataType" color= "#0000FF" selColor= "#0000FF" bold= "0" italic= "0" />
<itemData name= "TCP Property" defStyleNum= "dsDataType" color= "#0000FF" selColor= "#0000FF" bold= "0" italic= "1" />
<itemData name= "HTTP Property" defStyleNum= "dsDataType" color= "#0000FF" selColor= "#0000FF" bold= "0" italic= "0" />
<itemData name= "HTTP Header" defStyleNum= "dsDataType" color= "#0D62FF" selColor= "#0D62FF" bold= "0" italic= "0" />
<itemData name= "HTTP X- Header" defStyleNum= "dsDataType" color= "#0D62FF" selColor= "#0D62FF" bold= "0" italic= "1" />
<itemData name= "HTTP announce" defStyleNum= "dsDataType" color= "#562579" selColor= "#562579" bold= "1" />
<itemData name= "HTTP method" defStyleNum= "dsDataType" color= "#562579" selColor= "#562579" bold= "1" />
<itemData name= "HTTP WebDAV method" defStyleNum= "dsDataType" color= "#562579" selColor= "#562579" bold= "1" />
<itemData name= "HTTP custom method" defStyleNum= "dsDataType" color= "#562579" selColor= "#562579" bold= "1" />
<itemData name= "VarnishStat metric" defStyleNum= "dsDataType" color= "#0000FF" selColor= "#0000FF" bold= "0" italic= "0" />
<itemData name= "Decimal" defStyleNum= "dsDecVal" />
<itemData name= "Float" defStyleNum= "dsFloat" spellChecking= "false" />
<itemData name= "Client Identifier" defStyleNum= "dsDataType" color= "#0D62FF" selColor= "#0D62FF" bold= "0" underline= "1" />
<itemData name= "Server Identifier" defStyleNum= "dsDataType" color= "#0D62FF" selColor= "#0D62FF" bold= "0" underline= "1" />
<itemData name= "Varnish Identifier" defStyleNum= "dsDataType" color= "#0D62FF" selColor= "#0D62FF" bold= "0" underline= "1" />
<itemData name= "Sema Identifier" defStyleNum= "dsDataType" color= "#0D62FF" selColor= "#0D62FF" bold= "0" underline= "1" />
</itemDatas>
</highlighting>
<general >
<comments >
<comment name= "singleLine" start= "#" />
</comments>
<keywords casesensitive= "1" />
</general>
</language>