blob: ce46319b9153c68ba8ea775e29a694a39fffedb8 [file] [log] [blame] [view]
Mark Slee54b7ab92007-03-06 00:06:27 +00001Thrift C++ Software Library
2
Roger Meier6370cfd2014-05-04 22:21:58 +02003# License
Bryan Duxburydef30a62009-04-08 00:19:37 +00004
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.
Mark Slee54b7ab92007-03-06 00:06:27 +000021
Roger Meier6370cfd2014-05-04 22:21:58 +020022# Using Thrift with C++
Mark Slee54b7ab92007-03-06 00:06:27 +000023
24The Thrift C++ libraries are built using the GNU tools. Follow the instructions
Roger Meier6370cfd2014-05-04 22:21:58 +020025in the top-level README.md
Mark Slee54b7ab92007-03-06 00:06:27 +000026
Roger Meier6370cfd2014-05-04 22:21:58 +020027In 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
Mark Slee54b7ab92007-03-06 00:06:27 +000033
34Thrift is divided into two libraries.
35
James E. King IIIc9ac8d22019-01-07 16:46:45 -050036* libthrift - The core Thrift library contains all the core Thrift code. This requires
37 openssl, pthreads, and librt.
Mark Slee54b7ab92007-03-06 00:06:27 +000038
Roger Meier6370cfd2014-05-04 22:21:58 +020039* libthriftnb - This library contains the Thrift nonblocking server, which uses libevent.
Mark Slee54b7ab92007-03-06 00:06:27 +000040 To link this library you will also need to link libevent.
41
Roger Meier6370cfd2014-05-04 22:21:58 +020042## Linking Against Thrift
Mark Slee54b7ab92007-03-06 00:06:27 +000043
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
Roger Meier6370cfd2014-05-04 22:21:58 +020055## Dependencies
Mark Slee54b7ab92007-03-06 00:06:27 +000056
James E. King IIIc9ac8d22019-01-07 16:46:45 -050057C++11 is required at a minimum. C++03/C++98 are not supported after version 0.12.0.
Mark Slee54b7ab92007-03-06 00:06:27 +000058
James E. King IIIc9ac8d22019-01-07 16:46:45 -050059Boost 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:
Mark Slee54b7ab92007-03-06 00:06:27 +000063http://monkey.org/~provos/libevent/
Roger Meier6370cfd2014-05-04 22:21:58 +020064
65# Using Thrift with C++ on Windows
66
James E. King, III82ae9572017-08-05 12:23:54 -040067Both 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:
Roger Meier6370cfd2014-05-04 22:21:58 +020071
Roger Meierfaf52db2014-06-09 22:41:06 +020072BOOST_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.
Roger Meier6370cfd2014-05-04 22:21:58 +020080
James E. King, III82ae9572017-08-05 12:23:54 -040081The same linking guidelines described above for libthriftnb apply to windows as well.
Roger Meier6370cfd2014-05-04 22:21:58 +020082
83## Linking Against Thrift
84
85You need to link your project that uses thrift against all the thrift
James E. King IIIc9ac8d22019-01-07 16:46:45 -050086dependencies; in the case of libthrift, openssl, pthreads, and librt and for
Roger Meier6370cfd2014-05-04 22:21:58 +020087libthriftnb, libevent.
88
89In the project properties you must also set HAVE_CONFIG_H as force include
James E. King IIIc9ac8d22019-01-07 16:46:45 -050090the config header: "windows/config.h"
Roger Meier6370cfd2014-05-04 22:21:58 +020091
92## Dependencies
93
Roger Meier6370cfd2014-05-04 22:21:58 +020094libevent (for libthriftnb only)
95http://monkey.org/~provos/libevent/
96
Roger Meier6370cfd2014-05-04 22:21:58 +020097## Windows version compatibility
98
99The Thrift library targets Windows XP for broadest compatbility. A notable
100difference is in the Windows-specific implementation of the socket poll
101function. To target Vista, Win7 or other versions, comment out the line
102
103 #define TARGET_WIN_XP.
104
James E. King IIIc9ac8d22019-01-07 16:46:45 -0500105See Apache Jira THRIFT-2798 for more about TARGET_WIN_XP.
106
Roger Meier6370cfd2014-05-04 22:21:58 +0200107## Named Pipes
108
109Named Pipe transport has been added in the TPipe and TPipeServer classes. This
110is currently Windows-only. Named pipe transport for *NIX has not been
111implemented. Domain sockets are a better choice for local IPC under non-Windows
112OS's. *NIX named pipes only support 1:1 client-server connection.
113
114# Thrift/SSL
115
Roger Meier4fba9d22014-05-04 22:34:44 +0200116## Scope
Roger Meier6370cfd2014-05-04 22:21:58 +0200117
Roger Meier4fba9d22014-05-04 22:34:44 +0200118This SSL only supports blocking mode socket I/O. It can only be used with
119TSimpleServer, TThreadedServer, and TThreadPoolServer.
Roger Meier6370cfd2014-05-04 22:21:58 +0200120
Roger Meier4fba9d22014-05-04 22:34:44 +0200121## Implementation
Roger Meier6370cfd2014-05-04 22:21:58 +0200122
James E. King IIIc9ac8d22019-01-07 16:46:45 -0500123There are two main classes TSSLSocketFactory and TSSLSocket. Instances of
Roger Meier4fba9d22014-05-04 22:34:44 +0200124TSSLSocket are always created from TSSLSocketFactory.
Roger Meier6370cfd2014-05-04 22:21:58 +0200125
Roger Meier4fba9d22014-05-04 22:34:44 +0200126## How to use SSL APIs
Roger Meier6370cfd2014-05-04 22:21:58 +0200127
James E. King IIIc9ac8d22019-01-07 16:46:45 -0500128See the TestClient.cpp and TestServer.cpp files for examples.
Roger Meier6370cfd2014-05-04 22:21:58 +0200129
James E. King IIIc9ac8d22019-01-07 16:46:45 -0500130### AccessManager (certificate validation)
Roger Meier4fba9d22014-05-04 22:34:44 +0200131
James E. King IIIc9ac8d22019-01-07 16:46:45 -0500132An example of certificate validation can be found in TestServer.cpp.
Roger Meier6370cfd2014-05-04 22:21:58 +0200133
Roger Meier4fba9d22014-05-04 22:34:44 +0200134AccessManager defines a callback interface. It has three callback methods:
Roger Meier6370cfd2014-05-04 22:21:58 +0200135
Roger Meier4fba9d22014-05-04 22:34:44 +0200136(a) Decision verify(const sockaddr_storage& sa);
Roger Meier6370cfd2014-05-04 22:21:58 +0200137
Roger Meier4fba9d22014-05-04 22:34:44 +0200138(b) Decision verify(const string& host, const char* name, int size);
Roger Meier6370cfd2014-05-04 22:21:58 +0200139
Roger Meier4fba9d22014-05-04 22:34:44 +0200140(c) Decision verify(const sockaddr_storage& sa, const char* data, int size);
Roger Meier6370cfd2014-05-04 22:21:58 +0200141
Roger Meier4fba9d22014-05-04 22:34:44 +0200142After SSL handshake completes, additional checks are conducted. Application
143is given the chance to decide whether or not to continue the conversation
144with the remote. Application is queried through the above three "verify"
145method. They are called at different points of the verification process.
Roger Meier6370cfd2014-05-04 22:21:58 +0200146
Roger Meier4fba9d22014-05-04 22:34:44 +0200147Decisions can be one of ALLOW, DENY, and SKIP. ALLOW and DENY means the
148conversation should be continued or disconnected, respectively. ALLOW and
149DENY decision stops the verification process. SKIP means there's no decision
150based on the given input, continue the verification process.
Roger Meier6370cfd2014-05-04 22:21:58 +0200151
Roger Meier4fba9d22014-05-04 22:34:44 +0200152First, (a) is called with the remote IP. It is called once at the beginning.
153"sa" is the IP address of the remote peer.
Roger Meier6370cfd2014-05-04 22:21:58 +0200154
Roger Meier4fba9d22014-05-04 22:34:44 +0200155Then, the certificate of remote peer is loaded. SubjectAltName extensions
156are extracted and sent to application for verification. When a DNS
157subjectAltName field is extracted, (b) is called. When an IP subjectAltName
158field is extracted, (c) is called.
Roger Meier6370cfd2014-05-04 22:21:58 +0200159
Roger Meier4fba9d22014-05-04 22:34:44 +0200160The "host" in (b) is the value from TSocket::getHost() if this is a client
161side socket, or TSocket::getPeerHost() if this is a server side socket. The
162reason is client side socket initiates the connection. TSocket::getHost()
163is the remote host name. On server side, the remote host name is unknown
164unless it's retrieved through TSocket::getPeerHost(). Either way, "host"
165should be the remote host name. Keep in mind, if TSocket::getPeerHost()
166failed, it would return the remote host name in numeric format.
Roger Meier6370cfd2014-05-04 22:21:58 +0200167
Roger Meier4fba9d22014-05-04 22:34:44 +0200168If all subjectAltName extensions were "skipped", the common name field would
169be checked. It is sent to application through (c), where "sa" is the remote
170IP address. "data" is the IP address extracted from subjectAltName IP
171extension, and "size" is the length of the extension data.
Roger Meier6370cfd2014-05-04 22:21:58 +0200172
Roger Meier4fba9d22014-05-04 22:34:44 +0200173If any of the above "verify" methods returned a decision ALLOW or DENY, the
174verification process would be stopped.
Roger Meier6370cfd2014-05-04 22:21:58 +0200175
Roger Meier4fba9d22014-05-04 22:34:44 +0200176If any of the above "verify" methods returned SKIP, that decision would be
177ignored and the verification process would move on till the last item is
178examined. At that point, if there's still no decision, the connection is
179terminated.
Roger Meier6370cfd2014-05-04 22:21:58 +0200180
Roger Meier4fba9d22014-05-04 22:34:44 +0200181Thread safety, an access manager should not store state information if it's
182to be used by many SSL sockets.
Roger Meier6370cfd2014-05-04 22:21:58 +0200183
Roger Meier4fba9d22014-05-04 22:34:44 +0200184## SIGPIPE signal
Roger Meier6370cfd2014-05-04 22:21:58 +0200185
Roger Meier4fba9d22014-05-04 22:34:44 +0200186Applications running OpenSSL over network connections may crash if SIGPIPE
187is not ignored. This happens when they receive a connection reset by remote
188peer exception, which somehow triggers a SIGPIPE signal. If not handled,
189this signal would kill the application.
Roger Meier6370cfd2014-05-04 22:21:58 +0200190
Roger Meier4fba9d22014-05-04 22:34:44 +0200191## How to run test client/server in SSL mode
Roger Meier6370cfd2014-05-04 22:21:58 +0200192
Roger Meier4fba9d22014-05-04 22:34:44 +0200193The server and client expects the followings from the directory /test/
Roger Meier6370cfd2014-05-04 22:21:58 +0200194
Roger Meier4fba9d22014-05-04 22:34:44 +0200195- keys/server.crt
196- keys/server.key
197- keys/CA.pem
Roger Meier6370cfd2014-05-04 22:21:58 +0200198
Roger Meier4fba9d22014-05-04 22:34:44 +0200199The file names are hard coded in the source code. You need to create these
200certificates before you can run the test code in SSL mode. Make sure at least
201one of the followings is included in "keys/server.crt",
Roger Meier6370cfd2014-05-04 22:21:58 +0200202
Roger Meier4fba9d22014-05-04 22:34:44 +0200203- subjectAltName, DNS localhost
204- subjectAltName, IP 127.0.0.1
205- common name, localhost
Roger Meier6370cfd2014-05-04 22:21:58 +0200206
Roger Meier4fba9d22014-05-04 22:34:44 +0200207Run within /test/ folder,
Roger Meier6370cfd2014-05-04 22:21:58 +0200208
Roger Meier4fba9d22014-05-04 22:34:44 +0200209 ./cpp/TestServer --ssl &
210 ./cpp/TestClient --ssl
Roger Meier6370cfd2014-05-04 22:21:58 +0200211
Roger Meier4fba9d22014-05-04 22:34:44 +0200212If "-h <host>" is used to run client, the above "localhost" in the above
213keys/server.crt has to be replaced with that host name.
214
215## TSSLSocketFactory::randomize()
216
217The default implementation of OpenSSLSocketFactory::randomize() simply calls
218OpenSSL's RAND_poll() when OpenSSL library is first initialized.
219
220The PRNG seed is key to the application security. This method should be
221overridden if it's not strong enough for you.
James E. King, III7bc94312017-03-31 21:25:20 -0400222
James E. King IIIc9ac8d22019-01-07 16:46:45 -0500223# Deprecations
224
225## 0.12.0
226
227Support for C++03/C++98 was deprecated.
228Support for Boost at runtime was deprecated.
229
James E. King, III7bc94312017-03-31 21:25:20 -0400230# Breaking Changes
231
James E. King IIIc9ac8d22019-01-07 16:46:45 -0500232## 1.0.0
233
James E. King III17355422019-01-11 23:06:08 -0500234THRIFT-4720:
James E. King IIIc9ac8d22019-01-07 16:46:45 -0500235Support for C++03/C++98 has been dropped. Use version 0.12.0 to support that
236language level. As a consequence, boost is no longer required as a runtime
237library depenedency, but is is still required to build the runtime library
238and to run the unit tests. We will work towards removing boost as a
239build dependency for folks who just want to build the runtime and not
240run the tests. This means the header thrift/stdcxx.h has been removed and
241anything that relied on it has been changed to directly use C++11 concepts.
242
James E. King III17355422019-01-11 23:06:08 -0500243THRIFT-4730:
James E. King IIIc9ac8d22019-01-07 16:46:45 -0500244The classes BoostThreadFactory, PosixThreadFactory, StdThreadFactory, and
James E. King III278528c2019-01-11 12:17:44 -0500245PlatformThreadFactory have been removed, and we will use a ThreadFactory
246based on C++11 (essentially StdThreadFactory was renamed ThreadFactory).
247
James E. King III17355422019-01-11 23:06:08 -0500248THRIFT-4732:
James E. King III278528c2019-01-11 12:17:44 -0500249The CMake build options WITH_SHARED_LIBS and WITH_STATIC_LIBS are deprecated.
250The project no longer performs a side-by-side static and shared build; you
251tell CMake through BUILD_SHARED_LIBS whether to make shared or static
252libraries now. This is CMake standard behavior.
James E. King IIIc9ac8d22019-01-07 16:46:45 -0500253
James E. King III17355422019-01-11 23:06:08 -0500254THRIFT-4735:
255Qt4 support was removed.
256
James E. King, III7bc94312017-03-31 21:25:20 -0400257## 0.11.0
258
James E. King, III82ae9572017-08-05 12:23:54 -0400259Older versions of thrift depended on the <boost/smart_ptr.hpp> classes which
260were used in thrift headers to define interfaces. Thrift now detects C++11
261at build time and will prefer to use <memory> classes from C++11 instead.
262You can force the library to build with boost memory classes by defining the
263preprocessor macro `FORCE_BOOST_SMART_PTR`. (THRIFT-2221)
264
James E. King, III7bc94312017-03-31 21:25:20 -0400265In the pthread mutex implementation, the contention profiling code was enabled
266by default in all builds. This changed to be disabled by default. (THRIFT-4151)
James E. King, III7f5a8c22017-04-04 09:36:38 -0400267
268In older releases, if a TSSLSocketFactory's lifetime was not at least as long
269as the TSSLSockets it created, we silently reverted openssl to unsafe multithread behavior
270and so the results were undefined. Changes were made in 0.11.0 that cause either an
271assertion or a core instead of undefined behavior. The lifetime of a TSSLSocketFactory
272*must* be longer than any TSSLSocket that it creates, otherwise openssl will be cleaned
273up too early. If the static boolean is set to disable openssl initialization and
274cleanup and leave it up to the consuming application, this requirement is not needed.
275(THRIFT-4164)
276