]>
Commit | Line | Data |
---|---|---|
f67539c2 TL |
1 | /* |
2 | * Licensed to the Apache Software Foundation (ASF) under one | |
3 | * or more contributor license agreements. See the NOTICE file | |
4 | * distributed with this work for additional information | |
5 | * regarding copyright ownership. The ASF licenses this file | |
6 | * to you under the Apache License, Version 2.0 (the | |
7 | * "License"); you may not use this file except in compliance | |
8 | * with the License. You may obtain a copy of the License at | |
9 | * | |
10 | * http://www.apache.org/licenses/LICENSE-2.0 | |
11 | * | |
12 | * Unless required by applicable law or agreed to in writing, | |
13 | * software distributed under the License is distributed on an | |
14 | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
15 | * KIND, either express or implied. See the License for the | |
16 | * specific language governing permissions and limitations | |
17 | * under the License. | |
18 | */ | |
19 | module thrift.server.transport.base; | |
20 | ||
21 | import thrift.base; | |
22 | import thrift.transport.base; | |
23 | import thrift.util.cancellation; | |
24 | ||
25 | /** | |
26 | * Some kind of I/O device enabling servers to listen for incoming client | |
27 | * connections and communicate with them via a TTransport interface. | |
28 | */ | |
29 | interface TServerTransport { | |
30 | /** | |
31 | * Starts listening for server connections. | |
32 | * | |
33 | * Just as simliar functions commonly found in socket libraries, this | |
34 | * function does not block. | |
35 | * | |
36 | * If the socket is already listening, nothing happens. | |
37 | * | |
38 | * Throws: TServerTransportException if listening failed or the transport | |
39 | * was already listening. | |
40 | */ | |
41 | void listen(); | |
42 | ||
43 | /** | |
44 | * Closes the server transport, causing it to stop listening. | |
45 | * | |
46 | * Throws: TServerTransportException if the transport was not listening. | |
47 | */ | |
48 | void close(); | |
49 | ||
50 | /** | |
51 | * Returns whether the server transport is currently listening. | |
52 | */ | |
53 | bool isListening() @property; | |
54 | ||
55 | /** | |
56 | * Accepts a client connection and returns an opened TTransport for it, | |
57 | * never returning null. | |
58 | * | |
59 | * Blocks until a client connection is available. | |
60 | * | |
61 | * Params: | |
62 | * cancellation = If triggered, requests the call to stop blocking and | |
63 | * return with a TCancelledException. Implementations are free to | |
64 | * ignore this if they cannot provide a reasonable. | |
65 | * | |
66 | * Throws: TServerTransportException if accepting failed, | |
67 | * TCancelledException if it was cancelled. | |
68 | */ | |
69 | TTransport accept(TCancellation cancellation = null) out (result) { | |
70 | assert(result !is null); | |
71 | } | |
72 | } | |
73 | ||
74 | /** | |
75 | * Server transport exception. | |
76 | */ | |
77 | class TServerTransportException : TException { | |
78 | /** | |
79 | * Error codes for the various types of exceptions. | |
80 | */ | |
81 | enum Type { | |
82 | /// | |
83 | UNKNOWN, | |
84 | ||
85 | /// The server socket is not listening, but excepted to be. | |
86 | NOT_LISTENING, | |
87 | ||
88 | /// The server socket is already listening, but expected not to be. | |
89 | ALREADY_LISTENING, | |
90 | ||
91 | /// An operation on the primary underlying resource, e.g. a socket used | |
92 | /// for accepting connections, failed. | |
93 | RESOURCE_FAILED | |
94 | } | |
95 | ||
96 | /// | |
97 | this(Type type, string file = __FILE__, size_t line = __LINE__, Throwable next = null) { | |
98 | this(errorMsg(type), type, file, line, next); | |
99 | } | |
100 | ||
101 | /// | |
102 | this(string msg, string file = __FILE__, size_t line = __LINE__, | |
103 | Throwable next = null) | |
104 | { | |
105 | this(msg, Type.UNKNOWN, file, line, next); | |
106 | } | |
107 | ||
108 | /// | |
109 | this(string msg, Type type, string file = __FILE__, size_t line = __LINE__, | |
110 | Throwable next = null) | |
111 | { | |
112 | super(msg, file, line, next); | |
113 | type_ = type; | |
114 | } | |
115 | ||
116 | /// | |
117 | Type type() const nothrow @property { | |
118 | return type_; | |
119 | } | |
120 | ||
121 | protected: | |
122 | Type type_; | |
123 | ||
124 | private: | |
125 | string errorMsg(Type type) { | |
126 | string msg = "TTransportException: "; | |
127 | switch (type) { | |
128 | case Type.UNKNOWN: msg ~= "Unknown server transport exception"; break; | |
129 | case Type.NOT_LISTENING: msg ~= "Server transport not listening"; break; | |
130 | case Type.ALREADY_LISTENING: msg ~= "Server transport already listening"; break; | |
131 | case Type.RESOURCE_FAILED: msg ~= "An underlying resource failed"; break; | |
132 | default: msg ~= "(Invalid exception type)"; break; | |
133 | } | |
134 | return msg; | |
135 | } | |
136 | } | |
137 |