3. メッセージ

 本プロトコルのメッセージは、クライアントのリクエストとサーバのレスポンスからなっている。
        This-protocol-message   =       Request 
                                      | Response        

        Request                 =       Request-Line     ; 3.2節参照
                                        [Request-Header] ; 3.4節参照
                                        Object-Header    ; 3.4節参照
                                        CRLF
                                        [ Object-Body ]  ; 3.5節参照

        Response                =       Status-Line      ; 3.3節参照
                                        [Response-Header]; 3.4節参照
                                        Object-Header    ; 3.4節参照
                                        CRLF
                                        [ Object-Body ]  ; 3.5節参照

3.1 コード

3.1.1 メッセージ転送コード

 クライアントとサーバ間で転送されるのはOCTETs である。

3.1.2 記述コード

 リクエストライン(Request-Line)、リクエストヘッダ(Request-Header)、ステータスライン(Status-Line)、レスポンスヘッダ(Response-Header)、オブジェクトヘッダ(Object-Header)の記述コードはASCIIを使用する。 オブジェクトボディの記述コードはオブジェクトヘッダ中のEncodingフィールド(3.4.3参照)による。

3.2 Request-Line

 リクエストラインは、メソッドトークンではじまり、ハンドル、フレームとプロトコールのバージョン、リクエストコード、リクエストフレーズが続き、CRLFで終わる。各要素は、スペースで区切られる。最後のCRLF以外には、CRやLFを挿入してはならない。
        Request-Line    =   Method SP Handle SP Frame SP CATP-Version SP 
                            Request-Code SP Request-Phrase CRLF

 (1) Method

 メソッドはサーバへのリクエストを示すトークンである。メソッドは、大文字、小文字を区別し、拡張が可能である。
メソッドの詳細については、4章を参照。

        Method  =       "GETHANDLE" | "RELEASEHANDLE" | "RELEASEFRAME" |
                        "SEARCH" | "RETRIEVE" | "SCAN" | "INDEXLIST" | 
                        "INSERT" | "UPDATE" | "DELETE" | 
                        "SERVERPROCEDURECALL" | extension-method

 (2) Handle

 ハンドルはサーバがクライアントを特定するためのキーとなるエレメントである。ハンドルは"GETHANDLE"メソッドを用いたリクエスト(GETHANDLEリクエストと呼ぶ)によりサーバから取得することができる。クライアントはハンドル確保後RELEASEHANDLEリクエストによりハンドルが解放されるまでハンドルの内容を変更してはならない。尚、ハンドルは一つのクライアントに対し複数生成することも可能である(GETHANDLEリクエストを複数発行可能である

        Handle  =       10CHAR

 (3) Frame

 フレームは同一のハンドルに対するリクエストに対し、サーバが生成する情報を識別するものである。ハンドルがクライアントで変更してはならないのに対し、フレームはクライアントで変更可能である。この場合、サーバは変更前のフレームとは別のフレームとして取り扱うべきである。

        Frame   =       3DIGIT  

 (4) CATP-Version

 CATPバージョンは、リクエストで用いられるCATPのバージョンを示す。本プロトコルのCATPバージョンは、"CATP/1.0"を用いる。

        CATP-Version    =       "CATP" "/" 1*DIGIT "." 1*DIGIT

 (5) Request-Code

 リクエストコードは、リクエストを表すコードである数字3桁の0を指定する。

        Request-Code    =       "000"   ; 数字3桁の0

 (6) Request-Phrase

 リクエストの説明句として、下記のトークンを指定する。

        Request-Phrase  =       "REQUEST"       

3.3 Status-Line

 ステータスラインは、メソッドトークンではじまり、ハンドル、フレーム、プロトコールバージョンとそれに続く、数字のステータスコードとそれに関連した言葉からなっており、それぞれの要素はスペースで区切られている。最後のCRLF以外には、CRやLFを挿入してはならない。

        Status-Line     =       Method SP Handle SP Frame SP CATP-Version SP 
                                Status-Code SP Reason-Phrase CRLF

 (1) Method

 メソッドはクライアントがリクエストラインに指定したメソッドと同じである(3.2 (1)参照)。

 (2) Handle

 ハンドルはステータスラインがGETHANDLEリクエストに対すものである場合、サーバで割り当てたハンドルを意味する。また、GETHANDLE以外のリクエストの場合はクライアントがリクエストラインに指定したハンドルと同じである。このフィールドのフォーマットは、リクエストラインのそれと同じである(3.2 (2)参照)。

 (3) Frame

 フレームはステータスラインがGETHANDLEリクエストに対すものである場合、サーバで割り当てたフレームを意味する。また、GETHANDLE以外のリクエストの場合は、クライアントがリクエストラインに指定したフレームと同じである。このフィールドのフォーマットは、リクエストラインのそれと同じである(3.2 (3)参照)。

 (4) CATP-Version

  CATPバージョンは、サーバで使用されるプロトコールのバージョンを指定する。このフィールドのフォーマットは、リクエストラインのそれと同じである(3.2 (4)参照)。クライアントがリクエストラインで指定したCATPバージョンが、サーバがサポートしているバージョンよりも古い場合、サーバはそのバージョンをサポートしていることが望まれる。その場合クライアント指定のCATPバージョンをステータスラインに指定する。

 (5) Status-Code

 ステータスコードは、サーバがリクエストを理解し、それに答えようとした試みに対する結果を示す3桁の整数のコードである。

        Status-Code     =       3DIGIT

 ステータスコードの最初の桁は、CATPのレスポンスのクラスを定義している。最後の2つの桁は、コードをカテゴリー化する役割は持たない。最初の桁には、下記の5つの値が存在する。

        ・ 1xx   : 未定義       (将来の使用のために予約)
        ・ 2xx   : 成功        リクエストされたアクションは適切に受理され処理された。
        ・ 3xx   : 警告成功      リクエストされたアクションは適切に受理され警告を伴って処理された。
                           クライアント(ユーザ)にて適切に対処する必要がある。
        ・ 4xx   : クライアントエラー リクエストに間違った構文があるか、または実行がもともと不可能である。
        ・ 5xx   : サーバエラー    サーバはリクエストを遂行できなかった。

 尚、下2桁の詳細はサーバの実装に依存する。

 (6) Reason-Phrase

 説明句は、ステータスコードへの短い説明を与えること意図したものである。ステータスコードは、コンピュータによる使用、説明句は人間による使用を意図して作成された。クライアントは、説明句の理由を解釈する必要はないし、それをユーザへ示さなくてもよい。

        Reason-Phrase   =       text

3.4 Header

 ヘッダは一つ以上のフィールドから構成される。

        Header  =       1*Field
        Field   =       Tag ":" Value CRLF
        Tag     =       token
        Value   =       text

3.4.1 Request-Header

        Request-Header  =       Header

 詳細は4章の各リクエストのリクエストヘッダを参照。

3.4.2 Response-Header

        Response-Header =       Header

 詳細は4章の各レスポンスのレスポンスヘッダを参照。

3.4.3 Object-Header

 オブジェクトヘッダはオブジェクトボディ(Object- Body)の情報を記述するヘッダである。

        Object-Header   =       Header
        Object-Header   =       Content-Length
                                [Encoding]

 (1) Content-Length

 コンテントレングスはオブジェクトボディのサイズをオクテット単位で指定する。

        Content-Length  =       "Content-Length" ":" 1*DIGIT CRLF       ; 単位オクテット

 (2) Encoding

 エンコーディングはオブジェクトボディのエンコーディング方式を指定する。

        Encoding        =        "Encoding" ":" ( "JIS7" | "ISO2022JP" | "GB" | "UTF8" | "UTF8E" | "GBK" )

 ただし、本プロトコルバージョンではJIS7 のみをサポートする。

3.5 Object-Body

 オブジェクトボディには単一レコードと複数レコードがある。オブジェクトボディの詳細は4章の各リクエスト/レスポンスを参照。

        Object-Body     =       Record | Multi-record

 (1) Record

 単一のレコードを意味する。Recordの形式は各リクエスト並びにレスポンスにより異なる。

 (2) Multi-record

 複数のレコードを意味する。Multi-recordは各Recordをレコードデリミタで区切って使用する。

        Multi-record            =       1*(Record-delimiter Record) Close-delimiter
        Record-delimiter        =       "--" boundary CRLF
        Close-delimiter         =       "--" boundary "--" CRLF
        boundary                =       0*69( bchar | SP ) bchar        ; boundaryはMulti-record内で同一とする
        bchar                   =       DIGIT | ALPHA | "'" | "(" | ")" | "+"
                                        | "_" | "," | "-" | "." | "/" | ":" | "=" | "?"

 Recordの形式は各リクエスト並びにレスポンスにより異なる。

 (3) 診断メッセージ

 サーバが必要に応じて返送する診断メッセージは、オブジェクトボディに単一レコードとして設定される。

        Diagnostic-record       =       Record
        Record                  =       1*Message
        Message                 =       text CRLF