PHP/Java Bridge protocol version 4.2.2 Requests are marked with "->", responses with "<-". The server continues to process requests until EOF. Only the first character is significant. The communication must begin with [C]reateInstance or [I]nvoke. The server responds with a single ARG which also carries the last request context ID. The request context ID is your request context, for example the location of a cell where the response should be stored; a structure or something like that. In PHP for example we allocate a pval and pass it as the ID to the Invoke or Create request. When the response arrives, we receive our ID along with the result so we know exactly where to store the result. Context ID's are optional and can be switched off, if the client can keep track of the context, see NOTES below. Example: $o = new java("java.lang.Long", 6); $o->toString(); // discard result -> <- -> <- -> -> A second example which shows how to avoid round-trips. $o = new java("java.lang.Long", 6); $o->toString(); // discard result -> -> # result from CreateInstance Optional requests: All aquired [O]bject handles may be destroyed by invoking U (destroy). However, the server tracks all handles and automatically destroys them after EOF. It is an error to further reference destroyed handles. If [F]inish is called, the server closes or recycles the connection and responds with F p=A, if the connection has been recycled, p=E otherwise. Instead of sending and waiting for the response, it is also possible to simply close the connection. Main requests: -> CreateInstance: ...ARGS... v: string p: char (Reference[C]lass, Create[I]nstance) i: unsigned long -> Invoke: ...ARGS... v: unsigned long m: string p: char (examine[P]roperty, [I]nvoke method) When v=0, the call is directed to the current request-handling instance of the java bridge. -> ReferenceClass (alternate form) ...ARGS... p: char v: string Predicate 2 does not write a result, but stores a result proxy under ++CID. Predicate 3 does not write a result and does not create a result proxy. -> CreateInstance (alternate form) ...ARGS... p: char v: string Predicate 2 does not write a result, but stores a result proxy under ++CID. Predicate 3 does not write a result and does not create a result proxy. -> PropertyAccess (alternate form) ...ARGS... p: char v: unsigned long m: string Predicate 2 does not write a result, but stores a result proxy under ++CID. Predicate 3 does not write a result and does not create a result proxy. -> Invoke (alternate form) ...ARGS... p: char (examine[P]roperty, [I]nvoke method) v: unsigned long m: string Predicate 2 does not write a result, but stores a result proxy under ++CID. Predicate 3 does not write a result and does not create a result proxy. When v=0, the call is directed to the current request-handling instance of the java bridge. ARGS or response: <-> String: v: string <-> Boolean: v: char ([T]rue, [F]alse) -> Boolean:(alternate form) v: char [1]: true, everything else: false <-> Long: v: unsigned long p: char (p[O]sitive, neg[A]tive) -> Long: (alternate form) v: long (signed number) <-> Double: v: double -> Object: v: unsigned long NULL values can be sent as either v="" or v="0" <- Object: v: unsigned long m: string p: char ([A]rray/Map, [C]ollection, [O]bject, [E]xception) n: char result can be cached (T) or not (F) <- Null: <- Void: n: char result can be cached (T) or not (F) <- Apply: ...PAIRS... v: unsigned long p: string m: string n: unsigned long Result can be used to send back the result of the current apply call. If v is null, the function name p must be searched in the "current" environment. -> Result: ...ARG... <-> Exception: v: unsigned long m: string -> (or <->, see below) Composite: ...PAIRS... t: char ([A]rray, [H]ashtable) -> (or <->, see below) Pair:

...ARG...

t: char (key is [N]umeric, [S]tring or doesn't exist (if X=A)) v: unsigned long (if X=H and t=N) v: string (if X=H and t=S) OPTIONAL requests: -> Destroy: v: unsigned long <-> EndConnection: p: char (Keep [A]live, [E]nd connection) NOTES: If the first byte is 0177, the following byte has a special meaning: Bit 1 0 ------- keep object keep array, binary comment/php identity Map, Coll. data impl. (pure identity PHP or C) - - no no base64 encoded default 0 0 yes yes binary PHP 0 1 no yes binary PHP 1 0 no yes base64 encoded PHP 1 1 yes yes base64 encoded PHP Bit 2,3,4: log level (from java.log_level) Bit 5: always 0 Bit 6: set to 1 if bit[0,1] are used Bit 7: set to 1 if bit[2,4] are used It is possible to send the header even though the connection has already been established. The bridge will ignore the header if the second byte is not 0xFF. This is convenient as some clients don't know if they use a fresh or a recycled connection. Otherwise the back end interprets the following two bytes (low/high) as the length of the following context string. The client may initiate such a context switch if it has received a context ID belonging to a different ContextServer from a client (e.g.: PhpCGIServlet) while keeping a persistent connection to a ContextRunner. It is possible to "ping" the server by sending it the byte 0x0. If alive it will send back a 0x0.