X-Git-Url: http://sru.miketaylor.org.uk/?a=blobdiff_plain;f=doc%2Fproxy.xml;h=90529f05ada41710c798c1037af2ed5e575ea69e;hb=9934354454c64545d7e2619259782fbf50445fa2;hp=d0250cd467112b5797e35dccd394e118acc0ba62;hpb=2ad40f2e15a4d6927833231b8dc6874b747fed2e;p=yazpp-moved-to-github.git
diff --git a/doc/proxy.xml b/doc/proxy.xml
index d0250cd..90529f0 100644
--- a/doc/proxy.xml
+++ b/doc/proxy.xml
@@ -1,10 +1,259 @@
-
- YAZ Proxy
-
- About YAZ Proxy.
-
-
+
The YAZ Proxy
+
+ The YAZ proxy is a transparent Z39.50-to-Z39.50 gateway. That is,
+ it is a Z39.50 server which has as its back-end a Z39.50 client
+ that forwards requests on to another server (known as the
+ backend target.)
+
+
+ The YAZ Proxy is useful for debugging Z39.50 software, logging
+ APDUs, redirecting Z39.50 packages through firewalls, etc.
+ Furthermore, it offers facilities that often
+ boost performance for connectionless Z39.50 clients such
+ as web gateways.
+
+
+ Unlike most other server software, the proxy runs single-threaded,
+ single-process. Every I/O operation
+ is non-blocking so it is very lightweight and extremely fast.
+ It does not store any state information on the hard drive,
+ except any log files you ask for.
+
+
+
+ Example: Using the Proxy to Log APDUs
+
+ Suppose you use a commercial Z39.50 client for which you do not
+ have source code, and it's not behaving how you think it should
+ when running against some specific server that you have no control
+ over. One way to diagnose the problem is to find out what packets
+ (APDUs) are being sent and received, but not all client
+ applications have facilities to do APDU logging.
+
+
+ No problem. Run the proxy on a friendly machine, get it to log
+ APDUs, and point the errant client at the proxy instead of
+ directly at the server that's causing it problems.
+
+
+ Suppose the server is running on foo.bar.com,
+ port 18398. Run the proxy on the machine of your choice, say
+ your.company.com like this:
+
+
+ yaz-proxy -a - -t tcp:foo.bar.com:18398 tcp:@:9000
+
+
+ (The -a - option requests APDU logging on
+ standard output, -t tcp:foo.bar.com:18398
+ specifies where the backend target is, and
+ tcp:@:9000 tells the proxy to listen on port
+ 9000 and accept connections from any machine.)
+
+
+ Now change your client application's configuration so that instead
+ of connecting to foo.bar.com port 18398, it
+ connects to your.company.com port 9000, and
+ start it up. It will work exactly as usual, but all the packets
+ will be sent via the proxy, which will generate a log like this:
+
+
+ decode choice
+ initRequest {
+ referenceId OCTETSTRING(len=4) 69 6E 69 74
+ protocolVersion BITSTRING(len=1)
+ options BITSTRING(len=2)
+ preferredMessageSize 1048576
+ maximumRecordSize 1048576
+ implementationId 'Mike Taylor (id=169)'
+ implementationName 'Net::Z3950.pm (Perl)'
+ implementationVersion '0.31'
+ }
+ encode choice
+ initResponse {
+ referenceId OCTETSTRING(len=4) 69 6E 69 74
+ protocolVersion BITSTRING(len=1)
+ options BITSTRING(len=2)
+ preferredMessageSize 1048576
+ maximumRecordSize 1048576
+ result TRUE
+ implementationId '81'
+ implementationName 'GFS/YAZ / Zebra Information Server'
+ implementationVersion 'YAZ 1.9.1 / Zebra 1.3.3'
+ }
+ decode choice
+ searchRequest {
+ referenceId OCTETSTRING(len=1) 30
+ smallSetUpperBound 0
+ largeSetLowerBound 1
+ mediumSetPresentNumber 0
+ replaceIndicator TRUE
+ resultSetName 'default'
+ databaseNames {
+ 'gils'
+ }
+ {
+ smallSetElementSetNames choice
+ generic 'F'
+ }
+ {
+ mediumSetElementSetNames choice
+ generic 'B'
+ }
+ preferredRecordSyntax OID: 1 2 840 10003 5 10
+ {
+ query choice
+ type_1 {
+ attributeSetId OID: 1 2 840 10003 3 1
+ RPNStructure choice
+ {
+ simple choice
+ attributesPlusTerm {
+ attributes {
+ }
+ term choice
+ general OCTETSTRING(len=7) 6D 69 6E 65 72 61 6C
+ }
+ }
+ }
+ }
+ }
+
+
+
+
+ Specifying the Backend Target
+
+ When the proxy accepts a Z39.50 client session, it
+ determines the backend target by the following rules:
+
+
+ If the InitializeRequest PDU from the
+ client includes an
+ otherInfo
+ element with OID
+ 1.2.840.10003.10.1000.81.1, then the
+ contents of that element specify the target to be used, in the
+ usual YAZ address format (typically
+ tcp:hostname:port)
+ as described in
+ the Addresses section of the YAZ manual.
+
+
+
+ Otherwise, the Proxy uses the default target, if one was
+ specified on the command-line with the -t
+ option.
+
+
+
+ Otherwise, the proxy closes the connection with
+ the client.
+
+
+
+
+
+
+ Keep-alive Facility for Stateless Clients
+
+ Stateless clients such as web gateways may generate a cookie for a Z39.50
+ session which is sent to the proxy as part of PDUs.
+ In this case, the proxy will keep alive its Z39.50 session
+ to the backend target even when the connection from the client
+ to the proxy is closed. When the client contacts the
+ proxy again, and re-issues the same cookie, the proxy reuses the
+ Z39.50 connection with the backend target.
+
+
+ There is no
+ guarantee that the Z39.50 connection to the backend
+ target is kept forever: the proxy will shut it down after certain
+ idle time.
+ So in effect, the connection from the client's
+ point of view should be considered stateless, and the keep-alive
+ facility should be treated only as a performance booster.
+
+
+ Cookies may be passed in an
+ otherInfo
+ element with OID 1.2.840.10003.10.1000.81.2.
+
+
+
+
+ Query Caching
+
+ Simple stateless clients often send identical Z39.50 searches
+ in a relatively short period of time (e.g. in order to produce a
+ results-list page, the next page,
+ a single full-record, etc). And for many targets, it's
+ much more expensive to produce a new result set than to
+ reuse an existing one.
+
+
+ The proxy tries to solve that by remembering the last query for each
+ backend target, so that if an identical query is received next, it
+ is turned into Present Requests rather than new Search Requests.
+
+
+
+ In a future we release will will probably allows for
+ an arbitrary-sized cache for targets supporting named result sets.
+
+
+
+ You can enable/disable query caching using option -o.
+
+
+
+
+ Other Optimizations
+
+ We've had some plans to support caching of result set records,
+ but this has not yet been implemented.
+
+
+
+
+ Proxy Usage
+
+
+
+ &yaz-proxy-ref;
+
+
+ OtherInformation Encoding
+
+ The proxy uses the OtherInformation definition to carry
+ information about the target address and cookie.
+
+
+ OtherInformation ::= [201] IMPLICIT SEQUENCE OF SEQUENCE{
+ category [1] IMPLICIT InfoCategory OPTIONAL,
+ information CHOICE{
+ characterInfo [2] IMPLICIT InternationalString,
+ binaryInfo [3] IMPLICIT OCTET STRING,
+ externallyDefinedInfo [4] IMPLICIT EXTERNAL,
+ oid [5] IMPLICIT OBJECT IDENTIFIER}}
+--
+ InfoCategory ::= SEQUENCE{
+ categoryTypeId [1] IMPLICIT OBJECT IDENTIFIER OPTIONAL,
+ categoryValue [2] IMPLICIT INTEGER}
+
+
+ The categoryTypeId is either
+ OID 1.2.840.10003.10.1000.81.1, 1.2.840.10003.10.1000.81.2
+ for proxy target and proxy cookie respectively. The
+ integer element category is set to 0.
+ The value proxy and cookie is stored in element
+ characterInfo of the information
+ choice.
+
+
+