Merge branch 'master' of git://factorcode.org/git/factor
[factor/jcg.git] / basis / io / servers / connection / connection-docs.factor
blob67c7cb13dda8a8d2075038828af63ff6ee46dbc3
1 IN: io.servers.connection
2 USING: help help.syntax help.markup io io.sockets
3 io.sockets.secure concurrency.semaphores calendar classes math ;
5 ARTICLE: "server-config" "Threaded server configuration"
6 "The " { $link threaded-server } " tuple has a variety of slots which can be set before starting the server with " { $link start-server } " or " { $link start-server* } "."
7 { $subsection "server-config-logging" }
8 { $subsection "server-config-listen" }
9 { $subsection "server-config-limit" }
10 { $subsection "server-config-stream" }
11 { $subsection "server-config-handler" } ;
13 ARTICLE: "server-config-logging" "Logging connections"
14 "The " { $snippet "name" } " slot of a threaded server instance should be set to a string naming the logging service name to use. See " { $link "logging" } " for details." ;
16 ARTICLE: "server-config-listen" "Setting ports to listen on"
17 "The " { $snippet "insecure" } " slot of a threaded server instance contains an integer, an address specifier, or a sequence of address specifiers. Integer port numbers are interpreted as an " { $link inet4 } "/" { $link inet6 } " pair listening on all interfaces for given port number. All other address specifiers are interpeted as per " { $link "network-addressing" } "."
18 $nl
19 "The " { $snippet "secure" } " slot of a threaded server instance is interpreted in the same manner as the " { $snippet "insecure" } " slot, except that secure encrypted connections are then allowed. If this slot is set, the " { $snippet "secure-config" } " slot should also be set to a " { $link secure-config } " instance containing SSL server configuration. See " { $link "ssl-config" } " for details."
20 $nl
21 "Two utility words for producing address specifiers:"
22 { $subsection local-server }
23 { $subsection internet-server } ;
25 ARTICLE: "server-config-limit" "Limiting connections"
26 "The " { $snippet "max-connections" } " slot is initially set to " { $link f } ", which disables connection limiting, but can be set to an integer specifying the maximum number of simultaneous connections."
27 $nl
28 "Another method to limit connections is to set the " { $snippet "semaphore" } " slot to a " { $link semaphore } ". The server will hold the semaphore while servicing the client connection."
29 $nl
30 "Setting the " { $snippet "max-connections" } " slot is equivalent to storing a semaphore with this initial count in the " { $snippet "semaphore" } " slot. The " { $snippet "semaphore" } " slot is useful for enforcing a maximum connection count shared between multiple threaded servers. See " { $link "concurrency.semaphores" } " for details." ;
32 ARTICLE: "server-config-stream" "Client stream parameters"
33 "The " { $snippet "encoding" } " and " { $snippet "timeout" } " slots of the threaded server can be set to an encoding descriptor or a " { $link duration } ", respectively. See " { $link "io.encodings" } " and " { $link "io.timeouts" } " for details." ;
35 ARTICLE: "server-config-handler" "Client handler quotation"
36 "The " { $snippet "handler" } " slot of a threaded server instance should be set to a quotation which handles client connections. Client handlers are run in their own thread, with the following variables rebound:"
37 { $list
38     { $link input-stream }
39     { $link output-stream }
40     { $link local-address }
41     { $link remote-address }
42     { $link threaded-server }
44 "An alternate way to implement client handlers is to subclass " { $link threaded-server } ", and define a method on " { $link handle-client* } "."
45 $nl
46 "The two methods are equivalent, representing a functional versus an object-oriented approach to the problem." ;
48 ARTICLE: "server-examples" "Threaded server examples"
49 "The " { $vocab-link "time-server" } " vocabulary implements a simple threaded server which sends the current time to the client. The " { $vocab-link "concurrency.distributed" } ", " { $vocab-link "ftp.server" } ", and " { $vocab-link "http.server" } " vocabularies demonstrate more complex usage of the threaded server library." ;
51 ARTICLE: "io.servers.connection" "Threaded servers"
52 "The " { $vocab-link "io.servers.connection" } " vocabulary implements a generic server abstraction for " { $link "network-connection" } ". A set of threads listen for connections, and additional threads are spawned for each client connection. In addition to this basic functionality, it provides some advanced features such as logging, connection limits and secure socket support."
53 { $subsection "server-examples" }
54 "Creating threaded servers with client handler quotations:"
55 { $subsection <threaded-server> }
56 "Client handlers can also be implemented by subclassing a threaded server; see " { $link "server-config-handler" } " for details:"
57 { $subsection threaded-server }
58 { $subsection new-threaded-server }
59 { $subsection handle-client* }
60 "The server must be configured before it can be started." 
61 { $subsection "server-config" }
62 "Starting the server:"
63 { $subsection start-server }
64 { $subsection start-server* }
65 { $subsection wait-for-server }
66 "Stopping the server:"
67 { $subsection stop-server }
68 "From within the dynamic scope of a client handler, several words can be used to interact with the threaded server:"
69 { $subsection stop-this-server }
70 { $subsection secure-port }
71 { $subsection insecure-port }
72 "Additionally, the " { $link local-address } " and "
73 { $subsection remote-address } " variables are set, as in " { $link with-client } "." ;
75 ABOUT: "io.servers.connection"
77 HELP: threaded-server
78 { $var-description "In client handlers, stores the current threaded server instance." }
79 { $class-description "The class of threaded servers. New instances are created with " { $link <threaded-server> } ". This class may be subclassed, and instances of subclasses should be created with " { $link new-threaded-server } ". See " { $link "server-config" } " for slot documentation." } ;
81 HELP: new-threaded-server
82 { $values { "class" class } { "threaded-server" threaded-server } }
83 { $description "Creates a new instance of a subclass of " { $link threaded-server } ". Subclasses can implement the " { $link handle-client* } " generic word." } ;
85 HELP: <threaded-server>
86 { $values { "threaded-server" threaded-server } }
87 { $description "Creates a new threaded server. Its slots should be filled in as per " { $link "server-config" } ", before " { $link start-server } " is called to begin waiting for connections." } ;
89 HELP: remote-address
90 { $var-description "Variable holding the address specifier of the current client connection. See " { $link "network-addressing" } "." } ;
92 HELP: handle-client*
93 { $values { "threaded-server" threaded-server } }
94 { $contract "Handles a client connection. Default implementation calls quotation stored in the " { $snippet "handler" } " slot of the threaded server." } ;
96 HELP: start-server
97 { $values { "threaded-server" threaded-server } }
98 { $description "Starts a threaded server." }
99 { $notes "Use " { $link stop-server } " or " { $link stop-this-server } " to stop the server." } ;
101 HELP: wait-for-server
102 { $values { "threaded-server" threaded-server } }
103 { $description "Waits for a threaded server to begin accepting connections." } ;
105 HELP: start-server*
106 { $values { "threaded-server" threaded-server } }
107 { $description "Starts a threaded server, returning as soon as it is ready to begin accepting connections." } ;
109 HELP: stop-server
110 { $values { "threaded-server" threaded-server } }
111 { $description "Stops a threaded server, preventing it from accepting any more connections and returning to the caller of " { $link start-server } ". All client connections which have already been opened continue to be serviced." } ;
113 HELP: stop-this-server
114 { $description "Stops the current threaded server, preventing it from accepting any more connections and returning to the caller of " { $link start-server } ". All client connections which have already been opened continue to be serviced." } ;
116 HELP: secure-port
117 { $values { "n" { $maybe integer } } }
118 { $description "Outputs the port number on which the current threaded server accepts secure socket connections. Outputs " { $link f } " if the current threaded server does not accept secure socket connections." }
119 { $notes "Can only be used from the dynamic scope of a " { $link handle-client* } " call." } ;
121 HELP: insecure-port
122 { $values { "n" { $maybe integer } } }
123 { $description "Outputs the port number on which the current threaded server accepts ordinary socket connections. Outputs " { $link f } " if the current threaded server does not accept ordinary socket connections." }
124 { $notes "Can only be used from the dynamic scope of a " { $link handle-client* } " call." } ;