README.md
1Thrift C++ Software Library
2
3# License
4
5Licensed to the Apache Software Foundation (ASF) under one
6or more contributor license agreements. See the NOTICE file
7distributed with this work for additional information
8regarding copyright ownership. The ASF licenses this file
9to you under the Apache License, Version 2.0 (the
10"License"); you may not use this file except in compliance
11with the License. You may obtain a copy of the License at
12
13 http://www.apache.org/licenses/LICENSE-2.0
14
15Unless required by applicable law or agreed to in writing,
16software distributed under the License is distributed on an
17"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
18KIND, either express or implied. See the License for the
19specific language governing permissions and limitations
20under the License.
21
22# Using Thrift with C++
23
24The Thrift C++ libraries are built using the GNU tools. Follow the instructions
25in the top-level README.md
26
27In case you do not want to open another README.md file, do this thrift src:
28
29 ./bootstrap.sh
30 ./configure (--with-boost=/usr/local)
31 make
32 sudo make install
33
34Thrift is divided into two libraries.
35
36* libthrift - The core Thrift library contains all the core Thrift code. This requires
37 openssl, pthreads, and librt.
38
39* libthriftnb - This library contains the Thrift nonblocking server, which uses libevent.
40 To link this library you will also need to link libevent.
41
42## Linking Against Thrift
43
44After you build and install Thrift the libraries are installed to
45/usr/local/lib by default. Make sure this is in your LDPATH.
46
47On Linux, the best way to do this is to ensure that /usr/local/lib is in
48your /etc/ld.so.conf and then run /sbin/ldconfig.
49
50Depending upon whether you are linking dynamically or statically and how
51your build environment it set up, you may need to include additional
52libraries when linking against thrift, such as librt and/or libpthread. If
53you are using libthriftnb you will also need libevent.
54
55## Dependencies
56
57C++11 is required at a minimum. C++03/C++98 are not supported after version 0.12.0.
58
59Boost is required to run the C++ unit tests. It is not necessary to link against
60the runtime library.
61
62libevent (for libthriftnb only) - most linux distributions have dev packages for this:
63http://monkey.org/~provos/libevent/
64
65# Using Thrift with C++ on Windows
66
67Both the autoconf and cmake build systems are able to automatically detect many
68system configurations without the need to specify library locations, however if
69you run into problems or want to redirect thrift to build and link against your
70own provided third party libraries:
71
72BOOST_ROOT : For boost, e.g. D:\boost_1_55_0
73OPENSSL_ROOT_DIR : For OpenSSL, e.g. D:\OpenSSL-Win32
74
75only required by libthriftnb:
76
77LIBEVENT_ROOT_DIR : For Libevent e.g. D:\libevent-2.0.21-stable
78
79See /3rdparty.user for more details.
80
81The same linking guidelines described above for libthriftnb apply to windows as well.
82
83## Linking Against Thrift
84
85You need to link your project that uses thrift against all the thrift
86dependencies; in the case of libthrift, openssl, pthreads, and librt and for
87libthriftnb, libevent.
88
89In the project properties you must also set HAVE_CONFIG_H as force include
90the config header: "windows/config.h"
91
92## Dependencies
93
94libevent (for libthriftnb only)
95http://monkey.org/~provos/libevent/
96
97## Windows version compatibility
98
99The Thrift library targets Windows 7 or latter versions. The supports for windows XP and Vista are avaiable until 0.12.0.
100
101## Thrift and the VCPKG Package manager
102
103You can download and install thrift using the
104[vcpkg](https://github.com/Microsoft/vcpkg) dependency manager:
105
106 git clone https://github.com/Microsoft/vcpkg.git
107 cd vcpkg
108 ./bootstrap-vcpkg.sh
109 ./vcpkg integrate install
110 ./vcpkg install thrift
111
112The thrift port in vcpkg is kept up to date by Microsoft team members
113and community contributors. The Apache Thrift project is *not* responsible
114for the vcpkg port. Therefore, if the version is out of date, please
115[create an issue or pull request](https://github.com/Microsoft/vcpkg)
116on the vcpkg repository.
117
118
119## Named Pipes
120
121Named Pipe transport has been added in the TPipe and TPipeServer classes. This
122is currently Windows-only. Named pipe transport for *NIX has not been
123implemented. Domain sockets are a better choice for local IPC under non-Windows
124OS's. *NIX named pipes only support 1:1 client-server connection.
125
126# Thrift/SSL
127
128## Scope
129
130This SSL only supports blocking mode socket I/O. It can only be used with
131TSimpleServer, TThreadedServer, and TThreadPoolServer.
132
133## Implementation
134
135There are two main classes TSSLSocketFactory and TSSLSocket. Instances of
136TSSLSocket are always created from TSSLSocketFactory.
137
138## How to use SSL APIs
139
140See the TestClient.cpp and TestServer.cpp files for examples.
141
142### AccessManager (certificate validation)
143
144An example of certificate validation can be found in TestServer.cpp.
145
146AccessManager defines a callback interface. It has three callback methods:
147
148(a) Decision verify(const sockaddr_storage& sa);
149
150(b) Decision verify(const string& host, const char* name, int size);
151
152(c) Decision verify(const sockaddr_storage& sa, const char* data, int size);
153
154After SSL handshake completes, additional checks are conducted. Application
155is given the chance to decide whether or not to continue the conversation
156with the remote. Application is queried through the above three "verify"
157method. They are called at different points of the verification process.
158
159Decisions can be one of ALLOW, DENY, and SKIP. ALLOW and DENY means the
160conversation should be continued or disconnected, respectively. ALLOW and
161DENY decision stops the verification process. SKIP means there's no decision
162based on the given input, continue the verification process.
163
164First, (a) is called with the remote IP. It is called once at the beginning.
165"sa" is the IP address of the remote peer.
166
167Then, the certificate of remote peer is loaded. SubjectAltName extensions
168are extracted and sent to application for verification. When a DNS
169subjectAltName field is extracted, (b) is called. When an IP subjectAltName
170field is extracted, (c) is called.
171
172The "host" in (b) is the value from TSocket::getHost() if this is a client
173side socket, or TSocket::getPeerHost() if this is a server side socket. The
174reason is client side socket initiates the connection. TSocket::getHost()
175is the remote host name. On server side, the remote host name is unknown
176unless it's retrieved through TSocket::getPeerHost(). Either way, "host"
177should be the remote host name. Keep in mind, if TSocket::getPeerHost()
178failed, it would return the remote host name in numeric format.
179
180If all subjectAltName extensions were "skipped", the common name field would
181be checked. It is sent to application through (c), where "sa" is the remote
182IP address. "data" is the IP address extracted from subjectAltName IP
183extension, and "size" is the length of the extension data.
184
185If any of the above "verify" methods returned a decision ALLOW or DENY, the
186verification process would be stopped.
187
188If any of the above "verify" methods returned SKIP, that decision would be
189ignored and the verification process would move on till the last item is
190examined. At that point, if there's still no decision, the connection is
191terminated.
192
193Thread safety, an access manager should not store state information if it's
194to be used by many SSL sockets.
195
196## SIGPIPE signal
197
198Applications running OpenSSL over network connections may crash if SIGPIPE
199is not ignored. This happens when they receive a connection reset by remote
200peer exception, which somehow triggers a SIGPIPE signal. If not handled,
201this signal would kill the application.
202
203## How to run test client/server in SSL mode
204
205The server and client expects the followings from the directory /test/
206
207- keys/server.crt
208- keys/server.key
209- keys/CA.pem
210
211The file names are hard coded in the source code. You need to create these
212certificates before you can run the test code in SSL mode. Make sure at least
213one of the followings is included in "keys/server.crt",
214
215- subjectAltName, DNS localhost
216- subjectAltName, IP 127.0.0.1
217- common name, localhost
218
219Run within /test/ folder,
220
221 ./cpp/TestServer --ssl &
222 ./cpp/TestClient --ssl
223
224If "-h <host>" is used to run client, the above "localhost" in the above
225keys/server.crt has to be replaced with that host name.
226
227## TSSLSocketFactory::randomize()
228
229The default implementation of OpenSSLSocketFactory::randomize() simply calls
230OpenSSL's RAND_poll() when OpenSSL library is first initialized.
231
232The PRNG seed is key to the application security. This method should be
233overridden if it's not strong enough for you.
234
235# Deprecations
236
237## 0.12.0
238
239Support for C++03/C++98 was deprecated.
240Support for Boost at runtime was deprecated.
241
242# Breaking Changes
243
244## 1.0.0
245
246THRIFT-4720:
247The classes Monitor and TimerManager now use std::chrono::milliseconds for timeout, the methods and functions involving THRIFT_TIMESPEC and timeval have been removed, the related tests have been modified.
248
249Support for Windows XP/Vista has been dropped.
250
251Support for C++03/C++98 has been dropped. Use version 0.12.0 to support that
252language level. As a consequence, boost is no longer required as a runtime
253library depenedency, but is is still required to build the runtime library
254and to run the unit tests. We will work towards removing boost as a
255build dependency for folks who just want to build the runtime and not
256run the tests. This means the header thrift/stdcxx.h has been removed and
257anything that relied on it has been changed to directly use C++11 concepts.
258
259THRIFT-4730:
260The classes BoostThreadFactory, PosixThreadFactory, StdThreadFactory, and
261PlatformThreadFactory have been removed, and we will use a ThreadFactory
262based on C++11 (essentially StdThreadFactory was renamed ThreadFactory).
263
264THRIFT-4732:
265The CMake build options WITH_SHARED_LIBS and WITH_STATIC_LIBS are deprecated.
266The project no longer performs a side-by-side static and shared build; you
267tell CMake through BUILD_SHARED_LIBS whether to make shared or static
268libraries now. This is CMake standard behavior.
269
270THRIFT-4735:
271Qt4 support was removed.
272
273THRIFT-4762:
274Added `const` specifier to `TTransport::getOrigin()`. This changes its function signature.
275It's recommended to add the `override` specifier in implementations derived from `TTransport`.
276
277## 0.11.0
278
279Older versions of thrift depended on the <boost/smart_ptr.hpp> classes which
280were used in thrift headers to define interfaces. Thrift now detects C++11
281at build time and will prefer to use <memory> classes from C++11 instead.
282You can force the library to build with boost memory classes by defining the
283preprocessor macro `FORCE_BOOST_SMART_PTR`. (THRIFT-2221)
284
285In the pthread mutex implementation, the contention profiling code was enabled
286by default in all builds. This changed to be disabled by default. (THRIFT-4151)
287
288In older releases, if a TSSLSocketFactory's lifetime was not at least as long
289as the TSSLSockets it created, we silently reverted openssl to unsafe multithread behavior
290and so the results were undefined. Changes were made in 0.11.0 that cause either an
291assertion or a core instead of undefined behavior. The lifetime of a TSSLSocketFactory
292*must* be longer than any TSSLSocket that it creates, otherwise openssl will be cleaned
293up too early. If the static boolean is set to disable openssl initialization and
294cleanup and leave it up to the consuming application, this requirement is not needed.
295(THRIFT-4164)
296
297