Change-Id: Ic85e68af5c7238a216138e2c8838811074c85ac3
Reviewed-on: http://photon-jenkins.eng.vmware.com:8082/4790
Tested-by: gerrit-photon <photon-checkins@vmware.com>
Reviewed-by: Kumar Kaushik <kaushikk@vmware.com>
1 | 1 |
deleted file mode 100644 |
... | ... |
@@ -1,158 +0,0 @@ |
1 |
-From 4c271a2f34167495ed82da3e7ada52f4808fe121 Mon Sep 17 00:00:00 2001 |
|
2 |
-From: Kumar Kaushik <kaushikk@vmware.com> |
|
3 |
-Date: Tue, 6 Feb 2018 16:51:09 -0800 |
|
4 |
-Subject: [PATCH] Fixing bad memory write bug |
|
5 |
- |
|
6 |
-Change-Id: I483b13d2b2f99be7ebbbc77ed4f2dbf41aa7f580 |
|
7 |
- test/scripts/BUGS_TC/BUG-2052415/README | 41 ++++++++++++++ |
|
8 |
- test/scripts/BUGS_TC/BUG-2052415/restclient.c | 79 +++++++++++++++++++++++++++ |
|
9 |
- transport/posix/socket.c | 1 + |
|
10 |
- 3 files changed, 121 insertions(+) |
|
11 |
- create mode 100644 test/scripts/BUGS_TC/BUG-2052415/README |
|
12 |
- create mode 100644 test/scripts/BUGS_TC/BUG-2052415/restclient.c |
|
13 |
- |
|
14 |
-diff --git a/test/scripts/BUGS_TC/BUG-2052415/README b/test/scripts/BUGS_TC/BUG-2052415/README |
|
15 |
-new file mode 100644 |
|
16 |
-index 0000000..814a32a |
|
17 |
-+++ b/test/scripts/BUGS_TC/BUG-2052415/README |
|
18 |
-@@ -0,0 +1,41 @@ |
|
19 |
-+Bugzilla Id: 2052415 |
|
20 |
-+ |
|
21 |
-+Category: Catastrophic/Crash |
|
22 |
-+ |
|
23 |
-+Description: |
|
24 |
-+Server crash observed when client opens number of connection and times out. No data is sent. |
|
25 |
-+ |
|
26 |
-+Step to reproduce: |
|
27 |
-+ |
|
28 |
-+Specific configuration: |
|
29 |
-+1. Worker threads count 2. |
|
30 |
-+2. No Secure connection required. |
|
31 |
-+ |
|
32 |
-+ |
|
33 |
-+Start server( Keep it running ) |
|
34 |
-+Refer RUN-SIMPLE-SERVER doc in test/scripts directory. (TODO) |
|
35 |
-+ |
|
36 |
-+Open terminal on Ubuntu VM( or any other distro) |
|
37 |
-+1. Wget the source file from the same directory (restclient.c) |
|
38 |
-+2. Edit SERVER_IP and SERVER_PORT macro in the source file to your server. |
|
39 |
-+3. Compile the downloaded client source (gcc -o restclient restclient.c) |
|
40 |
-+4. Install "parallel" on the Ubuntu distro |
|
41 |
-+5. Run following command |
|
42 |
-+ "seq 0 100 | parallel -j50 ./restclient" |
|
43 |
-+ |
|
44 |
-+ |
|
45 |
-+Server will crash. This might take anything between couple of second to 10-15 mins. |
|
46 |
-+ |
|
47 |
-+ |
|
48 |
-+ROOT CAUSE: |
|
49 |
-+Bad memory write happened for back pointer reference for timer socket which was already freed. |
|
50 |
-+This was reported by valgrind also. |
|
51 |
-+ |
|
52 |
-+Fix: |
|
53 |
-+Setting appropiate back pointer to NULL at right place. |
|
54 |
-+ |
|
55 |
-+ |
|
56 |
-+Test: |
|
57 |
-+Ran the same test for serveral hours. No crash seen. |
|
58 |
-+Ran under valgrind, no bad write reported. |
|
59 |
-+All c-rest-engine BVT |
|
60 |
-diff --git a/test/scripts/BUGS_TC/BUG-2052415/restclient.c b/test/scripts/BUGS_TC/BUG-2052415/restclient.c |
|
61 |
-new file mode 100644 |
|
62 |
-index 0000000..a352055 |
|
63 |
-+++ b/test/scripts/BUGS_TC/BUG-2052415/restclient.c |
|
64 |
-@@ -0,0 +1,79 @@ |
|
65 |
-+/************************************************************************** |
|
66 |
-+* This test client will open connection to server but will not send any |
|
67 |
-+* data. This will make server to timeout and execute the timeout code |
|
68 |
-+* path. Please refer README in the same folder for more information |
|
69 |
-+**************************************************************************/ |
|
70 |
-+ |
|
71 |
-+#include <stdio.h> |
|
72 |
-+#include <stdlib.h> |
|
73 |
-+#include <unistd.h> |
|
74 |
-+#include <errno.h> |
|
75 |
-+#include <string.h> |
|
76 |
-+#include <netdb.h> |
|
77 |
-+#include <sys/types.h> |
|
78 |
-+#include <netinet/in.h> |
|
79 |
-+#include <sys/socket.h> |
|
80 |
-+#include <arpa/inet.h> |
|
81 |
-+#include <fcntl.h> |
|
82 |
-+ |
|
83 |
-+/************** EDIT THIS **************/ |
|
84 |
-+ |
|
85 |
-+#define SERVER_IP "172.16.127.131" |
|
86 |
-+#define SERVER_PORT "81" |
|
87 |
-+ |
|
88 |
-+/***************************************/ |
|
89 |
-+ |
|
90 |
-+ |
|
91 |
-+#define MAXDATASIZE 4096 |
|
92 |
-+ |
|
93 |
-+ |
|
94 |
-+int main(int argc, char *argv[]) |
|
95 |
-+{ |
|
96 |
-+ int sockfd = -1; |
|
97 |
-+ int nBytes = 0; |
|
98 |
-+ char buf[MAXDATASIZE] = {0}; |
|
99 |
-+ struct addrinfo hints, *servinfo, *p; |
|
100 |
-+ int rv; |
|
101 |
-+ char s[INET6_ADDRSTRLEN]; |
|
102 |
-+ |
|
103 |
-+again: |
|
104 |
-+ memset(&hints, 0, sizeof(hints)); |
|
105 |
-+ hints.ai_family = AF_UNSPEC; |
|
106 |
-+ hints.ai_socktype = SOCK_STREAM; |
|
107 |
-+ |
|
108 |
-+ if ((rv = getaddrinfo(SERVER_IP, SERVER_PORT, &hints, &servinfo)) != 0) { |
|
109 |
-+ fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv)); |
|
110 |
-+ return 1; |
|
111 |
-+ } |
|
112 |
-+ |
|
113 |
-+ for(p = servinfo; p != NULL; p = p->ai_next) { |
|
114 |
-+ if ((sockfd = socket(p->ai_family, p->ai_socktype, |
|
115 |
-+ p->ai_protocol)) == -1) { |
|
116 |
-+ perror("client: socket"); |
|
117 |
-+ continue; |
|
118 |
-+ } |
|
119 |
-+ |
|
120 |
-+ if (connect(sockfd, p->ai_addr, p->ai_addrlen) == -1) { |
|
121 |
-+ close(sockfd); |
|
122 |
-+ perror("client: connect"); |
|
123 |
-+ continue; |
|
124 |
-+ } |
|
125 |
-+ |
|
126 |
-+ break; |
|
127 |
-+ } |
|
128 |
-+ |
|
129 |
-+ if (p == NULL) { |
|
130 |
-+ printf("client: failed to connect\n"); |
|
131 |
-+ return 2; |
|
132 |
-+ } |
|
133 |
-+ |
|
134 |
-+ freeaddrinfo(servinfo); |
|
135 |
-+ |
|
136 |
-+ nBytes = read(sockfd, buf, MAXDATASIZE); |
|
137 |
-+ |
|
138 |
-+ close(sockfd); |
|
139 |
-+ goto again; |
|
140 |
-+ |
|
141 |
-+ return 0; |
|
142 |
-+ |
|
143 |
-+} |
|
144 |
-diff --git a/transport/posix/socket.c b/transport/posix/socket.c |
|
145 |
-index 207075b..ec7ed3d 100644 |
|
146 |
-+++ b/transport/posix/socket.c |
|
147 |
-@@ -661,6 +661,7 @@ VmSockPosixWaitForEvent( |
|
148 |
- ); |
|
149 |
- } |
|
150 |
- } |
|
151 |
-+ pEventSocket->pIoSocket->pTimerSocket = NULL; |
|
152 |
- } |
|
153 |
- |
|
154 |
- /** Close and free the timer socket ****/ |
... | ... |
@@ -1,7 +1,7 @@ |
1 | 1 |
Name: c-rest-engine |
2 | 2 |
Summary: minimal http(s) server library |
3 |
-Version: 1.1 |
|
4 |
-Release: 10%{?dist} |
|
3 |
+Version: 1.2 |
|
4 |
+Release: 1%{?dist} |
|
5 | 5 |
Group: Applications/System |
6 | 6 |
Vendor: VMware, Inc. |
7 | 7 |
License: Apache 2.0 |
... | ... |
@@ -12,17 +12,7 @@ Requires: openssl >= 1.0.1 |
12 | 12 |
BuildRequires: coreutils >= 8.22 |
13 | 13 |
BuildRequires: openssl-devel >= 1.0.1 |
14 | 14 |
Source0: %{name}-%{version}.tar.gz |
15 |
-Patch0: socket_RW.patch |
|
16 |
-Patch1: syslog_noInit.patch |
|
17 |
-Patch2: socket_logging.patch |
|
18 |
-Patch3: errno_init.patch |
|
19 |
-Patch4: ssl_shutdown.patch |
|
20 |
-Patch5: minimal_request_logging.patch |
|
21 |
-Patch6: connection_timeout.patch |
|
22 |
-Patch7: reqLine_parsing_check.patch |
|
23 |
-Patch8: bad_mem_write.patch |
|
24 |
-Patch9: instance_state.patch |
|
25 |
-%define sha1 c-rest-engine=a25927fd98ec92df5e210cc4941fa626604636f6 |
|
15 |
+%define sha1 c-rest-engine=25aa9d1f2680e26114dee18365c510692552f8e4 |
|
26 | 16 |
|
27 | 17 |
%description |
28 | 18 |
c-rest-engine is a minimal embedded http(s) server written in C. |
... | ... |
@@ -40,16 +30,6 @@ development libs and header files for c-rest-engine |
40 | 40 |
|
41 | 41 |
%prep |
42 | 42 |
%setup -q |
43 |
-%patch0 -p1 |
|
44 |
-%patch1 -p1 |
|
45 |
-%patch2 -p1 |
|
46 |
-%patch3 -p1 |
|
47 |
-%patch4 -p1 |
|
48 |
-%patch5 -p1 |
|
49 |
-%patch6 -p1 |
|
50 |
-%patch7 -p1 |
|
51 |
-%patch8 -p1 |
|
52 |
-%patch9 -p1 |
|
53 | 43 |
|
54 | 44 |
%build |
55 | 45 |
cd build |
... | ... |
@@ -82,6 +62,8 @@ find %{buildroot} -name '*.la' -delete |
82 | 82 |
# %doc ChangeLog README COPYING |
83 | 83 |
|
84 | 84 |
%changelog |
85 |
+* Wed Feb 14 2018 Kumar Kaushik <kaushikk@vmware.com> 1.2-1 |
|
86 |
+- Upgrading to version 1.2. Removing all upstream patches. |
|
85 | 87 |
* Wed Feb 14 2018 Kumar Kaushik <kaushikk@vmware.com> 1.1-10 |
86 | 88 |
- Maintaing instance state for API calls safety. |
87 | 89 |
* Tue Feb 06 2018 Kumar Kaushik <kaushikk@vmware.com> 1.1-9 |
88 | 90 |
deleted file mode 100644 |
... | ... |
@@ -1,832 +0,0 @@ |
1 |
-From 96a49b724295422ceb6465553fdf0da20e5a3b6d Mon Sep 17 00:00:00 2001 |
|
2 |
-From: Kumar Kaushik <kaushikk@vmware.com> |
|
3 |
-Date: Mon, 29 Jan 2018 19:30:18 -0800 |
|
4 |
-Subject: [PATCH] Handling timeout events for faulty application callback |
|
5 |
- |
|
6 |
-Change-Id: I9a412f6d7cf2c3345c73f0581906829bd183e445 |
|
7 |
- common/sockinterface.c | 26 ++- |
|
8 |
- include/public/vmrest.h | 1 + |
|
9 |
- include/vmrestdefines.h | 9 + |
|
10 |
- server/restengine/httpAllocStruct.c | 4 +- |
|
11 |
- server/restengine/httpProtocolHead.c | 7 +- |
|
12 |
- transport/posix/socket.c | 425 ++++++++++++++++++----------------- |
|
13 |
- transport/posix/structs.h | 1 + |
|
14 |
- 7 files changed, 257 insertions(+), 216 deletions(-) |
|
15 |
- |
|
16 |
-diff --git a/common/sockinterface.c b/common/sockinterface.c |
|
17 |
-index 403189c..9e7d404 100644 |
|
18 |
-+++ b/common/sockinterface.c |
|
19 |
-@@ -327,14 +327,13 @@ VmRESTHandleSocketEvent( |
|
20 |
- break; |
|
21 |
- |
|
22 |
- case VM_SOCK_EVENT_TYPE_CONNECTION_TIMEOUT: |
|
23 |
-- /**** Free Associated memory ****/ |
|
24 |
-- VMREST_LOG_DEBUG(pRESTHandle,"%s","EVENT-HANDLER: Connection timeout happened..Disconnecting client ..."); |
|
25 |
-- dwError = VmRESTOnConnectionTimeout( |
|
26 |
-+ VMREST_LOG_DEBUG(pRESTHandle,"%s","EVENT-HANDLER: Connection timeout happened..Disconnecting client"); |
|
27 |
-+ dwError = VmRESTOnConnectionTimeout( |
|
28 |
- pRESTHandle, |
|
29 |
- pSocket |
|
30 |
- ); |
|
31 |
-- BAIL_ON_VMREST_ERROR(dwError); |
|
32 |
-- break; |
|
33 |
-+ BAIL_ON_VMREST_ERROR(dwError); |
|
34 |
-+ break; |
|
35 |
- |
|
36 |
- case VM_SOCK_EVENT_TYPE_UNKNOWN: |
|
37 |
- VMREST_LOG_DEBUG(pRESTHandle,"%s","EVENT-HANDLER: Unknown Socket Event, do nothing"); |
|
38 |
-@@ -436,6 +435,7 @@ VmRESTTcpReceiveNewData( |
|
39 |
- char* pszBuffer = NULL; |
|
40 |
- uint32_t nProcessed = 0; |
|
41 |
- uint32_t nBufLen = 0; |
|
42 |
-+ uint32_t ret = REST_ENGINE_SUCCESS; |
|
43 |
- BOOLEAN bNextIO = FALSE; |
|
44 |
- |
|
45 |
- if (!pSocket || !pRESTHandle || !pQueue) |
|
46 |
-@@ -517,7 +517,7 @@ VmRESTTcpReceiveNewData( |
|
47 |
- |
|
48 |
- cleanup: |
|
49 |
- |
|
50 |
-- if (!bNextIO) |
|
51 |
-+ if (!bNextIO && dwError != REST_ENGINE_ERROR_DOUBLE_FAILURE) |
|
52 |
- { |
|
53 |
- VMREST_LOG_DEBUG(pRESTHandle,"%s","Calling closed connection...."); |
|
54 |
- /**** Close connection ****/ |
|
55 |
-@@ -542,6 +542,20 @@ VmRESTTcpReceiveNewData( |
|
56 |
- error: |
|
57 |
- |
|
58 |
- VMREST_LOG_ERROR(pRESTHandle,"ERROR code %u", dwError); |
|
59 |
-+ |
|
60 |
-+ if ((dwError == VMREST_TRANSPORT_DEFERRED_TIMEOUT_PROCESS) && (bNextIO)) |
|
61 |
-+ { |
|
62 |
-+ ret = VmRESTOnConnectionTimeout( |
|
63 |
-+ pRESTHandle, |
|
64 |
-+ pSocket |
|
65 |
-+ ); |
|
66 |
-+ |
|
67 |
-+ if (ret != REST_ENGINE_SUCCESS) |
|
68 |
-+ { |
|
69 |
-+ VMREST_LOG_ERROR(pRESTHandle,"Double failure on deferred timeout processing dwError, = %u", dwError); |
|
70 |
-+ dwError = REST_ENGINE_ERROR_DOUBLE_FAILURE; |
|
71 |
-+ } |
|
72 |
-+ } |
|
73 |
- goto cleanup; |
|
74 |
- } |
|
75 |
- |
|
76 |
-diff --git a/include/public/vmrest.h b/include/public/vmrest.h |
|
77 |
-index 3988266..5219952 100644 |
|
78 |
-+++ b/include/public/vmrest.h |
|
79 |
-@@ -32,6 +32,7 @@ |
|
80 |
- /**** REST ENGINE ERROR CODES ****/ |
|
81 |
- #define REST_ENGINE_SUCCESS 0 |
|
82 |
- #define REST_ENGINE_FAILURE 1 |
|
83 |
-+#define REST_ENGINE_ERROR_DOUBLE_FAILURE 99 |
|
84 |
- #define REST_ERROR_MISSING_CONFIG 100 |
|
85 |
- #define REST_ERROR_INVALID_CONFIG 101 |
|
86 |
- #define REST_ERROR_NO_MEMORY 102 |
|
87 |
-diff --git a/include/vmrestdefines.h b/include/vmrestdefines.h |
|
88 |
-index 914422a..8a37628 100644 |
|
89 |
-+++ b/include/vmrestdefines.h |
|
90 |
-@@ -63,6 +63,15 @@ |
|
91 |
- #define VMREST_TRANSPORT_COND_INIT_FAILED 61125 |
|
92 |
- #define VMREST_TRANSPORT_SERVER_THREAD_START_FAILED 61126 |
|
93 |
- |
|
94 |
-+ |
|
95 |
-+#define VMREST_TRANSPORT_DEFERRED_TIMEOUT_PROCESS 61127 |
|
96 |
-+#define VMREST_TRANSPORT_SOCK_READ_FAILED 61128 |
|
97 |
-+#define VMREST_TRANSPORT_SOCK_WRITE_FAILED 61129 |
|
98 |
-+#define VMREST_TRANSPORT_SOCK_GET_HANDLE_FAILED 61130 |
|
99 |
-+#define VMREST_TRANSPORT_SOCK_SET_HANDLE_FAILED 61131 |
|
100 |
-+#define VMREST_TRANSPORT_SOCK_DATA_OVER_LIMIT 61132 |
|
101 |
-+#define VMREST_TRANSPORT_REMOTE_CONN_CLOSED 61133 |
|
102 |
-+ |
|
103 |
- #define ERROR_TRANSPORT_INVALID_PARAMS 61040 |
|
104 |
- #define ERROR_TRANSPORT_VALIDATION_FAILED 61041 |
|
105 |
- |
|
106 |
-diff --git a/server/restengine/httpAllocStruct.c b/server/restengine/httpAllocStruct.c |
|
107 |
-index 64cb846..27aa9ed 100644 |
|
108 |
-+++ b/server/restengine/httpAllocStruct.c |
|
109 |
-@@ -519,11 +519,13 @@ VmRESTAllocateMiscQueue( |
|
110 |
- PMISC_HEADER_QUEUE pMiscQueue = NULL; |
|
111 |
- |
|
112 |
- dwError = VmRESTAllocateMemory( |
|
113 |
-- sizeof(VM_REST_HTTP_MESSAGE_BODY), |
|
114 |
-+ sizeof(MISC_HEADER_QUEUE), |
|
115 |
- (void**)&pMiscQueue |
|
116 |
- ); |
|
117 |
- BAIL_ON_VMREST_ERROR(dwError); |
|
118 |
- |
|
119 |
-+ pMiscQueue->head = NULL; |
|
120 |
-+ |
|
121 |
- *ppMiscHeaderQueue = pMiscQueue; |
|
122 |
- |
|
123 |
- cleanup: |
|
124 |
-diff --git a/server/restengine/httpProtocolHead.c b/server/restengine/httpProtocolHead.c |
|
125 |
-index 18cff08..95089a3 100644 |
|
126 |
-+++ b/server/restengine/httpProtocolHead.c |
|
127 |
-@@ -1448,8 +1448,13 @@ VmRESTProcessBuffer( |
|
128 |
- if (ret != REST_ENGINE_SUCCESS) |
|
129 |
- { |
|
130 |
- VMREST_LOG_ERROR(pRESTHandle,"%s","Double Failure case detected ...."); |
|
131 |
-+ VMREST_LOG_ERROR(pRESTHandle,"%s","possible memory leak"); |
|
132 |
-+ dwError = REST_ENGINE_ERROR_DOUBLE_FAILURE; |
|
133 |
-+ } |
|
134 |
-+ else |
|
135 |
-+ { |
|
136 |
-+ dwError = REST_ENGINE_SUCCESS; |
|
137 |
- } |
|
138 |
-- dwError = REST_ENGINE_SUCCESS; |
|
139 |
- goto cleanup; |
|
140 |
- |
|
141 |
- } |
|
142 |
-diff --git a/transport/posix/socket.c b/transport/posix/socket.c |
|
143 |
-index 6c0e14e..207075b 100644 |
|
144 |
-+++ b/transport/posix/socket.c |
|
145 |
-@@ -81,13 +81,6 @@ VmSockPosixReArmTimer( |
|
146 |
- int milliSec |
|
147 |
- ); |
|
148 |
- |
|
149 |
--static |
|
150 |
--BOOLEAN |
|
151 |
--VmSockPosixIsSafeToCloseConnOnTimeOut( |
|
152 |
-- PVMREST_HANDLE pRESTHandle, |
|
153 |
-- PVM_SOCKET pTimerSocket |
|
154 |
-- ); |
|
155 |
-- |
|
156 |
- static |
|
157 |
- uint32_t |
|
158 |
- VmRESTAcceptSSLContext( |
|
159 |
-@@ -482,7 +475,9 @@ VmSockPosixWaitForEvent( |
|
160 |
- BOOLEAN bLocked = FALSE; |
|
161 |
- VM_SOCK_EVENT_TYPE eventType = VM_SOCK_EVENT_TYPE_UNKNOWN; |
|
162 |
- PVM_SOCKET pSocket = NULL; |
|
163 |
-+ BOOLEAN bFound = FALSE; |
|
164 |
- BOOLEAN bFreeEventQueue = 0; |
|
165 |
-+ int i = 0; |
|
166 |
- |
|
167 |
- if (!pQueue || !ppSocket || !pEventType) |
|
168 |
- { |
|
169 |
-@@ -551,7 +546,7 @@ VmSockPosixWaitForEvent( |
|
170 |
- BAIL_ON_VMREST_ERROR(dwError); |
|
171 |
- pSocket = pEventSocket; |
|
172 |
- } |
|
173 |
-- else if (pEventSocket->type == VM_SOCK_TYPE_LISTENER) |
|
174 |
-+ else if (pEventSocket->type == VM_SOCK_TYPE_LISTENER) // New connection request |
|
175 |
- { |
|
176 |
- VMREST_LOG_INFO(pRESTHandle,"%s","C-REST-ENGINE: ======================== NEW REQUEST =========================="); |
|
177 |
- dwError = VmSockPosixAcceptConnection( |
|
178 |
-@@ -572,6 +567,7 @@ VmSockPosixWaitForEvent( |
|
179 |
- ); |
|
180 |
- BAIL_ON_VMREST_ERROR(dwError); |
|
181 |
- |
|
182 |
-+ /**** Try SSL Handshake ****/ |
|
183 |
- dwError = VmRESTAcceptSSLContext( |
|
184 |
- pRESTHandle, |
|
185 |
- pSocket, |
|
186 |
-@@ -580,6 +576,7 @@ VmSockPosixWaitForEvent( |
|
187 |
- BAIL_ON_VMREST_ERROR(dwError); |
|
188 |
- } |
|
189 |
- |
|
190 |
-+ /**** Start watching new connection ****/ |
|
191 |
- dwError = VmSockPosixEventQueueAdd_inlock( |
|
192 |
- pQueue, |
|
193 |
- TRUE, |
|
194 |
-@@ -593,9 +590,12 @@ VmSockPosixWaitForEvent( |
|
195 |
- pSocket |
|
196 |
- ); |
|
197 |
- BAIL_ON_VMREST_ERROR(dwError); |
|
198 |
-+ |
|
199 |
- eventType = VM_SOCK_EVENT_TYPE_TCP_NEW_CONNECTION; |
|
200 |
-+ |
|
201 |
-+ VMREST_LOG_DEBUG(pRESTHandle,"Timer fd %d associated with socket fd %d", pSocket->pTimerSocket->fd ,pSocket->fd); |
|
202 |
- } |
|
203 |
-- else if (pEventSocket->type == VM_SOCK_TYPE_SIGNAL) |
|
204 |
-+ else if (pEventSocket->type == VM_SOCK_TYPE_SIGNAL) // Shutdown library |
|
205 |
- { |
|
206 |
- if (pQueue->bShutdown) |
|
207 |
- { |
|
208 |
-@@ -614,58 +614,108 @@ VmSockPosixWaitForEvent( |
|
209 |
- eventType = VM_SOCK_EVENT_TYPE_DATA_AVAILABLE; |
|
210 |
- } |
|
211 |
- } |
|
212 |
-- else if (pEventSocket->type == VM_SOCK_TYPE_TIMER) |
|
213 |
-+ else if (pEventSocket->type == VM_SOCK_TYPE_TIMER) // Time out event |
|
214 |
- { |
|
215 |
-- /**** No activity on the socket watched by poller till timeout ****/ |
|
216 |
-- if (VmSockPosixIsSafeToCloseConnOnTimeOut(pRESTHandle, pEventSocket)) |
|
217 |
-+ eventType = VM_SOCK_EVENT_TYPE_UNKNOWN; |
|
218 |
-+ pSocket = pEventSocket; |
|
219 |
-+ |
|
220 |
-+ VMREST_LOG_DEBUG(pRESTHandle, "Timeout event happened on timer fd %d", pSocket->fd); |
|
221 |
-+ |
|
222 |
-+ if (pSocket->pIoSocket != NULL) |
|
223 |
- { |
|
224 |
-- pSocket = pEventSocket; |
|
225 |
-+ /*** Scan pQueue and look for IO event corresponding to this timer event ***/ |
|
226 |
-+ for ((i = (pQueue->iReady + 1)); i < pQueue->nReady ; i++) |
|
227 |
-+ { |
|
228 |
-+ struct epoll_event* pEventTemp = &pQueue->pEventArray[i]; |
|
229 |
-+ PVM_SOCKET pEventSocketTemp = (PVM_SOCKET)pEventTemp->data.ptr; |
|
230 |
-+ if (pEventSocketTemp->fd == pEventSocket->pIoSocket->fd) |
|
231 |
-+ { |
|
232 |
-+ pEventSocket->pIoSocket->pTimerSocket = NULL; |
|
233 |
-+ bFound = TRUE; |
|
234 |
-+ break; |
|
235 |
-+ } |
|
236 |
-+ } |
|
237 |
- |
|
238 |
-- /**** Delete timer socket from poller ****/ |
|
239 |
-- dwError = VmSockPosixEventQueueDelete_inlock( |
|
240 |
-- pQueue, |
|
241 |
-- pSocket |
|
242 |
-- ); |
|
243 |
-- BAIL_ON_VMREST_ERROR(dwError); |
|
244 |
-+ if (bFound) |
|
245 |
-+ { |
|
246 |
-+ VMREST_LOG_DEBUG(pRESTHandle,"Action: DEFERRED, IO sock found in queue(Succeeding), Io Sock %d, timer %d", pSocket->pIoSocket->fd, pSocket->fd ); |
|
247 |
-+ } |
|
248 |
-+ else |
|
249 |
-+ { |
|
250 |
-+ if (pSocket->pIoSocket->bInUse == TRUE) |
|
251 |
-+ { |
|
252 |
-+ VMREST_LOG_DEBUG(pRESTHandle,"Action: DEFERRED, IO Soc in use, IoSocket %d, timer %d", pSocket->pIoSocket->fd, pSocket->fd ); |
|
253 |
-+ pEventSocket->pIoSocket->pTimerSocket = NULL; |
|
254 |
-+ } |
|
255 |
-+ else |
|
256 |
-+ { |
|
257 |
-+ /**** We are good to close actual IO Socket here ****/ |
|
258 |
-+ VMREST_LOG_INFO(pRESTHandle,"Action: IO DELETION, IoSocket %d, timer %d", pSocket->pIoSocket->fd, pSocket->fd ); |
|
259 |
-+ eventType = VM_SOCK_EVENT_TYPE_CONNECTION_TIMEOUT; |
|
260 |
-+ pSocket = pSocket->pIoSocket; |
|
261 |
-+ |
|
262 |
-+ /**** Delete IO from queue ****/ |
|
263 |
-+ VmSockPosixEventQueueDelete_inlock( |
|
264 |
-+ pQueue, |
|
265 |
-+ pSocket |
|
266 |
-+ ); |
|
267 |
-+ } |
|
268 |
-+ } |
|
269 |
-+ } |
|
270 |
- |
|
271 |
-- /**** Delete actual IO socket from poller ****/ |
|
272 |
-- dwError = VmSockPosixEventQueueDelete_inlock( |
|
273 |
-- pQueue, |
|
274 |
-- pSocket->pIoSocket |
|
275 |
-- ); |
|
276 |
-- BAIL_ON_VMREST_ERROR(dwError); |
|
277 |
-+ /** Close and free the timer socket ****/ |
|
278 |
-+ VmSockPosixCloseSocket(pRESTHandle,pEventSocket); |
|
279 |
-+ VmSockPosixReleaseSocket(pRESTHandle,pEventSocket); |
|
280 |
- |
|
281 |
-- pSocket = pEventSocket->pIoSocket; |
|
282 |
-- eventType = VM_SOCK_EVENT_TYPE_CONNECTION_TIMEOUT; |
|
283 |
-+ if (eventType == VM_SOCK_EVENT_TYPE_UNKNOWN) |
|
284 |
-+ { |
|
285 |
-+ pSocket = NULL; |
|
286 |
- } |
|
287 |
- } |
|
288 |
-- else |
|
289 |
-+ else // Data available on IO Socket |
|
290 |
- { |
|
291 |
-- /**** Data is available over the socket ****/ |
|
292 |
-- pSocket = pEventSocket; |
|
293 |
-+ pSocket = pEventSocket; |
|
294 |
- |
|
295 |
-- /**** If SSL handshake is not yet complete, do the needful ****/ |
|
296 |
-- if ((pRESTHandle->pSSLInfo->isSecure) && (!(pSocket->bSSLHandShakeCompleted))) |
|
297 |
-- { |
|
298 |
-- dwError = VmRESTAcceptSSLContext( |
|
299 |
-- pRESTHandle, |
|
300 |
-- pSocket, |
|
301 |
-- TRUE |
|
302 |
-- ); |
|
303 |
-- BAIL_ON_VMREST_ERROR(dwError); |
|
304 |
-- } |
|
305 |
-- else |
|
306 |
-- { |
|
307 |
-- eventType = VM_SOCK_EVENT_TYPE_DATA_AVAILABLE; |
|
308 |
-+ /**** Mark IO socket in use - timer out event cannot modify IO till this is done ****/ |
|
309 |
-+ pSocket->bInUse = TRUE; |
|
310 |
- |
|
311 |
-- /**** Stop timer on the socket ****/ |
|
312 |
-- dwError = VmSockPosixReArmTimer( |
|
313 |
-- pRESTHandle, |
|
314 |
-- pSocket->pTimerSocket, |
|
315 |
-- 0 |
|
316 |
-- ); |
|
317 |
-- BAIL_ON_VMREST_ERROR(dwError); |
|
318 |
-- } |
|
319 |
-+ if (pSocket->pTimerSocket == NULL) |
|
320 |
-+ { |
|
321 |
-+ /**** Time out already occurred on this socket.. request won't be processed ****/ |
|
322 |
-+ VmSockPosixCloseSocket(pRESTHandle,pSocket); |
|
323 |
-+ VmSockPosixReleaseSocket(pRESTHandle,pSocket); |
|
324 |
-+ } |
|
325 |
-+ else |
|
326 |
-+ { |
|
327 |
-+ /**** Process data ****/ |
|
328 |
-+ VMREST_LOG_DEBUG(pRESTHandle,"Data notification on socket fd %d", pSocket->fd); |
|
329 |
-+ |
|
330 |
-+ /**** If SSL handshake is not yet complete, do the needful ****/ |
|
331 |
-+ if ((pRESTHandle->pSSLInfo->isSecure) && (!(pSocket->bSSLHandShakeCompleted))) |
|
332 |
-+ { |
|
333 |
-+ dwError = VmRESTAcceptSSLContext( |
|
334 |
-+ pRESTHandle, |
|
335 |
-+ pSocket, |
|
336 |
-+ TRUE |
|
337 |
-+ ); |
|
338 |
-+ BAIL_ON_VMREST_ERROR(dwError); |
|
339 |
-+ |
|
340 |
-+ /**** We do not need IO any more ..mark as available for timer ****/ |
|
341 |
-+ pSocket->bInUse = FALSE; |
|
342 |
-+ } |
|
343 |
-+ else |
|
344 |
-+ { |
|
345 |
-+ eventType = VM_SOCK_EVENT_TYPE_DATA_AVAILABLE; |
|
346 |
-+ |
|
347 |
-+ /*** Disarm timer associated with this IO socket .. dont delete ***/ |
|
348 |
-+ dwError = VmSockPosixReArmTimer( |
|
349 |
-+ pRESTHandle, |
|
350 |
-+ pSocket->pTimerSocket, |
|
351 |
-+ 0 |
|
352 |
-+ ); |
|
353 |
-+ BAIL_ON_VMREST_ERROR(dwError); |
|
354 |
-+ } |
|
355 |
-+ } |
|
356 |
- } |
|
357 |
- } |
|
358 |
- pQueue->iReady++; |
|
359 |
-@@ -696,7 +746,7 @@ VmSockPosixWaitForEvent( |
|
360 |
- |
|
361 |
- error: |
|
362 |
- |
|
363 |
-- VMREST_LOG_ERROR(pRESTHandle,"%s","Socket layer - wait for event error"); |
|
364 |
-+ VMREST_LOG_ERROR(pRESTHandle,"Error while processing socket event, dwError = %u", dwError); |
|
365 |
- if (ppSocket) |
|
366 |
- { |
|
367 |
- *ppSocket = NULL; |
|
368 |
-@@ -884,8 +934,8 @@ VmSockPosixRead( |
|
369 |
- if (nPrevBuf >= pRESTHandle->pRESTConfig->maxDataPerConnMB) |
|
370 |
- { |
|
371 |
- /**** Discard the request here itself. This might be the first read IO cycle ****/ |
|
372 |
-- VMREST_LOG_ERROR(pRESTHandle,"Total Data in request %u bytes is over allowed limit of %u bytes, closing connection...", nPrevBuf, pRESTHandle->pRESTConfig->maxDataPerConnMB); |
|
373 |
-- dwError = REST_ENGINE_FAILURE; |
|
374 |
-+ VMREST_LOG_ERROR(pRESTHandle,"Total Data in request %u bytes is over allowed limit of %u bytes, closing connection with fd %d", nPrevBuf, pRESTHandle->pRESTConfig->maxDataPerConnMB, pSocket->fd); |
|
375 |
-+ dwError = VMREST_TRANSPORT_SOCK_DATA_OVER_LIMIT; |
|
376 |
- } |
|
377 |
- BAIL_ON_VMREST_ERROR(dwError); |
|
378 |
- |
|
379 |
-@@ -897,8 +947,8 @@ VmSockPosixRead( |
|
380 |
- } |
|
381 |
- else |
|
382 |
- { |
|
383 |
-- VMREST_LOG_ERROR(pRESTHandle,"Unknown socket read error: errno %u, errorCode %u, nRead %d", errno, errorCode, nRead); |
|
384 |
-- dwError = REST_ENGINE_FAILURE; |
|
385 |
-+ VMREST_LOG_ERROR(pRESTHandle,"Socket read error: errno %u, errorCode %u, nRead %d", errno, errorCode, nRead); |
|
386 |
-+ dwError = VMREST_TRANSPORT_SOCK_READ_FAILED; |
|
387 |
- } |
|
388 |
- } |
|
389 |
- else |
|
390 |
-@@ -906,12 +956,12 @@ VmSockPosixRead( |
|
391 |
- if (nRead == 0) |
|
392 |
- { |
|
393 |
- VMREST_LOG_ERROR(pRESTHandle,"%s","Socket Read Failed: Remote has closed the connection"); |
|
394 |
-- dwError = VM_SOCK_POSIX_ERROR_BROKEN_PIPE; |
|
395 |
-+ dwError = VMREST_TRANSPORT_SOCK_READ_FAILED; |
|
396 |
- } |
|
397 |
- else |
|
398 |
- { |
|
399 |
- VMREST_LOG_ERROR(pRESTHandle, "Socket read failed with error code %u", errorCode); |
|
400 |
-- dwError = errorCode; |
|
401 |
-+ dwError = VMREST_TRANSPORT_SOCK_READ_FAILED; |
|
402 |
- } |
|
403 |
- } |
|
404 |
- BAIL_ON_VMREST_ERROR(dwError); |
|
405 |
-@@ -936,29 +986,37 @@ VmSockPosixRead( |
|
406 |
- |
|
407 |
- error: |
|
408 |
- |
|
409 |
-- if (pSocket) |
|
410 |
-- { |
|
411 |
-- VMREST_LOG_ERROR(pRESTHandle,"Socket read failed with Socket fd %d, dwError = %u, nRead = %d, errno = %u, errorCode = %u", pSocket->fd, dwError, nRead, errno, errorCode); |
|
412 |
-- } |
|
413 |
-- else |
|
414 |
-- { |
|
415 |
-- VMREST_LOG_ERROR(pRESTHandle,"Socket read failed with dwError = %u, nRead = %d, errno = %u, errorCode = %u", dwError, nRead, errno, errorCode); |
|
416 |
-- } |
|
417 |
-- |
|
418 |
-- if (pszBufPrev && pSocket && pRESTHandle->pSockContext) |
|
419 |
-+ if (pSocket && pRESTHandle->pSockContext) |
|
420 |
- { |
|
421 |
- /**** Delete the socket from poller ****/ |
|
422 |
-- |
|
423 |
-- VmSockPosixEventQueueDelete_inlock( |
|
424 |
-+ VmSockPosixEventQueueDelete_inlock( |
|
425 |
- pRESTHandle->pSockContext->pEventQueue, |
|
426 |
- pSocket |
|
427 |
- ); |
|
428 |
-- |
|
429 |
-- VmRESTFreeMemory(pszBufPrev); |
|
430 |
-- pszBufPrev = NULL; |
|
431 |
-+ |
|
432 |
- pSocket->pszBuffer = NULL; |
|
433 |
- pSocket->nProcessed = 0; |
|
434 |
- pSocket->nBufData = 0; |
|
435 |
-+ |
|
436 |
-+ if (pSocket->pTimerSocket) |
|
437 |
-+ { |
|
438 |
-+ VmSockPosixReArmTimer( |
|
439 |
-+ pRESTHandle, |
|
440 |
-+ pSocket->pTimerSocket, |
|
441 |
-+ ((pRESTHandle->pRESTConfig->connTimeoutSec) * 1000) |
|
442 |
-+ ); |
|
443 |
-+ |
|
444 |
-+ write(pSocket->pTimerSocket->fd, "NotifyPQ", 8); |
|
445 |
-+ pSocket->pTimerSocket->pIoSocket = NULL; |
|
446 |
-+ |
|
447 |
-+ } |
|
448 |
-+ |
|
449 |
-+ } |
|
450 |
-+ |
|
451 |
-+ if (pszBufPrev) |
|
452 |
-+ { |
|
453 |
-+ VmRESTFreeMemory(pszBufPrev); |
|
454 |
-+ pszBufPrev = NULL; |
|
455 |
- } |
|
456 |
- |
|
457 |
- if (nBufLen) |
|
458 |
-@@ -1080,8 +1138,8 @@ VmSockPosixWrite( |
|
459 |
- |
|
460 |
- error: |
|
461 |
- |
|
462 |
-- VMREST_LOG_ERROR(pRESTHandle,"%s", "Socket write failed"); |
|
463 |
- goto cleanup; |
|
464 |
-+ |
|
465 |
- } |
|
466 |
- |
|
467 |
- VOID |
|
468 |
-@@ -1092,10 +1150,6 @@ VmSockPosixReleaseSocket( |
|
469 |
- { |
|
470 |
- if (pSocket) |
|
471 |
- { |
|
472 |
-- if (pSocket->pTimerSocket) |
|
473 |
-- { |
|
474 |
-- VmSockPosixFreeSocket(pSocket->pTimerSocket); |
|
475 |
-- } |
|
476 |
- VmSockPosixFreeSocket(pSocket); |
|
477 |
- } |
|
478 |
- } |
|
479 |
-@@ -1118,22 +1172,21 @@ VmSockPosixCloseSocket( |
|
480 |
- } |
|
481 |
- BAIL_ON_VMREST_ERROR(dwError); |
|
482 |
- |
|
483 |
-- VMREST_LOG_INFO(pRESTHandle,"C-REST-ENGINE: Closing socket with fd %d", pSocket->fd); |
|
484 |
-+ VMREST_LOG_INFO(pRESTHandle,"C-REST-ENGINE: Closing socket with fd %d, Socket Type %u ( 2-Io / 5-Timer )", pSocket->fd, pSocket->type); |
|
485 |
- |
|
486 |
- dwError = VmRESTLockMutex(pSocket->pMutex); |
|
487 |
- BAIL_ON_VMREST_ERROR(dwError); |
|
488 |
- |
|
489 |
- bLocked = TRUE; |
|
490 |
- |
|
491 |
-- if (pSocket->pTimerSocket && (pSocket->pTimerSocket->fd > 0)) |
|
492 |
-+ if (pSocket->pTimerSocket) |
|
493 |
- { |
|
494 |
-- close(pSocket->pTimerSocket->fd); |
|
495 |
-- pSocket->pTimerSocket->fd = -1; |
|
496 |
-+ pSocket->pTimerSocket->pIoSocket = NULL; |
|
497 |
- } |
|
498 |
- |
|
499 |
-- if (pRESTHandle->pSSLInfo->isSecure && pSocket->ssl) |
|
500 |
-+ if (pRESTHandle->pSSLInfo->isSecure && pSocket->ssl && (pSocket->type != VM_SOCK_TYPE_TIMER)) |
|
501 |
- { |
|
502 |
-- ret = SSL_shutdown(pSocket->ssl); |
|
503 |
-+ ret = SSL_shutdown(pSocket->ssl); |
|
504 |
- if (ret < 0) |
|
505 |
- { |
|
506 |
- errorCode = SSL_get_error(pSocket->ssl, ret); |
|
507 |
-@@ -1149,7 +1202,6 @@ VmSockPosixCloseSocket( |
|
508 |
- pSocket->fd = -1; |
|
509 |
- } |
|
510 |
- |
|
511 |
-- |
|
512 |
- cleanup: |
|
513 |
- |
|
514 |
- if (bLocked) |
|
515 |
-@@ -1294,6 +1346,12 @@ VmSockPosixEventQueueDelete_inlock( |
|
516 |
- DWORD dwError = REST_ENGINE_SUCCESS; |
|
517 |
- struct epoll_event event = {0}; |
|
518 |
- |
|
519 |
-+ if (!pSocket || !pQueue) |
|
520 |
-+ { |
|
521 |
-+ dwError = REST_ERROR_INVALID_HANDLER; |
|
522 |
-+ } |
|
523 |
-+ BAIL_ON_VMREST_ERROR(dwError); |
|
524 |
-+ |
|
525 |
- if (epoll_ctl(pQueue->epollFd, EPOLL_CTL_DEL, pSocket->fd, &event) < 0) |
|
526 |
- { |
|
527 |
- dwError = VM_SOCK_POSIX_ERROR_SYS_CALL_FAILED; |
|
528 |
-@@ -1341,6 +1399,7 @@ VmSockPosixAcceptConnection( |
|
529 |
- pSocket->pTimerSocket = NULL; |
|
530 |
- pSocket->pIoSocket = NULL; |
|
531 |
- pSocket->bSSLHandShakeCompleted = FALSE; |
|
532 |
-+ pSocket->bInUse = FALSE; |
|
533 |
- |
|
534 |
- *ppSocket = pSocket; |
|
535 |
- |
|
536 |
-@@ -1560,35 +1619,21 @@ VmSockPosixSetRequestHandle( |
|
537 |
- |
|
538 |
- pSocket->nProcessed = nProcessed; |
|
539 |
- |
|
540 |
-- /**** Rearm timer and add sockfd back to poller ****/ |
|
541 |
-- if (!bCompleted) |
|
542 |
-+ if (bCompleted) |
|
543 |
- { |
|
544 |
-- dwError = VmSockPosixReArmTimer( |
|
545 |
-- pRESTHandle, |
|
546 |
-- pSocket->pTimerSocket, |
|
547 |
-- ((pRESTHandle->pRESTConfig->connTimeoutSec) * 1000) |
|
548 |
-- ); |
|
549 |
-- BAIL_ON_VMREST_ERROR(dwError); |
|
550 |
-- |
|
551 |
-- event.data.ptr = pSocket; |
|
552 |
-- event.events = EPOLLIN; |
|
553 |
-- |
|
554 |
-- event.events = event.events | EPOLLONESHOT; |
|
555 |
-- |
|
556 |
-- if (epoll_ctl(pQueue->epollFd, EPOLL_CTL_MOD, pSocket->fd, &event) < 0) |
|
557 |
-+ /**** We are done with request - no need to add back to poller *****/ |
|
558 |
-+ if (pSocket->pTimerSocket != NULL) |
|
559 |
- { |
|
560 |
-- dwError = VM_SOCK_POSIX_ERROR_SYS_CALL_FAILED; |
|
561 |
-+ pSocket->pTimerSocket->pIoSocket = NULL; |
|
562 |
-+ |
|
563 |
-+ /**** Give immediate notification to timer for cleanup ****/ |
|
564 |
-+ dwError = VmSockPosixReArmTimer( |
|
565 |
-+ pRESTHandle, |
|
566 |
-+ pSocket->pTimerSocket, |
|
567 |
-+ 1 |
|
568 |
-+ ); |
|
569 |
- BAIL_ON_VMREST_ERROR(dwError); |
|
570 |
- } |
|
571 |
-- } |
|
572 |
-- else |
|
573 |
-- { |
|
574 |
-- /**** Delete timerfd from poller ****/ |
|
575 |
-- dwError = VmSockPosixEventQueueDelete_inlock( |
|
576 |
-- pQueue, |
|
577 |
-- pSocket->pTimerSocket |
|
578 |
-- ); |
|
579 |
-- BAIL_ON_VMREST_ERROR(dwError); |
|
580 |
- |
|
581 |
- /**** Delete actual IO socket from poller ****/ |
|
582 |
- dwError = VmSockPosixEventQueueDelete_inlock( |
|
583 |
-@@ -1596,13 +1641,37 @@ VmSockPosixSetRequestHandle( |
|
584 |
- pSocket |
|
585 |
- ); |
|
586 |
- BAIL_ON_VMREST_ERROR(dwError); |
|
587 |
-- |
|
588 |
-- |
|
589 |
-- if (pSocket->pTimerSocket->fd > 0) |
|
590 |
-+ } |
|
591 |
-+ else |
|
592 |
-+ { |
|
593 |
-+ /***** Add back IO socket to poller for next IO cycle ****/ |
|
594 |
-+ if (pSocket->pTimerSocket == NULL) |
|
595 |
- { |
|
596 |
-- close(pSocket->pTimerSocket->fd); |
|
597 |
-- pSocket->pTimerSocket->fd = -1; |
|
598 |
-- } |
|
599 |
-+ /**** Timeout already happened. Notify HTTP layer to send 408 Req timeout - if possible ****/ |
|
600 |
-+ dwError = VMREST_TRANSPORT_DEFERRED_TIMEOUT_PROCESS; |
|
601 |
-+ } |
|
602 |
-+ else |
|
603 |
-+ { |
|
604 |
-+ /*** Rearm timer and add IO socket to poller ****/ |
|
605 |
-+ dwError = VmSockPosixReArmTimer( |
|
606 |
-+ pRESTHandle, |
|
607 |
-+ pSocket->pTimerSocket, |
|
608 |
-+ ((pRESTHandle->pRESTConfig->connTimeoutSec) * 1000) |
|
609 |
-+ ); |
|
610 |
-+ BAIL_ON_VMREST_ERROR(dwError); |
|
611 |
-+ |
|
612 |
-+ event.data.ptr = pSocket; |
|
613 |
-+ event.events = EPOLLIN; |
|
614 |
-+ |
|
615 |
-+ event.events = event.events | EPOLLONESHOT; |
|
616 |
-+ |
|
617 |
-+ if (epoll_ctl(pQueue->epollFd, EPOLL_CTL_MOD, pSocket->fd, &event) < 0) |
|
618 |
-+ { |
|
619 |
-+ dwError = VM_SOCK_POSIX_ERROR_SYS_CALL_FAILED; |
|
620 |
-+ BAIL_ON_VMREST_ERROR(dwError); |
|
621 |
-+ } |
|
622 |
-+ } |
|
623 |
-+ BAIL_ON_VMREST_ERROR(dwError); |
|
624 |
- } |
|
625 |
- |
|
626 |
- cleanup: |
|
627 |
-@@ -1611,6 +1680,10 @@ VmSockPosixSetRequestHandle( |
|
628 |
- { |
|
629 |
- VmRESTUnlockMutex(pSocket->pMutex); |
|
630 |
- } |
|
631 |
-+ if (!bCompleted && pSocket && (pSocket->pTimerSocket != NULL)) |
|
632 |
-+ { |
|
633 |
-+ pSocket->bInUse = FALSE; |
|
634 |
-+ } |
|
635 |
- |
|
636 |
- return dwError; |
|
637 |
- |
|
638 |
-@@ -1702,6 +1775,13 @@ VmSockPosixReArmTimer( |
|
639 |
- int nSec = 0; |
|
640 |
- int nNanoSec = 0; |
|
641 |
- |
|
642 |
-+ if (!pRESTHandle || !pTimerSocket ) |
|
643 |
-+ { |
|
644 |
-+ VMREST_LOG_ERROR(pRESTHandle,"%s","Invalid params"); |
|
645 |
-+ dwError = ERROR_INVALID_PARAMETER; |
|
646 |
-+ } |
|
647 |
-+ BAIL_ON_VMREST_ERROR(dwError); |
|
648 |
-+ |
|
649 |
- if (milliSec > 0) |
|
650 |
- { |
|
651 |
- nSec = milliSec / 1000; |
|
652 |
-@@ -1733,96 +1813,6 @@ VmSockPosixReArmTimer( |
|
653 |
- |
|
654 |
- } |
|
655 |
- |
|
656 |
--static |
|
657 |
--BOOLEAN |
|
658 |
--VmSockPosixIsSafeToCloseConnOnTimeOut( |
|
659 |
-- PVMREST_HANDLE pRESTHandle, |
|
660 |
-- PVM_SOCKET pTimerSocket |
|
661 |
-- ) |
|
662 |
--{ |
|
663 |
-- uint32_t dwError = REST_ENGINE_SUCCESS; |
|
664 |
-- struct epoll_event event = {0}; |
|
665 |
-- BOOLEAN bCloseConn = FALSE; |
|
666 |
-- ssize_t nRead = 0; |
|
667 |
-- uint32_t errorCode = 0; |
|
668 |
-- uint64_t res = 0; |
|
669 |
-- char pBuf = '\0'; |
|
670 |
-- struct itimerspec ts = {0}; |
|
671 |
-- PVM_SOCKET pSocket = NULL; |
|
672 |
-- |
|
673 |
-- if (!pRESTHandle || !pTimerSocket) |
|
674 |
-- { |
|
675 |
-- VMREST_LOG_ERROR(pRESTHandle,"%s","Invalid params"); |
|
676 |
-- dwError = ERROR_INVALID_PARAMETER; |
|
677 |
-- } |
|
678 |
-- BAIL_ON_VMREST_ERROR(dwError); |
|
679 |
-- |
|
680 |
-- pSocket = pTimerSocket->pIoSocket; |
|
681 |
-- errno = 0; |
|
682 |
-- |
|
683 |
-- if ((pRESTHandle->pSSLInfo->isSecure) && (pSocket->ssl)) |
|
684 |
-- { |
|
685 |
-- nRead = SSL_read(pSocket->ssl, &pBuf, 0); |
|
686 |
-- errorCode = SSL_get_error(pSocket->ssl, nRead); |
|
687 |
-- } |
|
688 |
-- else if (pSocket->fd > 0) |
|
689 |
-- { |
|
690 |
-- nRead = read(pSocket->fd, &pBuf, 0); |
|
691 |
-- errorCode = errno; |
|
692 |
-- } |
|
693 |
-- VMREST_LOG_DEBUG(pRESTHandle, "IO socket read bytes %d, errorCode %u, at timer expiration", nRead, errorCode); |
|
694 |
-- |
|
695 |
-- if (errorCode == EAGAIN || errorCode == EWOULDBLOCK || errorCode == SSL_ERROR_WANT_READ) |
|
696 |
-- { |
|
697 |
-- /**** Check for preceeding reset of timer due to valid IO ****/ |
|
698 |
-- if (timerfd_gettime(pTimerSocket->fd, &ts) == 0) |
|
699 |
-- { |
|
700 |
-- if ((ts.it_value.tv_sec == 0) && (ts.it_value.tv_nsec == 0)) |
|
701 |
-- { |
|
702 |
-- /**** timer is still disarmed ****/ |
|
703 |
-- /**** It's safe to close connection ****/ |
|
704 |
-- bCloseConn = TRUE; |
|
705 |
-- } |
|
706 |
-- |
|
707 |
-- /**** Do a read on timer socket - dummy read ****/ |
|
708 |
-- do |
|
709 |
-- { |
|
710 |
-- errorCode = 0; |
|
711 |
-- errno = 0; |
|
712 |
-- nRead = 0; |
|
713 |
-- nRead = read(pTimerSocket->fd, &res, sizeof(res)); |
|
714 |
-- errorCode = errno; |
|
715 |
-- res = 0; |
|
716 |
-- }while(nRead > 0); |
|
717 |
-- |
|
718 |
-- if (!bCloseConn) |
|
719 |
-- { |
|
720 |
-- /**** Add timer socket back to poller ****/ |
|
721 |
-- event.data.ptr = pTimerSocket; |
|
722 |
-- event.events = EPOLLIN; |
|
723 |
-- event.events = event.events | EPOLLONESHOT; |
|
724 |
-- |
|
725 |
-- if (epoll_ctl(pRESTHandle->pSockContext->pEventQueue->epollFd, EPOLL_CTL_MOD, pTimerSocket->fd, &event) < 0) |
|
726 |
-- { |
|
727 |
-- dwError = VM_SOCK_POSIX_ERROR_SYS_CALL_FAILED; |
|
728 |
-- BAIL_ON_VMREST_ERROR(dwError); |
|
729 |
-- } |
|
730 |
-- } |
|
731 |
-- } |
|
732 |
-- } |
|
733 |
-- |
|
734 |
--cleanup: |
|
735 |
-- |
|
736 |
-- return bCloseConn; |
|
737 |
-- |
|
738 |
--error: |
|
739 |
-- |
|
740 |
-- bCloseConn = FALSE; |
|
741 |
-- |
|
742 |
-- goto cleanup; |
|
743 |
-- |
|
744 |
--} |
|
745 |
-- |
|
746 |
- static |
|
747 |
- uint32_t |
|
748 |
- VmSockPosixCreateTimer( |
|
749 |
-@@ -1860,6 +1850,7 @@ VmSockPosixCreateTimer( |
|
750 |
- |
|
751 |
- pTimerSocket->type = VM_SOCK_TYPE_TIMER; |
|
752 |
- pTimerSocket->fd = timerFd; |
|
753 |
-+ pTimerSocket->bInUse = FALSE; |
|
754 |
- pTimerSocket->pIoSocket = pSocket; |
|
755 |
- pTimerSocket->pRequest = NULL; |
|
756 |
- pTimerSocket->pszBuffer = NULL; |
|
757 |
-@@ -1931,6 +1922,7 @@ VmRESTAcceptSSLContext( |
|
758 |
- |
|
759 |
- if (ret == 1) |
|
760 |
- { |
|
761 |
-+ VMREST_LOG_DEBUG(pRESTHandle," SSL accept successful on socket %d, ret %d, errorCode %u", pSocket->fd, ret, errorCode); |
|
762 |
- pSocket->bSSLHandShakeCompleted = TRUE; |
|
763 |
- bReArm = TRUE; |
|
764 |
- } |
|
765 |
-@@ -1940,15 +1932,22 @@ VmRESTAcceptSSLContext( |
|
766 |
- pSocket->bSSLHandShakeCompleted = FALSE; |
|
767 |
- bReArm = TRUE; |
|
768 |
- } |
|
769 |
-+ else if ((ret == 0) && (errorCode == SSL_ERROR_SYSCALL)) |
|
770 |
-+ { |
|
771 |
-+ VMREST_LOG_ERROR(pRESTHandle," Client closed the connection during SSL handshake, socket fd %d, ret %d, errorCode %u, errno %d", pSocket->fd, ret, errorCode, errno); |
|
772 |
-+ dwError = VMREST_TRANSPORT_SSL_ACCEPT_FAILED; |
|
773 |
-+ BAIL_ON_VMREST_ERROR(dwError); |
|
774 |
-+ } |
|
775 |
- else |
|
776 |
- { |
|
777 |
-- VMREST_LOG_ERROR(pRESTHandle, "SSL handshake failed...connection will be closed for socket with fd %d, ret %d, errorCode %u", pSocket->fd, ret, errorCode); |
|
778 |
-+ VMREST_LOG_ERROR(pRESTHandle, "SSL handshake failed...connection will be closed for socket with fd %d, ret %d, errorCode %u, errno %d", pSocket->fd, ret, errorCode, errno); |
|
779 |
- dwError = VMREST_TRANSPORT_SSL_ACCEPT_FAILED; |
|
780 |
- BAIL_ON_VMREST_ERROR(dwError); |
|
781 |
- } |
|
782 |
- |
|
783 |
- if (bReArm && bWatched) |
|
784 |
- { |
|
785 |
-+ /**** Rearm and add the socket ****/ |
|
786 |
- dwError = VmSockPosixReArmTimer( |
|
787 |
- pRESTHandle, |
|
788 |
- pSocket->pTimerSocket, |
|
789 |
-@@ -1974,13 +1973,23 @@ VmRESTAcceptSSLContext( |
|
790 |
- |
|
791 |
- error: |
|
792 |
- |
|
793 |
-- if (bWatched && pRESTHandle && pRESTHandle->pSockContext) |
|
794 |
-+ if (pRESTHandle && pRESTHandle->pSockContext) |
|
795 |
- { |
|
796 |
- /**** Delete from poller ****/ |
|
797 |
- VmSockPosixEventQueueDelete_inlock( |
|
798 |
- pRESTHandle->pSockContext->pEventQueue, |
|
799 |
- pSocket |
|
800 |
- ); |
|
801 |
-+ |
|
802 |
-+ if (bWatched && pSocket && pSocket->pTimerSocket) |
|
803 |
-+ { |
|
804 |
-+ pSocket->pTimerSocket->pIoSocket = NULL; |
|
805 |
-+ VmSockPosixReArmTimer( |
|
806 |
-+ pRESTHandle, |
|
807 |
-+ pSocket->pTimerSocket, |
|
808 |
-+ 1 |
|
809 |
-+ ); |
|
810 |
-+ } |
|
811 |
- } |
|
812 |
- |
|
813 |
- goto cleanup; |
|
814 |
-diff --git a/transport/posix/structs.h b/transport/posix/structs.h |
|
815 |
-index ad5563e..369cfcb 100644 |
|
816 |
-+++ b/transport/posix/structs.h |
|
817 |
-@@ -20,6 +20,7 @@ typedef struct _VM_SOCKET |
|
818 |
- int fd; |
|
819 |
- SSL* ssl; |
|
820 |
- BOOLEAN bSSLHandShakeCompleted; |
|
821 |
-+ BOOLEAN bInUse; |
|
822 |
- char* pszBuffer; |
|
823 |
- uint32_t nBufData; |
|
824 |
- uint32_t nProcessed; |
825 | 1 |
deleted file mode 100644 |
... | ... |
@@ -1,111 +0,0 @@ |
1 |
-From b9a3185e4556e8c5785a60fb57c2924bbd0529f7 Mon Sep 17 00:00:00 2001 |
|
2 |
-From: Kumar Kaushik <kaushikk@vmware.com> |
|
3 |
-Date: Wed, 29 Nov 2017 18:47:39 -0800 |
|
4 |
-Subject: [PATCH] Avoiding previous errno variable use |
|
5 |
- |
|
6 |
-Change-Id: I76b0ef967df8b1ad6fa1844e1e461af470bb3b0f |
|
7 |
- transport/posix/socket.c | 51 +++++++++++++++++++++++++++++++----------------- |
|
8 |
- 1 file changed, 33 insertions(+), 18 deletions(-) |
|
9 |
- |
|
10 |
-diff --git a/transport/posix/socket.c b/transport/posix/socket.c |
|
11 |
-index 79c7a38..d3a3dbc 100644 |
|
12 |
-+++ b/transport/posix/socket.c |
|
13 |
-@@ -853,6 +853,8 @@ VmSockPosixRead( |
|
14 |
- do |
|
15 |
- { |
|
16 |
- nRead = 0; |
|
17 |
-+ errno = 0; |
|
18 |
-+ errorCode = 0; |
|
19 |
- if (pRESTHandle->pSSLInfo->isSecure && (pSocket->ssl != NULL)) |
|
20 |
- { |
|
21 |
- nRead = SSL_read(pSocket->ssl, (pszBufPrev + nPrevBuf), MAX_DATA_BUFFER_LEN); |
|
22 |
-@@ -864,7 +866,7 @@ VmSockPosixRead( |
|
23 |
- errorCode = errno; |
|
24 |
- } |
|
25 |
- |
|
26 |
-- if ((nRead > 0) && (nRead <= MAX_DATA_BUFFER_LEN)) |
|
27 |
-+ if (nRead > 0) |
|
28 |
- { |
|
29 |
- nPrevBuf += nRead; |
|
30 |
- dwError = VmRESTReallocateMemory( |
|
31 |
-@@ -877,22 +879,6 @@ VmSockPosixRead( |
|
32 |
- } |
|
33 |
- }while((nRead > 0) && (nPrevBuf < pRESTHandle->pRESTConfig->maxDataPerConnMB)); |
|
34 |
- |
|
35 |
-- if (((pSocket->fd > 0) && (errorCode == EAGAIN || errorCode == EWOULDBLOCK)) || ((pRESTHandle->pSSLInfo->isSecure) && (errorCode == SSL_ERROR_WANT_READ))) |
|
36 |
-- { |
|
37 |
-- dwError = REST_ENGINE_SUCCESS; |
|
38 |
-- } |
|
39 |
-- else if (nRead < 0) |
|
40 |
-- { |
|
41 |
-- VMREST_LOG_ERROR(pRESTHandle, "Socket read failed with error code %u", errorCode); |
|
42 |
-- dwError = errorCode; |
|
43 |
-- } |
|
44 |
-- else if (nRead == 0) |
|
45 |
-- { |
|
46 |
-- VMREST_LOG_ERROR(pRESTHandle,"%s", "Socket read failed due to broken pipe"); |
|
47 |
-- dwError = VM_SOCK_POSIX_ERROR_BROKEN_PIPE; |
|
48 |
-- } |
|
49 |
-- BAIL_ON_VMREST_ERROR(dwError); |
|
50 |
-- |
|
51 |
- if (nPrevBuf >= pRESTHandle->pRESTConfig->maxDataPerConnMB) |
|
52 |
- { |
|
53 |
- /**** Discard the request here itself. This might be the first read IO cycle ****/ |
|
54 |
-@@ -901,6 +887,33 @@ VmSockPosixRead( |
|
55 |
- } |
|
56 |
- BAIL_ON_VMREST_ERROR(dwError); |
|
57 |
- |
|
58 |
-+ if (nRead == -1) |
|
59 |
-+ { |
|
60 |
-+ if (((pSocket->fd > 0) && (errorCode == EAGAIN || errorCode == EWOULDBLOCK)) || ((pRESTHandle->pSSLInfo->isSecure) && (errorCode == SSL_ERROR_WANT_READ))) |
|
61 |
-+ { |
|
62 |
-+ dwError = REST_ENGINE_SUCCESS; |
|
63 |
-+ } |
|
64 |
-+ else |
|
65 |
-+ { |
|
66 |
-+ VMREST_LOG_ERROR(pRESTHandle,"%s","Unknown socket read error: errno %u, errorCode %u, nRead %d", errno, errorCode, nRead); |
|
67 |
-+ dwError = REST_ENGINE_FAILURE; |
|
68 |
-+ } |
|
69 |
-+ } |
|
70 |
-+ else |
|
71 |
-+ { |
|
72 |
-+ if (nRead == 0) |
|
73 |
-+ { |
|
74 |
-+ VMREST_LOG_ERROR(pRESTHandle,"%s","Socket Read Failed: Remote has closed the connection"); |
|
75 |
-+ dwError = VM_SOCK_POSIX_ERROR_BROKEN_PIPE; |
|
76 |
-+ } |
|
77 |
-+ else |
|
78 |
-+ { |
|
79 |
-+ VMREST_LOG_ERROR(pRESTHandle, "Socket read failed with error code %u", errorCode); |
|
80 |
-+ dwError = errorCode; |
|
81 |
-+ } |
|
82 |
-+ } |
|
83 |
-+ BAIL_ON_VMREST_ERROR(dwError); |
|
84 |
-+ |
|
85 |
- pSocket->pszBuffer = pszBufPrev; |
|
86 |
- pSocket->nProcessed = 0; |
|
87 |
- pSocket->nBufData = nPrevBuf; |
|
88 |
-@@ -933,11 +946,12 @@ VmSockPosixRead( |
|
89 |
- if (pszBufPrev && pSocket && pRESTHandle->pSockContext) |
|
90 |
- { |
|
91 |
- /**** Delete the socket from poller ****/ |
|
92 |
-+ |
|
93 |
- VmSockPosixEventQueueDelete_inlock( |
|
94 |
- pRESTHandle->pSockContext->pEventQueue, |
|
95 |
- pSocket |
|
96 |
- ); |
|
97 |
-- |
|
98 |
-+ |
|
99 |
- VmRESTFreeMemory(pszBufPrev); |
|
100 |
- pszBufPrev = NULL; |
|
101 |
- pSocket->pszBuffer = NULL; |
|
102 |
-@@ -1566,6 +1580,7 @@ VmSockPosixSetRequestHandle( |
|
103 |
- pSocket |
|
104 |
- ); |
|
105 |
- BAIL_ON_VMREST_ERROR(dwError); |
|
106 |
-+ |
|
107 |
- |
|
108 |
- if (pSocket->pTimerSocket->fd > 0) |
|
109 |
- { |
110 | 1 |
deleted file mode 100644 |
... | ... |
@@ -1,1294 +0,0 @@ |
1 |
-From e4262558a10e4470dab84d50b5f7d8d4121e8d1d Mon Sep 17 00:00:00 2001 |
|
2 |
-From: Kumar Kaushik <kaushikk@vmware.com> |
|
3 |
-Date: Mon, 12 Feb 2018 20:03:44 -0800 |
|
4 |
-Subject: [PATCH] Maintaining internal library instanse state for API safety |
|
5 |
- |
|
6 |
-Change-Id: Icf1d75eaba6d62c3486653ffa1ae7528ced620e3 |
|
7 |
- common/sockinterface.c | 88 +++++++++++++++-- |
|
8 |
- include/public/vmrest.h | 1 + |
|
9 |
- include/vmrestcommon.h | 16 ++- |
|
10 |
- include/vmsock.h | 39 ++++++-- |
|
11 |
- server/restengine/defines.h | 16 ++- |
|
12 |
- server/restengine/httpAllocStruct.c | 2 + |
|
13 |
- server/restengine/httpMain.c | 39 +++++--- |
|
14 |
- server/restengine/libmain.c | 142 ++++++++++++++++++++------- |
|
15 |
- transport/api/api.c | 31 +++++- |
|
16 |
- transport/posix/libmain.c | 5 +- |
|
17 |
- transport/posix/prototypes.h | 11 ++- |
|
18 |
- transport/posix/socket.c | 187 +++++++++++++++++++----------------- |
|
19 |
- 12 files changed, 414 insertions(+), 163 deletions(-) |
|
20 |
- |
|
21 |
-diff --git a/common/sockinterface.c b/common/sockinterface.c |
|
22 |
-index 9e7d404..f737f78 100644 |
|
23 |
-+++ b/common/sockinterface.c |
|
24 |
-@@ -71,6 +71,40 @@ VmRESTInitProtocolServer( |
|
25 |
- ) |
|
26 |
- { |
|
27 |
- DWORD dwError = REST_ENGINE_SUCCESS; |
|
28 |
-+ |
|
29 |
-+ if (!pRESTHandle) |
|
30 |
-+ { |
|
31 |
-+ VMREST_LOG_ERROR(pRESTHandle,"%s","Invalid REST config"); |
|
32 |
-+ dwError = REST_ERROR_INVALID_HANDLER; |
|
33 |
-+ } |
|
34 |
-+ BAIL_ON_VMREST_ERROR(dwError); |
|
35 |
-+ |
|
36 |
-+ /**** Init Logging ****/ |
|
37 |
-+ dwError = VmRESTLogInitialize( |
|
38 |
-+ pRESTHandle |
|
39 |
-+ ); |
|
40 |
-+ BAIL_ON_VMREST_ERROR(dwError); |
|
41 |
-+ |
|
42 |
-+ /**** Init Transport ****/ |
|
43 |
-+ dwError = VmwSockInitialize(pRESTHandle); |
|
44 |
-+ BAIL_ON_VMREST_ERROR(dwError); |
|
45 |
-+ |
|
46 |
-+cleanup: |
|
47 |
-+ |
|
48 |
-+ return dwError; |
|
49 |
-+ |
|
50 |
-+error: |
|
51 |
-+ |
|
52 |
-+ goto cleanup; |
|
53 |
-+ |
|
54 |
-+} |
|
55 |
-+ |
|
56 |
-+DWORD |
|
57 |
-+VmRESTStartProtocolServer( |
|
58 |
-+ PVMREST_HANDLE pRESTHandle |
|
59 |
-+ ) |
|
60 |
-+{ |
|
61 |
-+ DWORD dwError = REST_ENGINE_SUCCESS; |
|
62 |
- PVMREST_SOCK_CONTEXT pSockContext = NULL; |
|
63 |
- DWORD dwFlags = VM_SOCK_CREATE_FLAGS_REUSE_ADDR | |
|
64 |
- VM_SOCK_CREATE_FLAGS_NON_BLOCK; |
|
65 |
-@@ -92,7 +126,7 @@ VmRESTInitProtocolServer( |
|
66 |
- |
|
67 |
- /**** Handle IPv4 case ****/ |
|
68 |
- |
|
69 |
-- dwError = VmwSockOpenServer( |
|
70 |
-+ dwError = VmwSockStartServer( |
|
71 |
- pRESTHandle, |
|
72 |
- dwFlags | VM_SOCK_CREATE_FLAGS_TCP | |
|
73 |
- VM_SOCK_CREATE_FLAGS_IPV4, |
|
74 |
-@@ -103,7 +137,7 @@ VmRESTInitProtocolServer( |
|
75 |
- #ifdef AF_INET6 |
|
76 |
- /**** Handle IPv6 case ****/ |
|
77 |
- |
|
78 |
-- dwError = VmwSockOpenServer( |
|
79 |
-+ dwError = VmwSockStartServer( |
|
80 |
- pRESTHandle, |
|
81 |
- dwFlags | VM_SOCK_CREATE_FLAGS_TCP | |
|
82 |
- VM_SOCK_CREATE_FLAGS_IPV6, |
|
83 |
-@@ -122,7 +156,7 @@ VmRESTInitProtocolServer( |
|
84 |
- ); |
|
85 |
- BAIL_ON_VMREST_ERROR(dwError); |
|
86 |
- |
|
87 |
-- dwError = VmwSockEventQueueAdd( |
|
88 |
-+ dwError = VmwSockAddEventToQueueInLock( |
|
89 |
- pRESTHandle, |
|
90 |
- pSockContext->pEventQueue, |
|
91 |
- pSockContext->pListenerTCP |
|
92 |
-@@ -132,7 +166,7 @@ VmRESTInitProtocolServer( |
|
93 |
- #ifdef AF_INET6 |
|
94 |
- if (!bNoIpV6) |
|
95 |
- { |
|
96 |
-- dwError = VmwSockEventQueueAdd( |
|
97 |
-+ dwError = VmwSockAddEventToQueueInLock( |
|
98 |
- pRESTHandle, |
|
99 |
- pSockContext->pEventQueue, |
|
100 |
- pSockContext->pListenerTCP6 |
|
101 |
-@@ -194,7 +228,7 @@ VmRESTInitProtocolServer( |
|
102 |
- } |
|
103 |
- |
|
104 |
- uint32_t |
|
105 |
--VmRESTShutdownProtocolServer( |
|
106 |
-+VmRESTStopProtocolServer( |
|
107 |
- PVMREST_HANDLE pRESTHandle, |
|
108 |
- uint32_t waitSecond |
|
109 |
- ) |
|
110 |
-@@ -221,6 +255,18 @@ VmRESTShutdownProtocolServer( |
|
111 |
- |
|
112 |
- } |
|
113 |
- |
|
114 |
-+void |
|
115 |
-+VmRESTShutdownProtocolServer( |
|
116 |
-+ PVMREST_HANDLE pRESTHandle |
|
117 |
-+ ) |
|
118 |
-+{ |
|
119 |
-+ if (pRESTHandle) |
|
120 |
-+ { |
|
121 |
-+ VmwSockShutdown(pRESTHandle); |
|
122 |
-+ VmRESTLogTerminate(pRESTHandle); |
|
123 |
-+ } |
|
124 |
-+} |
|
125 |
-+ |
|
126 |
- static |
|
127 |
- PVOID |
|
128 |
- VmRESTSockWorkerThreadProc( |
|
129 |
-@@ -569,6 +615,34 @@ VmRESTSockContextFree( |
|
130 |
- { |
|
131 |
- uint32_t dwError = REST_ENGINE_SUCCESS; |
|
132 |
- |
|
133 |
-+ if (!pRESTHandle || !pSockContext) |
|
134 |
-+ { |
|
135 |
-+ dwError = ERROR_INVALID_PARAMETER; |
|
136 |
-+ } |
|
137 |
-+ BAIL_ON_VMREST_ERROR(dwError); |
|
138 |
-+ |
|
139 |
-+ |
|
140 |
-+ if (pSockContext->pListenerTCP) |
|
141 |
-+ { |
|
142 |
-+ dwError = VmwSockDeleteEventFromQueue( |
|
143 |
-+ pRESTHandle, |
|
144 |
-+ pSockContext->pEventQueue, |
|
145 |
-+ pSockContext->pListenerTCP |
|
146 |
-+ ); |
|
147 |
-+ BAIL_ON_VMREST_ERROR(dwError); |
|
148 |
-+ VmwSockClose( pRESTHandle, pSockContext->pListenerTCP); |
|
149 |
-+ } |
|
150 |
-+ if (pSockContext->pListenerTCP6) |
|
151 |
-+ { |
|
152 |
-+ dwError = VmwSockDeleteEventFromQueue( |
|
153 |
-+ pRESTHandle, |
|
154 |
-+ pSockContext->pEventQueue, |
|
155 |
-+ pSockContext->pListenerTCP6 |
|
156 |
-+ ); |
|
157 |
-+ BAIL_ON_VMREST_ERROR(dwError); |
|
158 |
-+ VmwSockClose( pRESTHandle, pSockContext->pListenerTCP6); |
|
159 |
-+ } |
|
160 |
-+ |
|
161 |
- if (pSockContext->pEventQueue) |
|
162 |
- { |
|
163 |
- dwError = VmwSockCloseEventQueue(pRESTHandle, pSockContext->pEventQueue, waitSecond); |
|
164 |
-@@ -577,14 +651,14 @@ VmRESTSockContextFree( |
|
165 |
- |
|
166 |
- if (pSockContext->pListenerTCP) |
|
167 |
- { |
|
168 |
-- VmwSockClose( pRESTHandle, pSockContext->pListenerTCP); |
|
169 |
- VmwSockRelease( pRESTHandle, pSockContext->pListenerTCP); |
|
170 |
- } |
|
171 |
-+ |
|
172 |
- if (pSockContext->pListenerTCP6) |
|
173 |
- { |
|
174 |
-- VmwSockClose( pRESTHandle, pSockContext->pListenerTCP6); |
|
175 |
- VmwSockRelease( pRESTHandle, pSockContext->pListenerTCP6); |
|
176 |
- } |
|
177 |
-+ |
|
178 |
- if (pSockContext->pWorkerThreads) |
|
179 |
- { |
|
180 |
- DWORD iThr = 0; |
|
181 |
-diff --git a/include/public/vmrest.h b/include/public/vmrest.h |
|
182 |
-index 5219952..6ebe3fd 100644 |
|
183 |
-+++ b/include/public/vmrest.h |
|
184 |
-@@ -46,6 +46,7 @@ |
|
185 |
- #define REST_ERROR_BAD_CONFIG_FILE_PATH 110 |
|
186 |
- #define REST_ERROR_PREV_INSTANCE_NOT_CLEAN 111 |
|
187 |
- #define REST_ERROR_INVALID_HANDLER 112 |
|
188 |
-+#define REST_ENGINE_ERROR_INVALID_PARAM 112 |
|
189 |
- #define REST_ENGINE_SSL_CONFIG_FILE 113 |
|
190 |
- #define REST_ENGINE_NO_DEBUG_LOGGING 114 |
|
191 |
- #define REST_ENGINE_BAD_LOG_LEVEL 115 |
|
192 |
-diff --git a/include/vmrestcommon.h b/include/vmrestcommon.h |
|
193 |
-index d966f0e..3b7f17c 100644 |
|
194 |
-+++ b/include/vmrestcommon.h |
|
195 |
-@@ -260,14 +260,14 @@ typedef struct _REST_ENG_GLOBALS *PREST_ENG_GLOBALS; |
|
196 |
- typedef struct _VMREST_HANDLE |
|
197 |
- { |
|
198 |
- int debugLogLevel; |
|
199 |
-+ int instanceState; |
|
200 |
- FILE* logFile; |
|
201 |
- PVM_SOCK_PACKAGE pPackage; |
|
202 |
- PVM_SOCK_SSL_INFO pSSLInfo; |
|
203 |
- PREST_PROCESSOR pHttpHandler; |
|
204 |
- PREST_ENG_GLOBALS pInstanceGlobal; |
|
205 |
- PVMREST_SOCK_CONTEXT pSockContext; |
|
206 |
-- PVM_REST_CONFIG pRESTConfig; |
|
207 |
-- |
|
208 |
-+ PVM_REST_CONFIG pRESTConfig; |
|
209 |
- } VMREST_HANDLE; |
|
210 |
- |
|
211 |
- typedef struct _VM_WORKER_THREAD_DATA |
|
212 |
-@@ -296,11 +296,21 @@ VmRESTInitProtocolServer( |
|
213 |
- ); |
|
214 |
- |
|
215 |
- DWORD |
|
216 |
--VmRESTShutdownProtocolServer( |
|
217 |
-+VmRESTStartProtocolServer( |
|
218 |
-+ PVMREST_HANDLE pRESTHandle |
|
219 |
-+ ); |
|
220 |
-+ |
|
221 |
-+DWORD |
|
222 |
-+VmRESTStopProtocolServer( |
|
223 |
- PVMREST_HANDLE pRESTHandle, |
|
224 |
- uint32_t waitSecond |
|
225 |
- ); |
|
226 |
- |
|
227 |
-+VOID |
|
228 |
-+VmRESTShutdownProtocolServer( |
|
229 |
-+ PVMREST_HANDLE pRESTHandle |
|
230 |
-+ ); |
|
231 |
-+ |
|
232 |
- uint32_t |
|
233 |
- VmRESTCommonWriteDataAtOnce( |
|
234 |
- PVMREST_HANDLE pRESTHandle, |
|
235 |
-diff --git a/include/vmsock.h b/include/vmsock.h |
|
236 |
-index 7b60b29..5075aa7 100644 |
|
237 |
-+++ b/include/vmsock.h |
|
238 |
-@@ -87,7 +87,7 @@ VmwSockInitialize( |
|
239 |
- ); |
|
240 |
- |
|
241 |
- /** |
|
242 |
-- * @brief Opens a server socket |
|
243 |
-+ * @brief Starts a server socket |
|
244 |
- * |
|
245 |
- * @param[in] Handle to library instance. |
|
246 |
- * @param[in] dwFlags 32 bit flags defining socket creation preferences |
|
247 |
-@@ -96,7 +96,7 @@ VmwSockInitialize( |
|
248 |
- * @return 0 on success |
|
249 |
- */ |
|
250 |
- DWORD |
|
251 |
--VmwSockOpenServer( |
|
252 |
-+VmwSockStartServer( |
|
253 |
- PVMREST_HANDLE pRESTHandle, |
|
254 |
- VM_SOCK_CREATE_FLAGS dwFlags, |
|
255 |
- PVM_SOCKET* ppSocket |
|
256 |
-@@ -117,7 +117,7 @@ VmwSockCreateEventQueue( |
|
257 |
- ); |
|
258 |
- |
|
259 |
- /** |
|
260 |
-- * @brief Adds a socket to the event queue |
|
261 |
-+ * @brief Add a socket to the event queue |
|
262 |
- * |
|
263 |
- * @param[in] Handle to library instance. |
|
264 |
- * @param[in] pQueue Pointer to Event queue |
|
265 |
-@@ -126,7 +126,23 @@ VmwSockCreateEventQueue( |
|
266 |
- * @return 0 on success |
|
267 |
- */ |
|
268 |
- DWORD |
|
269 |
--VmwSockEventQueueAdd( |
|
270 |
-+VmwSockAddEventToQueueInLock( |
|
271 |
-+ PVMREST_HANDLE pRESTHandle, |
|
272 |
-+ PVM_SOCK_EVENT_QUEUE pQueue, |
|
273 |
-+ PVM_SOCKET pSocket |
|
274 |
-+ ); |
|
275 |
-+ |
|
276 |
-+/** |
|
277 |
-+ * @brief Deletes a socket from the event queue |
|
278 |
-+ * |
|
279 |
-+ * @param[in] Handle to library instance. |
|
280 |
-+ * @param[in] pQueue Pointer to Event queue |
|
281 |
-+ * @param[in] pSocket Pointer to Socket |
|
282 |
-+ * |
|
283 |
-+ * @return 0 on success |
|
284 |
-+ */ |
|
285 |
-+DWORD |
|
286 |
-+VmwSockDeleteEventFromQueue( |
|
287 |
- PVMREST_HANDLE pRESTHandle, |
|
288 |
- PVM_SOCK_EVENT_QUEUE pQueue, |
|
289 |
- PVM_SOCKET pSocket |
|
290 |
-@@ -280,7 +296,7 @@ typedef enum |
|
291 |
- VM_SOCK_TYPE_TCP_V6 |
|
292 |
- } VM_SOCK_TYPE; |
|
293 |
- |
|
294 |
--typedef DWORD (*PFN_OPEN_SERVER_SOCKET)( |
|
295 |
-+typedef DWORD (*PFN_START_SERVER_SOCKET)( |
|
296 |
- PVMREST_HANDLE pRESTHandle, |
|
297 |
- VM_SOCK_CREATE_FLAGS dwFlags, |
|
298 |
- PVM_SOCKET* ppSocket |
|
299 |
-@@ -291,7 +307,13 @@ typedef DWORD (*PFN_CREATE_EVENT_QUEUE)( |
|
300 |
- PVM_SOCK_EVENT_QUEUE* ppQueue |
|
301 |
- ); |
|
302 |
- |
|
303 |
--typedef DWORD (*PFN_ADD_EVENT_QUEUE)( |
|
304 |
-+typedef DWORD (*PFN_ADD_EVENT_TO_QUEUE)( |
|
305 |
-+ PVMREST_HANDLE pRESTHandle, |
|
306 |
-+ PVM_SOCK_EVENT_QUEUE pQueue, |
|
307 |
-+ PVM_SOCKET pSocket |
|
308 |
-+ ); |
|
309 |
-+ |
|
310 |
-+typedef DWORD (*PFN_DELETE_EVENT_FROM_QUEUE)( |
|
311 |
- PVMREST_HANDLE pRESTHandle, |
|
312 |
- PVM_SOCK_EVENT_QUEUE pQueue, |
|
313 |
- PVM_SOCKET pSocket |
|
314 |
-@@ -359,9 +381,10 @@ typedef DWORD(*PFN_GET_PEER_INFO)( |
|
315 |
- |
|
316 |
- typedef struct _VM_SOCK_PACKAGE |
|
317 |
- { |
|
318 |
-- PFN_OPEN_SERVER_SOCKET pfnOpenServerSocket; |
|
319 |
-+ PFN_START_SERVER_SOCKET pfnStartServerSocket; |
|
320 |
- PFN_CREATE_EVENT_QUEUE pfnCreateEventQueue; |
|
321 |
-- PFN_ADD_EVENT_QUEUE pfnAddEventQueue; |
|
322 |
-+ PFN_ADD_EVENT_TO_QUEUE pfnAddEventToQueue; |
|
323 |
-+ PFN_DELETE_EVENT_FROM_QUEUE pfnDeleteEventFromQueue; |
|
324 |
- PFN_WAIT_FOR_EVENT pfnWaitForEvent; |
|
325 |
- PFN_CLOSE_EVENT_QUEUE pfnCloseEventQueue; |
|
326 |
- PFN_READ pfnRead; |
|
327 |
-diff --git a/server/restengine/defines.h b/server/restengine/defines.h |
|
328 |
-index 380af9c..ec1e542 100644 |
|
329 |
-+++ b/server/restengine/defines.h |
|
330 |
-@@ -17,11 +17,12 @@ typedef void* (PFN_VMREST_THR_ROUTINE)(void*); |
|
331 |
- |
|
332 |
- /* HTTP protocol header defines */ |
|
333 |
- |
|
334 |
--#define MAX_METHOD_LEN 10 |
|
335 |
--#define MAX_URI_LEN 10240 |
|
336 |
-+#define MAX_METHOD_LEN 10 |
|
337 |
-+#define MAX_URI_LEN 10240 |
|
338 |
- #define MAX_VERSION_LEN 9 |
|
339 |
- #define MAX_STATUS_LEN 4 |
|
340 |
--#define MAX_REA_PHRASE_LEN 32 |
|
341 |
-+#define MAX_REA_PHRASE_LEN 32 |
|
342 |
-+#define MAX_STOP_WAIT_SECONDS 600 |
|
343 |
- #define HTTP_VER_LEN 8 |
|
344 |
- #define HTTP_CHUNK_DATA_MIN_LEN 3 |
|
345 |
- #define HTTP_CHUNKED_DATA_LEN 8 |
|
346 |
-@@ -62,6 +63,15 @@ typedef enum _HTTP_PAYLOAD_TYPE |
|
347 |
- HTTP_PAYLOAD_TRANSFER_ENCODING |
|
348 |
- }HTTP_PAYLOAD_TYPE; |
|
349 |
- |
|
350 |
-+typedef enum _VM_REST_INSTANCE_STATE |
|
351 |
-+{ |
|
352 |
-+ VMREST_INSTANCE_UNINITIALIZED = -1, |
|
353 |
-+ VMREST_INSTANCE_INITIALIZED = 1, |
|
354 |
-+ VMREST_INSTANCE_STARTED = 2, |
|
355 |
-+ VMREST_INSTANCE_STOPPED = 3, |
|
356 |
-+ VMREST_INSTANCE_SHUTDOWN = 4 |
|
357 |
-+}VM_REST_INSTANCE_STATE; |
|
358 |
-+ |
|
359 |
- typedef enum _VM_REST_PROCESSING_STATE |
|
360 |
- { |
|
361 |
- PROCESS_INVALID = -1, |
|
362 |
-diff --git a/server/restengine/httpAllocStruct.c b/server/restengine/httpAllocStruct.c |
|
363 |
-index 27aa9ed..18a016e 100644 |
|
364 |
-+++ b/server/restengine/httpAllocStruct.c |
|
365 |
-@@ -345,6 +345,8 @@ VmRESTAllocateHandle( |
|
366 |
- |
|
367 |
- pRESTHandle->pHttpHandler = NULL; |
|
368 |
- |
|
369 |
-+ pRESTHandle->instanceState = VMREST_INSTANCE_UNINITIALIZED; |
|
370 |
-+ |
|
371 |
- *ppRESTHandle = pRESTHandle; |
|
372 |
- |
|
373 |
- cleanup: |
|
374 |
-diff --git a/server/restengine/httpMain.c b/server/restengine/httpMain.c |
|
375 |
-index 562a555..9f3afcd 100644 |
|
376 |
-+++ b/server/restengine/httpMain.c |
|
377 |
-@@ -23,7 +23,6 @@ VmHTTPInit( |
|
378 |
- |
|
379 |
- if (!pRESTHandle || !pConfig) |
|
380 |
- { |
|
381 |
-- VMREST_LOG_DEBUG(pRESTHandle,"%s","Invalid params"); |
|
382 |
- dwError = REST_ERROR_INVALID_CONFIG; |
|
383 |
- } |
|
384 |
- BAIL_ON_VMREST_ERROR(dwError); |
|
385 |
-@@ -41,21 +40,19 @@ VmHTTPInit( |
|
386 |
- ); |
|
387 |
- BAIL_ON_VMREST_ERROR(dwError); |
|
388 |
- |
|
389 |
-- pRESTHandle->debugLogLevel = pRESTHandle->pRESTConfig->debugLogLevel; |
|
390 |
-- |
|
391 |
-- /**** Init the debug log ****/ |
|
392 |
-- dwError = VmRESTLogInitialize( |
|
393 |
-+ /**** Init logging and transport ****/ |
|
394 |
-+ dwError = VmRESTInitProtocolServer( |
|
395 |
- pRESTHandle |
|
396 |
- ); |
|
397 |
- BAIL_ON_VMREST_ERROR(dwError); |
|
398 |
- |
|
399 |
-- /**** Init Transport ****/ |
|
400 |
-- dwError = VmwSockInitialize(pRESTHandle); |
|
401 |
-- BAIL_ON_VMREST_ERROR(dwError); |
|
402 |
-+ pRESTHandle->debugLogLevel = pRESTHandle->pRESTConfig->debugLogLevel; |
|
403 |
- |
|
404 |
- /**** Update context Info for this lib instance ****/ |
|
405 |
- pRESTHandle->pInstanceGlobal->useEndPoint = 0; |
|
406 |
- |
|
407 |
-+ VMREST_LOG_INFO(pRESTHandle,"%s","C-REST_ENGINE: Library initialized ..."); |
|
408 |
-+ |
|
409 |
- cleanup: |
|
410 |
- |
|
411 |
- return dwError; |
|
412 |
-@@ -72,9 +69,13 @@ VmHTTPStart( |
|
413 |
- { |
|
414 |
- uint32_t dwError = REST_ENGINE_SUCCESS; |
|
415 |
- |
|
416 |
-- dwError = VmRESTInitProtocolServer(pRESTHandle); |
|
417 |
-+ dwError = VmRESTStartProtocolServer( |
|
418 |
-+ pRESTHandle |
|
419 |
-+ ); |
|
420 |
- BAIL_ON_VMREST_ERROR(dwError); |
|
421 |
- |
|
422 |
-+ VMREST_LOG_INFO(pRESTHandle,"%s","C-REST_ENGINE: Library started ..."); |
|
423 |
-+ |
|
424 |
- cleanup: |
|
425 |
- |
|
426 |
- return dwError; |
|
427 |
-@@ -132,14 +133,22 @@ VmHTTPStop( |
|
428 |
- { |
|
429 |
- uint32_t dwError = REST_ENGINE_SUCCESS; |
|
430 |
- |
|
431 |
-- VMREST_LOG_DEBUG(pRESTHandle,"%s","Shutting down rest engine ...."); |
|
432 |
-- dwError = VmRESTShutdownProtocolServer(pRESTHandle, waitSecond); |
|
433 |
-+ VMREST_LOG_INFO(pRESTHandle,"%s","C-REST_ENGINE: Stopping library ... No more requests will be accepted"); |
|
434 |
-+ |
|
435 |
-+ dwError = VmRESTStopProtocolServer( |
|
436 |
-+ pRESTHandle, |
|
437 |
-+ waitSecond |
|
438 |
-+ ); |
|
439 |
- BAIL_ON_VMREST_ERROR(dwError); |
|
440 |
- |
|
441 |
-+ VMREST_LOG_INFO(pRESTHandle,"%s", "C-REST-ENGINE: Library stopped ..."); |
|
442 |
-+ |
|
443 |
- cleanup: |
|
444 |
-- VMREST_LOG_DEBUG(pRESTHandle,"Stop returning %u", dwError); |
|
445 |
-+ |
|
446 |
- return dwError; |
|
447 |
- error: |
|
448 |
-+ |
|
449 |
-+ VMREST_LOG_ERROR(pRESTHandle,"C-REST-ENGINE: Library stop failed ... Do not attempt shutdown, dwError = %u", dwError); |
|
450 |
- goto cleanup; |
|
451 |
- } |
|
452 |
- |
|
453 |
-@@ -148,11 +157,13 @@ VmHTTPShutdown( |
|
454 |
- PVMREST_HANDLE pRESTHandle |
|
455 |
- ) |
|
456 |
- { |
|
457 |
-- VmwSockShutdown(pRESTHandle); |
|
458 |
-+ VMREST_LOG_INFO(pRESTHandle,"%s","C-REST-ENGINE: Shutting down Library"); |
|
459 |
-+ VmRESTShutdownProtocolServer( |
|
460 |
-+ pRESTHandle |
|
461 |
-+ ); |
|
462 |
- |
|
463 |
- if (pRESTHandle) |
|
464 |
- { |
|
465 |
-- VmRESTLogTerminate(pRESTHandle); |
|
466 |
- VmRESTFreeHandle(pRESTHandle); |
|
467 |
- } |
|
468 |
- } |
|
469 |
-diff --git a/server/restengine/libmain.c b/server/restengine/libmain.c |
|
470 |
-index a7b85a1..3992b76 100644 |
|
471 |
-+++ b/server/restengine/libmain.c |
|
472 |
-@@ -48,9 +48,9 @@ VmRESTInit( |
|
473 |
- uint32_t dwError = REST_ENGINE_SUCCESS; |
|
474 |
- PVMREST_HANDLE pRESTHandle = NULL; |
|
475 |
- |
|
476 |
-- if (!ppRESTHandle) |
|
477 |
-+ if (!pConfig || !ppRESTHandle) |
|
478 |
- { |
|
479 |
-- dwError = REST_ERROR_INVALID_HANDLER; |
|
480 |
-+ dwError = REST_ENGINE_ERROR_INVALID_PARAM; |
|
481 |
- } |
|
482 |
- BAIL_ON_VMREST_ERROR(dwError); |
|
483 |
- |
|
484 |
-@@ -69,6 +69,8 @@ VmRESTInit( |
|
485 |
- ); |
|
486 |
- BAIL_ON_VMREST_ERROR(dwError); |
|
487 |
- |
|
488 |
-+ pRESTHandle->instanceState = VMREST_INSTANCE_INITIALIZED; |
|
489 |
-+ |
|
490 |
- *ppRESTHandle = pRESTHandle; |
|
491 |
- |
|
492 |
- cleanup: |
|
493 |
-@@ -102,7 +104,7 @@ VmRESTSetSSLInfo( |
|
494 |
- |
|
495 |
- if (!pRESTHandle || !pDataBuffer || (bufferSize == 0) || (bufferSize > MAX_SSL_DATA_BUF_LEN) || (sslDataType < SSL_DATA_TYPE_KEY) || (sslDataType > SSL_DATA_TYPE_CERT)) |
|
496 |
- { |
|
497 |
-- dwError = REST_ERROR_INVALID_HANDLER; |
|
498 |
-+ dwError = REST_ENGINE_ERROR_INVALID_PARAM; |
|
499 |
- } |
|
500 |
- BAIL_ON_VMREST_ERROR(dwError); |
|
501 |
- |
|
502 |
-@@ -177,9 +179,9 @@ VmRESTStart( |
|
503 |
- uint32_t dwError = REST_ENGINE_SUCCESS; |
|
504 |
- int ret = 0; |
|
505 |
- |
|
506 |
-- if (!pRESTHandle) |
|
507 |
-+ if (!pRESTHandle || (pRESTHandle->instanceState != VMREST_INSTANCE_INITIALIZED)) |
|
508 |
- { |
|
509 |
-- dwError = REST_ERROR_INVALID_REST_PROCESSER; |
|
510 |
-+ dwError = REST_ENGINE_ERROR_INVALID_PARAM; |
|
511 |
- } |
|
512 |
- BAIL_ON_VMREST_ERROR(dwError); |
|
513 |
- |
|
514 |
-@@ -218,9 +220,14 @@ VmRESTStart( |
|
515 |
- BAIL_ON_VMREST_ERROR(dwError); |
|
516 |
- } |
|
517 |
- |
|
518 |
-+ pRESTHandle->instanceState = VMREST_INSTANCE_STARTED; |
|
519 |
-+ |
|
520 |
- cleanup: |
|
521 |
-+ |
|
522 |
- return dwError; |
|
523 |
-+ |
|
524 |
- error: |
|
525 |
-+ |
|
526 |
- goto cleanup; |
|
527 |
- |
|
528 |
- } |
|
529 |
-@@ -236,9 +243,9 @@ VmRESTRegisterHandler( |
|
530 |
- uint32_t dwError = REST_ENGINE_SUCCESS; |
|
531 |
- PREST_PROCESSOR pzHandler = NULL; |
|
532 |
- |
|
533 |
-- if (!pHandler || !pRESTHandle) |
|
534 |
-+ if (!pHandler || !pRESTHandle || (pRESTHandle->instanceState != VMREST_INSTANCE_INITIALIZED)) |
|
535 |
- { |
|
536 |
-- dwError = REST_ERROR_INVALID_REST_PROCESSER; |
|
537 |
-+ dwError = REST_ENGINE_ERROR_INVALID_PARAM; |
|
538 |
- } |
|
539 |
- BAIL_ON_VMREST_ERROR(dwError); |
|
540 |
- |
|
541 |
-@@ -292,6 +299,12 @@ VmRESTFindEndpoint( |
|
542 |
- PREST_ENDPOINT temp = NULL; |
|
543 |
- PREST_ENDPOINT pEndPoint = NULL; |
|
544 |
- |
|
545 |
-+ if (!pRESTHandle || !pszEndpoint || !ppEndpoint || (pRESTHandle->instanceState == VMREST_INSTANCE_UNINITIALIZED) || (pRESTHandle->instanceState == VMREST_INSTANCE_SHUTDOWN)) |
|
546 |
-+ { |
|
547 |
-+ dwError = REST_ENGINE_ERROR_INVALID_PARAM; |
|
548 |
-+ } |
|
549 |
-+ BAIL_ON_VMREST_ERROR(dwError); |
|
550 |
-+ |
|
551 |
- dwError = VmRestEngineGetEndPoint( |
|
552 |
- pRESTHandle, |
|
553 |
- (char*)pszEndpoint, |
|
554 |
-@@ -329,12 +342,18 @@ VmRESTFindEndpoint( |
|
555 |
- uint32_t |
|
556 |
- VmRESTUnRegisterHandler( |
|
557 |
- PVMREST_HANDLE pRESTHandle, |
|
558 |
-- char const* pzEndPointURI |
|
559 |
-+ char const* pcszEndPointURI |
|
560 |
- ) |
|
561 |
- { |
|
562 |
- uint32_t dwError = REST_ENGINE_SUCCESS; |
|
563 |
- |
|
564 |
-- if (!pzEndPointURI) |
|
565 |
-+ if (!pRESTHandle || !pcszEndPointURI || (pRESTHandle->instanceState != VMREST_INSTANCE_STOPPED)) |
|
566 |
-+ { |
|
567 |
-+ dwError = REST_ENGINE_ERROR_INVALID_PARAM; |
|
568 |
-+ } |
|
569 |
-+ BAIL_ON_VMREST_ERROR(dwError); |
|
570 |
-+ |
|
571 |
-+ if (!pcszEndPointURI) |
|
572 |
- { |
|
573 |
- /**** Interacting with HTTP directly ****/ |
|
574 |
- dwError = VmHTTPUnRegisterHandler( |
|
575 |
-@@ -346,7 +365,7 @@ VmRESTUnRegisterHandler( |
|
576 |
- /**** Endpoint based library instance ****/ |
|
577 |
- dwError = VmRestEngineRemoveEndpoint( |
|
578 |
- pRESTHandle, |
|
579 |
-- pzEndPointURI |
|
580 |
-+ pcszEndPointURI |
|
581 |
- ); |
|
582 |
- } |
|
583 |
- BAIL_ON_VMREST_ERROR(dwError); |
|
584 |
-@@ -365,12 +384,14 @@ VmRESTStop( |
|
585 |
- { |
|
586 |
- uint32_t dwError = REST_ENGINE_SUCCESS; |
|
587 |
- |
|
588 |
-- if (!pRESTHandle) |
|
589 |
-+ if (!pRESTHandle || (waitSeconds > MAX_STOP_WAIT_SECONDS) || (pRESTHandle->instanceState != VMREST_INSTANCE_STARTED)) |
|
590 |
- { |
|
591 |
-- dwError = REST_ERROR_INVALID_HANDLER; |
|
592 |
-+ dwError = REST_ENGINE_ERROR_INVALID_PARAM; |
|
593 |
- } |
|
594 |
- BAIL_ON_VMREST_ERROR(dwError); |
|
595 |
- |
|
596 |
-+ pRESTHandle->instanceState = VMREST_INSTANCE_STOPPED; |
|
597 |
-+ |
|
598 |
- dwError = VmHTTPStop( |
|
599 |
- pRESTHandle, |
|
600 |
- waitSeconds |
|
601 |
-@@ -388,14 +409,18 @@ VmRESTShutdown( |
|
602 |
- PVMREST_HANDLE pRESTHandle |
|
603 |
- ) |
|
604 |
- { |
|
605 |
-- if (pRESTHandle->pInstanceGlobal->useEndPoint == 1) |
|
606 |
-+ if (pRESTHandle && (pRESTHandle->instanceState == VMREST_INSTANCE_STOPPED)) |
|
607 |
- { |
|
608 |
-- VmRestEngineShutdownEndPointRegistration( |
|
609 |
-- pRESTHandle |
|
610 |
-- ); |
|
611 |
-+ pRESTHandle->instanceState = VMREST_INSTANCE_SHUTDOWN; |
|
612 |
-+ if (pRESTHandle->pInstanceGlobal->useEndPoint == 1) |
|
613 |
-+ { |
|
614 |
-+ VmRestEngineShutdownEndPointRegistration( |
|
615 |
-+ pRESTHandle |
|
616 |
-+ ); |
|
617 |
-+ } |
|
618 |
-+ |
|
619 |
-+ VmHTTPShutdown(pRESTHandle); |
|
620 |
- } |
|
621 |
-- |
|
622 |
-- VmHTTPShutdown(pRESTHandle); |
|
623 |
- } |
|
624 |
- |
|
625 |
- uint32_t |
|
626 |
-@@ -408,14 +433,28 @@ VmRESTGetData( |
|
627 |
- { |
|
628 |
- uint32_t dwError = REST_ENGINE_SUCCESS; |
|
629 |
- |
|
630 |
-+ if (!pRESTHandle || (pRESTHandle->instanceState != VMREST_INSTANCE_STARTED)) |
|
631 |
-+ { |
|
632 |
-+ dwError = REST_ENGINE_ERROR_INVALID_PARAM; |
|
633 |
-+ } |
|
634 |
-+ BAIL_ON_VMREST_ERROR(dwError); |
|
635 |
-+ |
|
636 |
- dwError = VmRESTGetHttpPayload( |
|
637 |
- pRESTHandle, |
|
638 |
- pRequest, |
|
639 |
- pBuffer, |
|
640 |
- bytesRead |
|
641 |
- ); |
|
642 |
-+ BAIL_ON_VMREST_ERROR(dwError); |
|
643 |
- |
|
644 |
-+cleanup: |
|
645 |
-+ |
|
646 |
- return dwError; |
|
647 |
-+ |
|
648 |
-+error: |
|
649 |
-+ |
|
650 |
-+ goto cleanup; |
|
651 |
-+ |
|
652 |
- } |
|
653 |
- |
|
654 |
- /*** GetData Zero copy API ****/ |
|
655 |
-@@ -427,14 +466,12 @@ VmRESTGetDataZC( |
|
656 |
- uint32_t* nBytes |
|
657 |
- ) |
|
658 |
- { |
|
659 |
-- |
|
660 |
-- |
|
661 |
- uint32_t dwError = REST_ENGINE_SUCCESS; |
|
662 |
- |
|
663 |
-- if (!pRESTHandle || !pRequest || !ppBuffer || !nBytes) |
|
664 |
-+ if (!pRESTHandle || !pRequest || !ppBuffer || !nBytes || (pRESTHandle->instanceState != VMREST_INSTANCE_STARTED)) |
|
665 |
- { |
|
666 |
- VMREST_LOG_ERROR(pRESTHandle,"%s","Invalid params"); |
|
667 |
-- dwError = VMREST_HTTP_INVALID_PARAMS; |
|
668 |
-+ dwError = REST_ENGINE_ERROR_INVALID_PARAM; |
|
669 |
- } |
|
670 |
- BAIL_ON_VMREST_ERROR(dwError); |
|
671 |
- |
|
672 |
-@@ -463,23 +500,38 @@ uint32_t |
|
673 |
- VmRESTSetData( |
|
674 |
- PVMREST_HANDLE pRESTHandle, |
|
675 |
- PREST_RESPONSE* ppResponse, |
|
676 |
-- char const* buffer, |
|
677 |
-+ char const* pcszBuffer, |
|
678 |
- uint32_t dataLen, |
|
679 |
- uint32_t* bytesWritten |
|
680 |
- ) |
|
681 |
- { |
|
682 |
- uint32_t dwError = REST_ENGINE_SUCCESS; |
|
683 |
- |
|
684 |
-+ |
|
685 |
-+ if (!pRESTHandle || !ppResponse || !pcszBuffer || !bytesWritten || (pRESTHandle->instanceState != VMREST_INSTANCE_STARTED)) |
|
686 |
-+ { |
|
687 |
-+ VMREST_LOG_ERROR(pRESTHandle,"%s","Invalid params"); |
|
688 |
-+ dwError = REST_ENGINE_ERROR_INVALID_PARAM; |
|
689 |
-+ } |
|
690 |
-+ BAIL_ON_VMREST_ERROR(dwError); |
|
691 |
-+ |
|
692 |
- dwError = VmRESTSetHttpPayload( |
|
693 |
- pRESTHandle, |
|
694 |
- ppResponse, |
|
695 |
-- buffer, |
|
696 |
-+ pcszBuffer, |
|
697 |
- dataLen, |
|
698 |
- bytesWritten |
|
699 |
- ); |
|
700 |
-+ BAIL_ON_VMREST_ERROR(dwError); |
|
701 |
-+ |
|
702 |
-+cleanup: |
|
703 |
- |
|
704 |
- return dwError; |
|
705 |
- |
|
706 |
-+error: |
|
707 |
-+ |
|
708 |
-+ goto cleanup; |
|
709 |
-+ |
|
710 |
- } |
|
711 |
- |
|
712 |
- /**** SetData Zero Copy API ****/ |
|
713 |
-@@ -487,21 +539,37 @@ uint32_t |
|
714 |
- VmRESTSetDataZC( |
|
715 |
- PVMREST_HANDLE pRESTHandle, |
|
716 |
- PREST_RESPONSE* ppResponse, |
|
717 |
-- char const* pBuffer, |
|
718 |
-+ char const* pcszBuffer, |
|
719 |
- uint32_t nBytes |
|
720 |
- ) |
|
721 |
- { |
|
722 |
- uint32_t dwError = REST_ENGINE_SUCCESS; |
|
723 |
- |
|
724 |
-+ |
|
725 |
-+ if (!pRESTHandle || !ppResponse || !pcszBuffer || (pRESTHandle->instanceState != VMREST_INSTANCE_STARTED)) |
|
726 |
-+ { |
|
727 |
-+ VMREST_LOG_ERROR(pRESTHandle,"%s","Invalid params"); |
|
728 |
-+ dwError = REST_ENGINE_ERROR_INVALID_PARAM; |
|
729 |
-+ } |
|
730 |
-+ BAIL_ON_VMREST_ERROR(dwError); |
|
731 |
-+ |
|
732 |
-+ |
|
733 |
- dwError = VmRESTSetHttpPayloadZeroCopy( |
|
734 |
- pRESTHandle, |
|
735 |
- ppResponse, |
|
736 |
-- pBuffer, |
|
737 |
-+ pcszBuffer, |
|
738 |
- nBytes |
|
739 |
- ); |
|
740 |
-+ BAIL_ON_VMREST_ERROR(dwError); |
|
741 |
-+ |
|
742 |
-+cleanup: |
|
743 |
- |
|
744 |
- return dwError; |
|
745 |
- |
|
746 |
-+error: |
|
747 |
-+ |
|
748 |
-+ goto cleanup; |
|
749 |
-+ |
|
750 |
- } |
|
751 |
- |
|
752 |
- uint32_t |
|
753 |
-@@ -513,6 +581,12 @@ VmRESTSetSuccessResponse( |
|
754 |
- uint32_t dwError = REST_ENGINE_SUCCESS; |
|
755 |
- char* connection = NULL; |
|
756 |
- |
|
757 |
-+ if (!pRequest || !ppResponse) |
|
758 |
-+ { |
|
759 |
-+ dwError = REST_ENGINE_ERROR_INVALID_PARAM; |
|
760 |
-+ } |
|
761 |
-+ BAIL_ON_VMREST_ERROR(dwError); |
|
762 |
-+ |
|
763 |
- dwError = VmRESTSetHttpStatusCode( |
|
764 |
- ppResponse, |
|
765 |
- "200" |
|
766 |
-@@ -571,8 +645,8 @@ VmRESTSetSuccessResponse( |
|
767 |
- uint32_t |
|
768 |
- VmRESTSetFailureResponse( |
|
769 |
- PREST_RESPONSE* ppResponse, |
|
770 |
-- char const* pErrorCode, |
|
771 |
-- char const* pErrorMessage |
|
772 |
-+ char const* pcszErrorCode, |
|
773 |
-+ char const* pcszErrorMessage |
|
774 |
- ) |
|
775 |
- { |
|
776 |
- uint32_t dwError = REST_ENGINE_SUCCESS; |
|
777 |
-@@ -584,22 +658,22 @@ VmRESTSetFailureResponse( |
|
778 |
- |
|
779 |
- /**** If error code and message is not provided, send internal server error ****/ |
|
780 |
- |
|
781 |
-- if (!pErrorCode) |
|
782 |
-+ if (!pcszErrorCode) |
|
783 |
- { |
|
784 |
- strcpy(errorCode,"500"); |
|
785 |
- } |
|
786 |
-- else if ((strlen(pErrorCode) > 0) && (strlen(pErrorCode) <= MAX_STATUS_LEN)) |
|
787 |
-+ else if ((strlen(pcszErrorCode) > 0) && (strlen(pcszErrorCode) <= MAX_STATUS_LEN)) |
|
788 |
- { |
|
789 |
-- strcpy(errorCode, pErrorCode); |
|
790 |
-+ strcpy(errorCode, pcszErrorCode); |
|
791 |
- } |
|
792 |
- |
|
793 |
-- if (!pErrorMessage) |
|
794 |
-+ if (!pcszErrorMessage) |
|
795 |
- { |
|
796 |
- strcpy(errorMessage, "Internal Server Error"); |
|
797 |
- } |
|
798 |
-- else if ((strlen(pErrorMessage) > 0) && (strlen(pErrorMessage) <= MAX_REA_PHRASE_LEN)) |
|
799 |
-+ else if ((strlen(pcszErrorMessage) > 0) && (strlen(pcszErrorMessage) <= MAX_REA_PHRASE_LEN)) |
|
800 |
- { |
|
801 |
-- strcpy(errorMessage, pErrorMessage); |
|
802 |
-+ strcpy(errorMessage, pcszErrorMessage); |
|
803 |
- } |
|
804 |
- |
|
805 |
- dwError = VmRESTSetHttpStatusCode( |
|
806 |
-diff --git a/transport/api/api.c b/transport/api/api.c |
|
807 |
-index c48de46..cc2c930 100644 |
|
808 |
-+++ b/transport/api/api.c |
|
809 |
-@@ -19,7 +19,7 @@ |
|
810 |
- #endif |
|
811 |
- |
|
812 |
- DWORD |
|
813 |
--VmwSockOpenServer( |
|
814 |
-+VmwSockStartServer( |
|
815 |
- PVMREST_HANDLE pRESTHandle, |
|
816 |
- VM_SOCK_CREATE_FLAGS dwFlags, |
|
817 |
- PVM_SOCKET* ppSocket |
|
818 |
-@@ -33,7 +33,7 @@ VmwSockOpenServer( |
|
819 |
- BAIL_ON_VMSOCK_ERROR(dwError); |
|
820 |
- } |
|
821 |
- |
|
822 |
-- dwError = pRESTHandle->pPackage->pfnOpenServerSocket( |
|
823 |
-+ dwError = pRESTHandle->pPackage->pfnStartServerSocket( |
|
824 |
- pRESTHandle, |
|
825 |
- dwFlags, |
|
826 |
- ppSocket); |
|
827 |
-@@ -64,7 +64,7 @@ VmwSockCreateEventQueue( |
|
828 |
- } |
|
829 |
- |
|
830 |
- DWORD |
|
831 |
--VmwSockEventQueueAdd( |
|
832 |
-+VmwSockAddEventToQueueInLock( |
|
833 |
- PVMREST_HANDLE pRESTHandle, |
|
834 |
- PVM_SOCK_EVENT_QUEUE pQueue, |
|
835 |
- PVM_SOCKET pSocket |
|
836 |
-@@ -78,13 +78,36 @@ VmwSockEventQueueAdd( |
|
837 |
- BAIL_ON_VMSOCK_ERROR(dwError); |
|
838 |
- } |
|
839 |
- |
|
840 |
-- dwError = pRESTHandle->pPackage->pfnAddEventQueue(pRESTHandle,pQueue, pSocket); |
|
841 |
-+ dwError = pRESTHandle->pPackage->pfnAddEventToQueue(pRESTHandle,pQueue, pSocket); |
|
842 |
- |
|
843 |
- error: |
|
844 |
- |
|
845 |
- return dwError; |
|
846 |
- } |
|
847 |
- |
|
848 |
-+DWORD |
|
849 |
-+VmwSockDeleteEventFromQueue( |
|
850 |
-+ PVMREST_HANDLE pRESTHandle, |
|
851 |
-+ PVM_SOCK_EVENT_QUEUE pQueue, |
|
852 |
-+ PVM_SOCKET pSocket |
|
853 |
-+ ) |
|
854 |
-+{ |
|
855 |
-+ DWORD dwError = REST_ENGINE_SUCCESS; |
|
856 |
-+ |
|
857 |
-+ if (!pQueue || !pSocket || !pRESTHandle) |
|
858 |
-+ { |
|
859 |
-+ dwError = ERROR_INVALID_PARAMETER; |
|
860 |
-+ BAIL_ON_VMSOCK_ERROR(dwError); |
|
861 |
-+ } |
|
862 |
-+ |
|
863 |
-+ dwError = pRESTHandle->pPackage->pfnDeleteEventFromQueue(pRESTHandle,pQueue, pSocket); |
|
864 |
-+ |
|
865 |
-+error: |
|
866 |
-+ |
|
867 |
-+ return dwError; |
|
868 |
-+} |
|
869 |
-+ |
|
870 |
-+ |
|
871 |
- DWORD |
|
872 |
- VmwSockWaitForEvent( |
|
873 |
- PVMREST_HANDLE pRESTHandle, |
|
874 |
-diff --git a/transport/posix/libmain.c b/transport/posix/libmain.c |
|
875 |
-index e7a5056..67c6023 100644 |
|
876 |
-+++ b/transport/posix/libmain.c |
|
877 |
-@@ -47,9 +47,10 @@ VmRESTGetSockPackagePosix( |
|
878 |
- |
|
879 |
- pSockPackagePosix = *ppSockPackagePosix; |
|
880 |
- |
|
881 |
-- pSockPackagePosix->pfnOpenServerSocket = &VmSockPosixOpenServer; |
|
882 |
-+ pSockPackagePosix->pfnStartServerSocket = &VmSockPosixStartServer; |
|
883 |
- pSockPackagePosix->pfnCreateEventQueue = &VmSockPosixCreateEventQueue; |
|
884 |
-- pSockPackagePosix->pfnAddEventQueue = &VmSockPosixEventQueueAdd; |
|
885 |
-+ pSockPackagePosix->pfnAddEventToQueue = &VmSockPosixAddEventToQueueInLock; |
|
886 |
-+ pSockPackagePosix->pfnDeleteEventFromQueue = &VmSockPosixDeleteEventFromQueue; |
|
887 |
- pSockPackagePosix->pfnWaitForEvent = &VmSockPosixWaitForEvent; |
|
888 |
- pSockPackagePosix->pfnCloseEventQueue = &VmSockPosixCloseEventQueue; |
|
889 |
- pSockPackagePosix->pfnRead = &VmSockPosixRead; |
|
890 |
-diff --git a/transport/posix/prototypes.h b/transport/posix/prototypes.h |
|
891 |
-index 4fa664c..d60e5e2 100644 |
|
892 |
-+++ b/transport/posix/prototypes.h |
|
893 |
-@@ -12,7 +12,7 @@ |
|
894 |
- */ |
|
895 |
- |
|
896 |
- DWORD |
|
897 |
--VmSockPosixOpenServer( |
|
898 |
-+VmSockPosixStartServer( |
|
899 |
- PVMREST_HANDLE pRESTHandle, |
|
900 |
- VM_SOCK_CREATE_FLAGS dwFlags, |
|
901 |
- PVM_SOCKET* ppSocket |
|
902 |
-@@ -25,7 +25,14 @@ VmSockPosixCreateEventQueue( |
|
903 |
- ); |
|
904 |
- |
|
905 |
- DWORD |
|
906 |
--VmSockPosixEventQueueAdd( |
|
907 |
-+VmSockPosixAddEventToQueueInLock( |
|
908 |
-+ PVMREST_HANDLE pRESTHandle, |
|
909 |
-+ PVM_SOCK_EVENT_QUEUE pQueue, |
|
910 |
-+ PVM_SOCKET pSocket |
|
911 |
-+ ); |
|
912 |
-+ |
|
913 |
-+DWORD |
|
914 |
-+VmSockPosixDeleteEventFromQueue( |
|
915 |
- PVMREST_HANDLE pRESTHandle, |
|
916 |
- PVM_SOCK_EVENT_QUEUE pQueue, |
|
917 |
- PVM_SOCKET pSocket |
|
918 |
-diff --git a/transport/posix/socket.c b/transport/posix/socket.c |
|
919 |
-index ec7ed3d..b34ef15 100644 |
|
920 |
-+++ b/transport/posix/socket.c |
|
921 |
-@@ -22,19 +22,12 @@ VmSockPosixCreateSignalSockets( |
|
922 |
- |
|
923 |
- static |
|
924 |
- DWORD |
|
925 |
--VmSockPosixEventQueueAdd_inlock( |
|
926 |
-+VmSockPosixAddEventToQueue( |
|
927 |
- PVM_SOCK_EVENT_QUEUE pQueue, |
|
928 |
- BOOLEAN bOneShot, |
|
929 |
- PVM_SOCKET pSocket |
|
930 |
- ); |
|
931 |
- |
|
932 |
--static |
|
933 |
--DWORD |
|
934 |
--VmSockPosixEventQueueDelete_inlock( |
|
935 |
-- PVM_SOCK_EVENT_QUEUE pQueue, |
|
936 |
-- PVM_SOCKET pSocket |
|
937 |
-- ); |
|
938 |
-- |
|
939 |
- static |
|
940 |
- DWORD |
|
941 |
- VmSockPosixAcceptConnection( |
|
942 |
-@@ -99,7 +92,7 @@ VmRESTCreateSSLObject( |
|
943 |
- |
|
944 |
- |
|
945 |
- DWORD |
|
946 |
--VmSockPosixOpenServer( |
|
947 |
-+VmSockPosixStartServer( |
|
948 |
- PVMREST_HANDLE pRESTHandle, |
|
949 |
- VM_SOCK_CREATE_FLAGS dwFlags, |
|
950 |
- PVM_SOCKET* ppSocket |
|
951 |
-@@ -388,7 +381,7 @@ VmSockPosixCreateEventQueue( |
|
952 |
- pQueue->bShutdown = 0; |
|
953 |
- pQueue->thrCnt = pRESTHandle->pRESTConfig->nWorkerThr; |
|
954 |
- |
|
955 |
-- dwError = VmSockPosixEventQueueAdd_inlock( |
|
956 |
-+ dwError = VmSockPosixAddEventToQueue( |
|
957 |
- pQueue, |
|
958 |
- FALSE, |
|
959 |
- pQueue->pSignalReader |
|
960 |
-@@ -420,7 +413,7 @@ VmSockPosixCreateEventQueue( |
|
961 |
- } |
|
962 |
- |
|
963 |
- DWORD |
|
964 |
--VmSockPosixEventQueueAdd( |
|
965 |
-+VmSockPosixAddEventToQueueInLock( |
|
966 |
- PVMREST_HANDLE pRESTHandle, |
|
967 |
- PVM_SOCK_EVENT_QUEUE pQueue, |
|
968 |
- PVM_SOCKET pSocket |
|
969 |
-@@ -441,7 +434,7 @@ VmSockPosixEventQueueAdd( |
|
970 |
- |
|
971 |
- bLocked = TRUE; |
|
972 |
- |
|
973 |
-- dwError = VmSockPosixEventQueueAdd_inlock( |
|
974 |
-+ dwError = VmSockPosixAddEventToQueue( |
|
975 |
- pQueue, |
|
976 |
- FALSE, |
|
977 |
- pSocket |
|
978 |
-@@ -462,6 +455,39 @@ VmSockPosixEventQueueAdd( |
|
979 |
- goto cleanup; |
|
980 |
- } |
|
981 |
- |
|
982 |
-+DWORD |
|
983 |
-+VmSockPosixDeleteEventFromQueue( |
|
984 |
-+ PVMREST_HANDLE pRESTHandle, |
|
985 |
-+ PVM_SOCK_EVENT_QUEUE pQueue, |
|
986 |
-+ PVM_SOCKET pSocket |
|
987 |
-+ ) |
|
988 |
-+{ |
|
989 |
-+ DWORD dwError = REST_ENGINE_SUCCESS; |
|
990 |
-+ struct epoll_event event = {0}; |
|
991 |
-+ |
|
992 |
-+ if (!pSocket || !pQueue || !pRESTHandle) |
|
993 |
-+ { |
|
994 |
-+ dwError = REST_ERROR_INVALID_HANDLER; |
|
995 |
-+ } |
|
996 |
-+ BAIL_ON_VMREST_ERROR(dwError); |
|
997 |
-+ |
|
998 |
-+ if (epoll_ctl(pQueue->epollFd, EPOLL_CTL_DEL, pSocket->fd, &event) < 0) |
|
999 |
-+ { |
|
1000 |
-+ dwError = VM_SOCK_POSIX_ERROR_SYS_CALL_FAILED; |
|
1001 |
-+ BAIL_ON_VMREST_ERROR(dwError); |
|
1002 |
-+ } |
|
1003 |
-+ |
|
1004 |
-+cleanup: |
|
1005 |
-+ |
|
1006 |
-+ return dwError; |
|
1007 |
-+ |
|
1008 |
-+error: |
|
1009 |
-+ |
|
1010 |
-+ goto cleanup; |
|
1011 |
-+ |
|
1012 |
-+} |
|
1013 |
-+ |
|
1014 |
-+ |
|
1015 |
- DWORD |
|
1016 |
- VmSockPosixWaitForEvent( |
|
1017 |
- PVMREST_HANDLE pRESTHandle, |
|
1018 |
-@@ -539,7 +565,8 @@ VmSockPosixWaitForEvent( |
|
1019 |
- if (pEvent->events & (EPOLLERR | EPOLLHUP)) |
|
1020 |
- { |
|
1021 |
- eventType = VM_SOCK_EVENT_TYPE_CONNECTION_CLOSED; |
|
1022 |
-- dwError = VmSockPosixEventQueueDelete_inlock( |
|
1023 |
-+ dwError = VmSockPosixDeleteEventFromQueue( |
|
1024 |
-+ pRESTHandle, |
|
1025 |
- pQueue, |
|
1026 |
- pEventSocket |
|
1027 |
- ); |
|
1028 |
-@@ -577,7 +604,7 @@ VmSockPosixWaitForEvent( |
|
1029 |
- } |
|
1030 |
- |
|
1031 |
- /**** Start watching new connection ****/ |
|
1032 |
-- dwError = VmSockPosixEventQueueAdd_inlock( |
|
1033 |
-+ dwError = VmSockPosixAddEventToQueue( |
|
1034 |
- pQueue, |
|
1035 |
- TRUE, |
|
1036 |
- pSocket |
|
1037 |
-@@ -639,6 +666,7 @@ VmSockPosixWaitForEvent( |
|
1038 |
- if (bFound) |
|
1039 |
- { |
|
1040 |
- VMREST_LOG_DEBUG(pRESTHandle,"Action: DEFERRED, IO sock found in queue(Succeeding), Io Sock %d, timer %d", pSocket->pIoSocket->fd, pSocket->fd ); |
|
1041 |
-+ pEventSocket->pIoSocket->pTimerSocket = NULL; |
|
1042 |
- } |
|
1043 |
- else |
|
1044 |
- { |
|
1045 |
-@@ -651,17 +679,30 @@ VmSockPosixWaitForEvent( |
|
1046 |
- { |
|
1047 |
- /**** We are good to close actual IO Socket here ****/ |
|
1048 |
- VMREST_LOG_INFO(pRESTHandle,"Action: IO DELETION, IoSocket %d, timer %d", pSocket->pIoSocket->fd, pSocket->fd ); |
|
1049 |
-- eventType = VM_SOCK_EVENT_TYPE_CONNECTION_TIMEOUT; |
|
1050 |
-- pSocket = pSocket->pIoSocket; |
|
1051 |
-- |
|
1052 |
-+ |
|
1053 |
-+ pSocket = pEventSocket->pIoSocket; |
|
1054 |
- /**** Delete IO from queue ****/ |
|
1055 |
-- VmSockPosixEventQueueDelete_inlock( |
|
1056 |
-+ VmSockPosixDeleteEventFromQueue( |
|
1057 |
-+ pRESTHandle, |
|
1058 |
- pQueue, |
|
1059 |
- pSocket |
|
1060 |
- ); |
|
1061 |
-+ |
|
1062 |
-+ if ((pRESTHandle->pSSLInfo->isSecure) && (!(pSocket->bSSLHandShakeCompleted))) |
|
1063 |
-+ { |
|
1064 |
-+ /**** SSL handshake is not completed, no response will be sent, free IoSocket ****/ |
|
1065 |
-+ pEventSocket->pIoSocket = NULL; |
|
1066 |
-+ VmSockPosixCloseSocket(pRESTHandle,pSocket); |
|
1067 |
-+ VmSockPosixReleaseSocket(pRESTHandle,pSocket); |
|
1068 |
-+ eventType = VM_SOCK_EVENT_TYPE_UNKNOWN; |
|
1069 |
-+ } |
|
1070 |
-+ else |
|
1071 |
-+ { |
|
1072 |
-+ eventType = VM_SOCK_EVENT_TYPE_CONNECTION_TIMEOUT; |
|
1073 |
-+ pEventSocket->pIoSocket->pTimerSocket = NULL; |
|
1074 |
-+ } |
|
1075 |
- } |
|
1076 |
- } |
|
1077 |
-- pEventSocket->pIoSocket->pTimerSocket = NULL; |
|
1078 |
- } |
|
1079 |
- |
|
1080 |
- /** Close and free the timer socket ****/ |
|
1081 |
-@@ -747,7 +788,14 @@ VmSockPosixWaitForEvent( |
|
1082 |
- |
|
1083 |
- error: |
|
1084 |
- |
|
1085 |
-- VMREST_LOG_ERROR(pRESTHandle,"Error while processing socket event, dwError = %u", dwError); |
|
1086 |
-+ if ((dwError == ERROR_SHUTDOWN_IN_PROGRESS) && pQueue) |
|
1087 |
-+ { |
|
1088 |
-+ VMREST_LOG_INFO(pRESTHandle,"C-REST-ENGINE: Shutting down...Cleaning worker thread %d", (pQueue->thrCnt + 1)); |
|
1089 |
-+ } |
|
1090 |
-+ else |
|
1091 |
-+ { |
|
1092 |
-+ VMREST_LOG_ERROR(pRESTHandle,"Error while processing socket event, dwError = %u", dwError); |
|
1093 |
-+ } |
|
1094 |
- if (ppSocket) |
|
1095 |
- { |
|
1096 |
- *ppSocket = NULL; |
|
1097 |
-@@ -987,10 +1035,11 @@ VmSockPosixRead( |
|
1098 |
- |
|
1099 |
- error: |
|
1100 |
- |
|
1101 |
-- if (pSocket && pRESTHandle->pSockContext) |
|
1102 |
-+ if (pSocket && pRESTHandle && pRESTHandle->pSockContext) |
|
1103 |
- { |
|
1104 |
- /**** Delete the socket from poller ****/ |
|
1105 |
-- VmSockPosixEventQueueDelete_inlock( |
|
1106 |
-+ VmSockPosixDeleteEventFromQueue( |
|
1107 |
-+ pRESTHandle, |
|
1108 |
- pRESTHandle->pSockContext->pEventQueue, |
|
1109 |
- pSocket |
|
1110 |
- ); |
|
1111 |
-@@ -1001,15 +1050,12 @@ VmSockPosixRead( |
|
1112 |
- |
|
1113 |
- if (pSocket->pTimerSocket) |
|
1114 |
- { |
|
1115 |
-+ pSocket->pTimerSocket->pIoSocket = NULL; |
|
1116 |
- VmSockPosixReArmTimer( |
|
1117 |
- pRESTHandle, |
|
1118 |
- pSocket->pTimerSocket, |
|
1119 |
-- ((pRESTHandle->pRESTConfig->connTimeoutSec) * 1000) |
|
1120 |
-+ 1 |
|
1121 |
- ); |
|
1122 |
-- |
|
1123 |
-- write(pSocket->pTimerSocket->fd, "NotifyPQ", 8); |
|
1124 |
-- pSocket->pTimerSocket->pIoSocket = NULL; |
|
1125 |
-- |
|
1126 |
- } |
|
1127 |
- |
|
1128 |
- } |
|
1129 |
-@@ -1191,7 +1237,7 @@ VmSockPosixCloseSocket( |
|
1130 |
- if (ret < 0) |
|
1131 |
- { |
|
1132 |
- errorCode = SSL_get_error(pSocket->ssl, ret); |
|
1133 |
-- VMREST_LOG_ERROR(pRESTHandle,"Error on SSL_shutdown on socket %d, return value %d, errorCode %u", pSocket->fd, ret, errorCode); |
|
1134 |
-+ VMREST_LOG_ERROR(pRESTHandle,"Error on SSL_shutdown on socket %d, return value %d, errorCode %u, errno %d", pSocket->fd, ret, errorCode, errno); |
|
1135 |
- } |
|
1136 |
- SSL_free(pSocket->ssl); |
|
1137 |
- pSocket->ssl = NULL; |
|
1138 |
-@@ -1303,7 +1349,7 @@ VmSockPosixCreateSignalSockets( |
|
1139 |
- |
|
1140 |
- static |
|
1141 |
- DWORD |
|
1142 |
--VmSockPosixEventQueueAdd_inlock( |
|
1143 |
-+VmSockPosixAddEventToQueue( |
|
1144 |
- PVM_SOCK_EVENT_QUEUE pQueue, |
|
1145 |
- BOOLEAN bOneShot, |
|
1146 |
- PVM_SOCKET pSocket |
|
1147 |
-@@ -1337,33 +1383,6 @@ VmSockPosixEventQueueAdd_inlock( |
|
1148 |
- return dwError; |
|
1149 |
- } |
|
1150 |
- |
|
1151 |
--static |
|
1152 |
--DWORD |
|
1153 |
--VmSockPosixEventQueueDelete_inlock( |
|
1154 |
-- PVM_SOCK_EVENT_QUEUE pQueue, |
|
1155 |
-- PVM_SOCKET pSocket |
|
1156 |
-- ) |
|
1157 |
--{ |
|
1158 |
-- DWORD dwError = REST_ENGINE_SUCCESS; |
|
1159 |
-- struct epoll_event event = {0}; |
|
1160 |
-- |
|
1161 |
-- if (!pSocket || !pQueue) |
|
1162 |
-- { |
|
1163 |
-- dwError = REST_ERROR_INVALID_HANDLER; |
|
1164 |
-- } |
|
1165 |
-- BAIL_ON_VMREST_ERROR(dwError); |
|
1166 |
-- |
|
1167 |
-- if (epoll_ctl(pQueue->epollFd, EPOLL_CTL_DEL, pSocket->fd, &event) < 0) |
|
1168 |
-- { |
|
1169 |
-- dwError = VM_SOCK_POSIX_ERROR_SYS_CALL_FAILED; |
|
1170 |
-- BAIL_ON_VMREST_ERROR(dwError); |
|
1171 |
-- } |
|
1172 |
-- |
|
1173 |
--error: |
|
1174 |
-- |
|
1175 |
-- return dwError; |
|
1176 |
--} |
|
1177 |
-- |
|
1178 |
- static |
|
1179 |
- DWORD |
|
1180 |
- VmSockPosixAcceptConnection( |
|
1181 |
-@@ -1637,7 +1656,8 @@ VmSockPosixSetRequestHandle( |
|
1182 |
- } |
|
1183 |
- |
|
1184 |
- /**** Delete actual IO socket from poller ****/ |
|
1185 |
-- dwError = VmSockPosixEventQueueDelete_inlock( |
|
1186 |
-+ dwError = VmSockPosixDeleteEventFromQueue( |
|
1187 |
-+ pRESTHandle, |
|
1188 |
- pQueue, |
|
1189 |
- pSocket |
|
1190 |
- ); |
|
1191 |
-@@ -1868,7 +1888,7 @@ VmSockPosixCreateTimer( |
|
1192 |
- ); |
|
1193 |
- BAIL_ON_VMREST_ERROR(dwError); |
|
1194 |
- |
|
1195 |
-- dwError = VmSockPosixEventQueueAdd_inlock( |
|
1196 |
-+ dwError = VmSockPosixAddEventToQueue( |
|
1197 |
- pRESTHandle->pSockContext->pEventQueue, |
|
1198 |
- TRUE, |
|
1199 |
- pTimerSocket |
|
1200 |
-@@ -1923,50 +1943,44 @@ VmRESTAcceptSSLContext( |
|
1201 |
- |
|
1202 |
- if (ret == 1) |
|
1203 |
- { |
|
1204 |
-- VMREST_LOG_DEBUG(pRESTHandle," SSL accept successful on socket %d, ret %d, errorCode %u", pSocket->fd, ret, errorCode); |
|
1205 |
-+ VMREST_LOG_DEBUG(pRESTHandle,"SSL accept successful on socket %d, ret %d, errorCode %u", pSocket->fd, ret, errorCode); |
|
1206 |
- pSocket->bSSLHandShakeCompleted = TRUE; |
|
1207 |
- bReArm = TRUE; |
|
1208 |
- } |
|
1209 |
- else if ((ret == -1) && ((errorCode == SSL_ERROR_WANT_READ) || (errorCode == SSL_ERROR_WANT_WRITE))) |
|
1210 |
- { |
|
1211 |
-- VMREST_LOG_DEBUG(pRESTHandle," SSL handshake not completed for socket %d, ret %d, errorCode %u", pSocket->fd, ret, errorCode); |
|
1212 |
-+ VMREST_LOG_DEBUG(pRESTHandle,"SSL handshake not completed for socket %d, ret %d, errorCode %u", pSocket->fd, ret, errorCode); |
|
1213 |
- pSocket->bSSLHandShakeCompleted = FALSE; |
|
1214 |
- bReArm = TRUE; |
|
1215 |
- } |
|
1216 |
-- else if ((ret == 0) && (errorCode == SSL_ERROR_SYSCALL)) |
|
1217 |
-+ else |
|
1218 |
- { |
|
1219 |
-- VMREST_LOG_ERROR(pRESTHandle," Client closed the connection during SSL handshake, socket fd %d, ret %d, errorCode %u, errno %d", pSocket->fd, ret, errorCode, errno); |
|
1220 |
-+ VMREST_LOG_ERROR(pRESTHandle,"SSL handshake failed on socket fd %d, ret %d, errorCode %u, errno %d", pSocket->fd, ret, errorCode, errno); |
|
1221 |
- dwError = VMREST_TRANSPORT_SSL_ACCEPT_FAILED; |
|
1222 |
- BAIL_ON_VMREST_ERROR(dwError); |
|
1223 |
- } |
|
1224 |
-- else |
|
1225 |
-+ |
|
1226 |
-+ if (bReArm && bWatched) |
|
1227 |
- { |
|
1228 |
-- VMREST_LOG_ERROR(pRESTHandle, "SSL handshake failed...connection will be closed for socket with fd %d, ret %d, errorCode %u, errno %d", pSocket->fd, ret, errorCode, errno); |
|
1229 |
-- dwError = VMREST_TRANSPORT_SSL_ACCEPT_FAILED; |
|
1230 |
-+ /**** Rearm and add the socket ****/ |
|
1231 |
-+ dwError = VmSockPosixReArmTimer( |
|
1232 |
-+ pRESTHandle, |
|
1233 |
-+ pSocket->pTimerSocket, |
|
1234 |
-+ ((pRESTHandle->pRESTConfig->connTimeoutSec) * 1000) |
|
1235 |
-+ ); |
|
1236 |
- BAIL_ON_VMREST_ERROR(dwError); |
|
1237 |
-- } |
|
1238 |
- |
|
1239 |
-- if (bReArm && bWatched) |
|
1240 |
-- { |
|
1241 |
-- /**** Rearm and add the socket ****/ |
|
1242 |
-- dwError = VmSockPosixReArmTimer( |
|
1243 |
-- pRESTHandle, |
|
1244 |
-- pSocket->pTimerSocket, |
|
1245 |
-- ((pRESTHandle->pRESTConfig->connTimeoutSec) * 1000) |
|
1246 |
-- ); |
|
1247 |
-- BAIL_ON_VMREST_ERROR(dwError); |
|
1248 |
-- |
|
1249 |
-- event.data.ptr = pSocket; |
|
1250 |
-- event.events = EPOLLIN; |
|
1251 |
-+ event.data.ptr = pSocket; |
|
1252 |
-+ event.events = EPOLLIN; |
|
1253 |
- |
|
1254 |
-- event.events = event.events | EPOLLONESHOT; |
|
1255 |
-+ event.events = event.events | EPOLLONESHOT; |
|
1256 |
- |
|
1257 |
-- if (epoll_ctl(pRESTHandle->pSockContext->pEventQueue->epollFd, EPOLL_CTL_MOD, pSocket->fd, &event) < 0) |
|
1258 |
-- { |
|
1259 |
-- dwError = VM_SOCK_POSIX_ERROR_SYS_CALL_FAILED; |
|
1260 |
-- BAIL_ON_VMREST_ERROR(dwError); |
|
1261 |
-- } |
|
1262 |
-- } |
|
1263 |
-+ if (epoll_ctl(pRESTHandle->pSockContext->pEventQueue->epollFd, EPOLL_CTL_MOD, pSocket->fd, &event) < 0) |
|
1264 |
-+ { |
|
1265 |
-+ dwError = VM_SOCK_POSIX_ERROR_SYS_CALL_FAILED; |
|
1266 |
-+ BAIL_ON_VMREST_ERROR(dwError); |
|
1267 |
-+ } |
|
1268 |
-+ } |
|
1269 |
- |
|
1270 |
- cleanup: |
|
1271 |
- |
|
1272 |
-@@ -1977,7 +1991,8 @@ VmRESTAcceptSSLContext( |
|
1273 |
- if (pRESTHandle && pRESTHandle->pSockContext) |
|
1274 |
- { |
|
1275 |
- /**** Delete from poller ****/ |
|
1276 |
-- VmSockPosixEventQueueDelete_inlock( |
|
1277 |
-+ VmSockPosixDeleteEventFromQueue( |
|
1278 |
-+ pRESTHandle, |
|
1279 |
- pRESTHandle->pSockContext->pEventQueue, |
|
1280 |
- pSocket |
|
1281 |
- ); |
1282 | 1 |
deleted file mode 100644 |
... | ... |
@@ -1,180 +0,0 @@ |
1 |
-From 3fbf376fe21d544bfe1373c17369fd8f916813da Mon Sep 17 00:00:00 2001 |
|
2 |
-From: Kumar Kaushik <kaushikk@vmware.com> |
|
3 |
-Date: Fri, 15 Dec 2017 18:36:44 -0800 |
|
4 |
-Subject: [PATCH] Adding minimal INFO level packet trace logging |
|
5 |
- |
|
6 |
-Change-Id: I932706c8446b44c70aa8a015852e28a65f0b4a16 |
|
7 |
-(cherry picked from commit 305dda1d5e242dd78f3e867232e6f0247b8fdf10) |
|
8 |
- server/restengine/httpProtocolHead.c | 19 ++++++++++++++++--- |
|
9 |
- server/restengine/httpUtilsExternal.c | 4 ++-- |
|
10 |
- server/restengine/restProtocolHead.c | 2 +- |
|
11 |
- transport/posix/socket.c | 6 ++++++ |
|
12 |
- 4 files changed, 25 insertions(+), 6 deletions(-) |
|
13 |
- |
|
14 |
-diff --git a/server/restengine/httpProtocolHead.c b/server/restengine/httpProtocolHead.c |
|
15 |
-index 0a1e5e5..18cff08 100644 |
|
16 |
-+++ b/server/restengine/httpProtocolHead.c |
|
17 |
-@@ -598,6 +598,7 @@ VmRESTSendHeader( |
|
18 |
- ); |
|
19 |
- buffer = NULL; |
|
20 |
- } |
|
21 |
-+ VMREST_LOG_ERROR(pRESTHandle,"%s","Sending header data failed"); |
|
22 |
- goto cleanup; |
|
23 |
- } |
|
24 |
- |
|
25 |
-@@ -669,6 +670,7 @@ VmRESTSendChunkedPayload( |
|
26 |
- ); |
|
27 |
- buffer = NULL; |
|
28 |
- } |
|
29 |
-+ VMREST_LOG_ERROR(pRESTHandle,"%s","Sending chunked payload data failed"); |
|
30 |
- goto cleanup; |
|
31 |
- } |
|
32 |
- |
|
33 |
-@@ -777,6 +779,7 @@ VmRESTSendHeaderAndPayload( |
|
34 |
- ); |
|
35 |
- buffer = NULL; |
|
36 |
- } |
|
37 |
-+ VMREST_LOG_ERROR(pRESTHandle,"%s","Sending header and payload data failed"); |
|
38 |
- goto cleanup; |
|
39 |
- } |
|
40 |
- |
|
41 |
-@@ -1209,6 +1212,7 @@ VmRESTProcessHeaders( |
|
42 |
- { |
|
43 |
- *nProcessed = 0; |
|
44 |
- } |
|
45 |
-+ VMREST_LOG_ERROR(pRESTHandle,"Failed while processing headers... dwError %u", dwError); |
|
46 |
- goto cleanup; |
|
47 |
- |
|
48 |
- } |
|
49 |
-@@ -1313,13 +1317,15 @@ VmRESTProcessPayload( |
|
50 |
- return dwError; |
|
51 |
- |
|
52 |
- error: |
|
53 |
-- VMREST_LOG_ERROR(pRESTHandle,"Errorcode %u", dwError); |
|
54 |
-- |
|
55 |
- if (dwError == REST_ENGINE_MORE_IO_REQUIRED) |
|
56 |
- { |
|
57 |
- *nProcessed = 0; |
|
58 |
- dwError = REST_ENGINE_SUCCESS; |
|
59 |
- } |
|
60 |
-+ else |
|
61 |
-+ { |
|
62 |
-+ VMREST_LOG_ERROR(pRESTHandle,"Failed while processing payload ... dwError %u", dwError); |
|
63 |
-+ } |
|
64 |
- goto cleanup; |
|
65 |
- |
|
66 |
- } |
|
67 |
-@@ -1396,12 +1402,17 @@ VmRESTProcessBuffer( |
|
68 |
- |
|
69 |
- case PROCESS_APPLICATION_CALLBACK: |
|
70 |
- /**** Give callback to application ****/ |
|
71 |
-- VMREST_LOG_DEBUG(pRESTHandle,"%s","Giving callback to application..."); |
|
72 |
-+ VMREST_LOG_INFO(pRESTHandle,"%s","C-REST-ENGINE: Giving callback to application..."); |
|
73 |
- dwError = VmRESTTriggerAppCb( |
|
74 |
- pRESTHandle, |
|
75 |
- pRequest, |
|
76 |
- &(pRequest->pResponse) |
|
77 |
- ); |
|
78 |
-+ VMREST_LOG_INFO(pRESTHandle,"C-REST-ENGINE: Application callback returns dwError %u", dwError); |
|
79 |
-+ if ((dwError != REST_ENGINE_SUCCESS) && pRequest && pRequest->pResponse && pRequest->pResponse->statusLine) |
|
80 |
-+ { |
|
81 |
-+ VMREST_LOG_INFO(pRESTHandle,"C-REST-ENGINE: Status code: %s, header sent %d", pRequest->pResponse->statusLine->statusCode, pRequest->pResponse->bHeaderSent); |
|
82 |
-+ } |
|
83 |
- BAIL_ON_VMREST_ERROR(dwError); |
|
84 |
- bInitiateClose = TRUE; |
|
85 |
- break; |
|
86 |
-@@ -1428,6 +1439,7 @@ VmRESTProcessBuffer( |
|
87 |
- |
|
88 |
- error: |
|
89 |
- |
|
90 |
-+ VMREST_LOG_ERROR(pRESTHandle,"Process buffer failed with error code %u, sending failure response", dwError); |
|
91 |
- ret = VmRESTSendFailureResponse( |
|
92 |
- pRESTHandle, |
|
93 |
- dwError, |
|
94 |
-@@ -1475,6 +1487,7 @@ VmRESTTriggerAppCb( |
|
95 |
- dwError = VMREST_APPLICATION_VALIDATION_FAILED; |
|
96 |
- } |
|
97 |
- BAIL_ON_VMREST_ERROR(dwError); |
|
98 |
-+ |
|
99 |
- |
|
100 |
- pRequest->state = PROCESS_INVALID; |
|
101 |
- |
|
102 |
-diff --git a/server/restengine/httpUtilsExternal.c b/server/restengine/httpUtilsExternal.c |
|
103 |
-index b75756d..a9e9222 100644 |
|
104 |
-+++ b/server/restengine/httpUtilsExternal.c |
|
105 |
-@@ -258,7 +258,7 @@ VmRESTGetHttpPayload( |
|
106 |
- |
|
107 |
- return dwError; |
|
108 |
- error: |
|
109 |
-- |
|
110 |
-+ VMREST_LOG_ERROR(pRESTHandle,"Get payload failed with error code %u", dwError); |
|
111 |
- goto cleanup; |
|
112 |
- |
|
113 |
- } |
|
114 |
-@@ -375,7 +375,7 @@ VmRESTSetHttpPayload( |
|
115 |
- cleanup: |
|
116 |
- return dwError; |
|
117 |
- error: |
|
118 |
-- VMREST_LOG_ERROR(pRESTHandle,"%s","Set Payload Failed"); |
|
119 |
-+ VMREST_LOG_ERROR(pRESTHandle,"Set Payload Failed with error Code %u", dwError); |
|
120 |
- goto cleanup; |
|
121 |
- } |
|
122 |
- |
|
123 |
-diff --git a/server/restengine/restProtocolHead.c b/server/restengine/restProtocolHead.c |
|
124 |
-index 0446d1a..53a5864 100644 |
|
125 |
-+++ b/server/restengine/restProtocolHead.c |
|
126 |
-@@ -76,7 +76,7 @@ VmRestEngineHandler( |
|
127 |
- ptr = NULL; |
|
128 |
- } |
|
129 |
- |
|
130 |
-- VMREST_LOG_DEBUG(pRESTHandle,"HTTP URI %s", httpURI); |
|
131 |
-+ VMREST_LOG_INFO(pRESTHandle,"C-REST-ENGINE: HTTP URI %s", httpURI); |
|
132 |
- |
|
133 |
- /**** 4. Get the End point from URI ****/ |
|
134 |
- dwError = VmRestGetEndPointURIfromRequestURI( |
|
135 |
-diff --git a/transport/posix/socket.c b/transport/posix/socket.c |
|
136 |
-index 18cef89..6c0e14e 100644 |
|
137 |
-+++ b/transport/posix/socket.c |
|
138 |
-@@ -553,10 +553,12 @@ VmSockPosixWaitForEvent( |
|
139 |
- } |
|
140 |
- else if (pEventSocket->type == VM_SOCK_TYPE_LISTENER) |
|
141 |
- { |
|
142 |
-+ VMREST_LOG_INFO(pRESTHandle,"%s","C-REST-ENGINE: ======================== NEW REQUEST =========================="); |
|
143 |
- dwError = VmSockPosixAcceptConnection( |
|
144 |
- pEventSocket, |
|
145 |
- &pSocket); |
|
146 |
- BAIL_ON_VMREST_ERROR(dwError); |
|
147 |
-+ VMREST_LOG_INFO(pRESTHandle,"C-REST-ENGINE: Accepted new connection with socket fd %d", pSocket->fd); |
|
148 |
- |
|
149 |
- dwError = VmSockPosixSetNonBlocking(pRESTHandle,pSocket); |
|
150 |
- BAIL_ON_VMREST_ERROR(dwError); |
|
151 |
-@@ -694,6 +696,7 @@ VmSockPosixWaitForEvent( |
|
152 |
- |
|
153 |
- error: |
|
154 |
- |
|
155 |
-+ VMREST_LOG_ERROR(pRESTHandle,"%s","Socket layer - wait for event error"); |
|
156 |
- if (ppSocket) |
|
157 |
- { |
|
158 |
- *ppSocket = NULL; |
|
159 |
-@@ -1077,6 +1080,7 @@ VmSockPosixWrite( |
|
160 |
- |
|
161 |
- error: |
|
162 |
- |
|
163 |
-+ VMREST_LOG_ERROR(pRESTHandle,"%s", "Socket write failed"); |
|
164 |
- goto cleanup; |
|
165 |
- } |
|
166 |
- |
|
167 |
-@@ -1114,6 +1118,8 @@ VmSockPosixCloseSocket( |
|
168 |
- } |
|
169 |
- BAIL_ON_VMREST_ERROR(dwError); |
|
170 |
- |
|
171 |
-+ VMREST_LOG_INFO(pRESTHandle,"C-REST-ENGINE: Closing socket with fd %d", pSocket->fd); |
|
172 |
-+ |
|
173 |
- dwError = VmRESTLockMutex(pSocket->pMutex); |
|
174 |
- BAIL_ON_VMREST_ERROR(dwError); |
|
175 |
- |
176 | 1 |
deleted file mode 100644 |
... | ... |
@@ -1,57 +0,0 @@ |
1 |
-From 36f7b88cfedf404ff8ef02ed2e2092ca963cb384 Mon Sep 17 00:00:00 2001 |
|
2 |
-From: Kumar Kaushik <kaushikk@vmware.com> |
|
3 |
-Date: Tue, 30 Jan 2018 18:30:46 -0800 |
|
4 |
-Subject: [PATCH] Improper request line parsing check |
|
5 |
- |
|
6 |
-Change-Id: I606bfd18efe8fe9cd4d9cf7533e4991e81c74ae2 |
|
7 |
- server/restengine/httpProtocolHead.c | 14 ++++++++++---- |
|
8 |
- 1 file changed, 10 insertions(+), 4 deletions(-) |
|
9 |
- |
|
10 |
-diff --git a/server/restengine/httpProtocolHead.c b/server/restengine/httpProtocolHead.c |
|
11 |
-index 95089a3..a7ca54a 100644 |
|
12 |
-+++ b/server/restengine/httpProtocolHead.c |
|
13 |
-@@ -1001,7 +1001,7 @@ VmRESTProcessRequestLine( |
|
14 |
- { |
|
15 |
- /**** 1. Parsing HTTP METHOD ****/ |
|
16 |
- pszFirstSpace = strchr(pszStartNewLine, ' '); |
|
17 |
-- if (pszFirstSpace != NULL && ((pszFirstSpace - pszStartNewLine) <= MAX_METHOD_LEN)) |
|
18 |
-+ if (pszFirstSpace != NULL && ((pszFirstSpace - pszStartNewLine) <= MAX_METHOD_LEN) && ((pszFirstSpace - pszStartNewLine) > 0)) |
|
19 |
- { |
|
20 |
- strncpy(pRequest->requestLine->method, pszStartNewLine, (pszFirstSpace - pszStartNewLine)); |
|
21 |
- pRequest->requestLine->method[pszFirstSpace - pszStartNewLine] = '\0'; |
|
22 |
-@@ -1016,13 +1016,13 @@ VmRESTProcessRequestLine( |
|
23 |
- /**** 2. Parse HTTP URI****/ |
|
24 |
- pszSecondSpace = strchr((pszFirstSpace + 1), ' '); |
|
25 |
- |
|
26 |
-- if (pszSecondSpace != NULL && ((pszSecondSpace - pszFirstSpace) < MAX_URI_LEN)) |
|
27 |
-+ if (pszSecondSpace != NULL && ((pszSecondSpace - pszFirstSpace) < MAX_URI_LEN) && ((pszSecondSpace - pszFirstSpace) > 0)) |
|
28 |
- { |
|
29 |
- strncpy(pRequest->requestLine->uri, (pszFirstSpace + 1), (pszSecondSpace - pszFirstSpace - 1)); |
|
30 |
- pRequest->requestLine->uri[pszSecondSpace - pszFirstSpace - 1] = '\0'; |
|
31 |
- |
|
32 |
- /**** 3. Parse HTTP Version ****/ |
|
33 |
-- if ((pszEndNewLine - pszSecondSpace - 1) <= HTTP_VER_LEN) |
|
34 |
-+ if (((pszEndNewLine - pszSecondSpace - 1) <= HTTP_VER_LEN) && ((pszEndNewLine - pszSecondSpace - 1) > 0)) |
|
35 |
- { |
|
36 |
- strncpy(pRequest->requestLine->version, (pszSecondSpace + 1), (pszEndNewLine - pszSecondSpace - 1)); |
|
37 |
- pRequest->requestLine->version[pszEndNewLine - pszSecondSpace - 1] = '\0'; |
|
38 |
-@@ -1198,10 +1198,16 @@ VmRESTProcessHeaders( |
|
39 |
- BAIL_ON_VMREST_ERROR(dwError); |
|
40 |
- } |
|
41 |
- } |
|
42 |
-- else /**** pszEndNewLine = NULL ****/ |
|
43 |
-+ else if (nBytes < MAX_REQ_LIN_LEN) /**** pszEndNewLine = NULL ****/ |
|
44 |
- { |
|
45 |
- VMREST_LOG_DEBUG(pRESTHandle,"Incomplete line processing.. wait for IO.., bytesProcessed %u, nBytes %u", bytesProcessed, nBytes); |
|
46 |
- } |
|
47 |
-+ else |
|
48 |
-+ { |
|
49 |
-+ dwError = BAD_REQUEST; |
|
50 |
-+ BAIL_ON_VMREST_ERROR(dwError); |
|
51 |
-+ } |
|
52 |
-+ |
|
53 |
- |
|
54 |
- cleanup: |
|
55 |
- |
56 | 1 |
deleted file mode 100644 |
... | ... |
@@ -1,54 +0,0 @@ |
1 |
-diff -ru c-rest-engine-1.1/transport/posix/defines.h c-rest-engine-1.1-modified/transport/posix/defines.h |
|
2 |
-+++ c-rest-engine-1.1-modified/transport/posix/defines.h 2017-11-10 15:56:01.170279430 -0800 |
|
3 |
-@@ -50,6 +50,7 @@ |
|
4 |
- |
|
5 |
- /**** Transport internal error codes ****/ |
|
6 |
- #define VM_SOCK_POSIX_ERROR_SYS_CALL_FAILED 5100 |
|
7 |
-+#define VM_SOCK_POSIX_ERROR_BROKEN_PIPE 5101 |
|
8 |
- #define MAX_RETRY_ATTEMPTS 50000 |
|
9 |
- |
|
10 |
- |
|
11 |
-diff -ru c-rest-engine-1.1/transport/posix/socket.c c-rest-engine-1.1-modified/transport/posix/socket.c |
|
12 |
-+++ c-rest-engine-1.1-modified/transport/posix/socket.c 2017-11-10 15:55:25.410277664 -0800 |
|
13 |
-@@ -879,10 +879,16 @@ |
|
14 |
- { |
|
15 |
- dwError = REST_ENGINE_SUCCESS; |
|
16 |
- } |
|
17 |
-- else |
|
18 |
-+ else if (nRead < 0) |
|
19 |
- { |
|
20 |
-+ VMREST_LOG_ERROR(pRESTHandle, "Socket read failed with error code %u", errorCode); |
|
21 |
- dwError = errorCode; |
|
22 |
- } |
|
23 |
-+ else if (nRead == 0) |
|
24 |
-+ { |
|
25 |
-+ VMREST_LOG_ERROR(pRESTHandle,"%s", "Socket read failed due to broken pipe"); |
|
26 |
-+ dwError = VM_SOCK_POSIX_ERROR_BROKEN_PIPE; |
|
27 |
-+ } |
|
28 |
- BAIL_ON_VMREST_ERROR(dwError); |
|
29 |
- |
|
30 |
- if (nPrevBuf >= pRESTHandle->pRESTConfig->maxDataPerConnMB) |
|
31 |
-@@ -980,7 +986,7 @@ |
|
32 |
- nWritten = write(pSocket->fd, (pszBuffer + nWrittenTotal) ,nRemaining); |
|
33 |
- errorCode = errno; |
|
34 |
- } |
|
35 |
-- if (nWritten >= 0) |
|
36 |
-+ if (nWritten > 0) |
|
37 |
- { |
|
38 |
- nWrittenTotal += nWritten; |
|
39 |
- nRemaining -= nWritten; |
|
40 |
-@@ -1017,6 +1023,12 @@ |
|
41 |
- BAIL_ON_VMREST_ERROR(dwError); |
|
42 |
- } |
|
43 |
- } |
|
44 |
-+ else |
|
45 |
-+ { |
|
46 |
-+ dwError = VM_SOCK_POSIX_ERROR_SYS_CALL_FAILED; |
|
47 |
-+ VMREST_LOG_ERROR(pRESTHandle,"Socket write failed with error code %u, dwError %u, nWritten %d", errorCode, dwError, nWritten); |
|
48 |
-+ BAIL_ON_VMREST_ERROR(dwError); |
|
49 |
-+ } |
|
50 |
- } |
|
51 |
- } |
|
52 |
- VMREST_LOG_DEBUG(pRESTHandle,"\nWrite Status on Socket with fd = %d\nRequested: %d nBufLen\nWritten %d bytes\n", pSocket->fd, nBufLen, nWrittenTotal); |
53 | 1 |
deleted file mode 100644 |
... | ... |
@@ -1,94 +0,0 @@ |
1 |
-From 8afe888fb34b1d121bae7701c51d0e7d0c96cbb5 Mon Sep 17 00:00:00 2001 |
|
2 |
-From: Kumar Kaushik <kaushikk@vmware.com> |
|
3 |
-Date: Mon, 20 Nov 2017 15:21:56 -0800 |
|
4 |
-Subject: [PATCH] Adding more debug for socket read failures |
|
5 |
- |
|
6 |
-Change-Id: I85b10413b4fe9273a11e46da038aa2e31ffd0318 |
|
7 |
-(cherry picked from commit a0c4357aca99a08a28d10875aff87c6e3d1798be) |
|
8 |
- common/sockinterface.c | 11 +++++------ |
|
9 |
- transport/posix/socket.c | 27 ++++++++++++++++++++++++++- |
|
10 |
- 2 files changed, 31 insertions(+), 7 deletions(-) |
|
11 |
- |
|
12 |
-diff --git a/common/sockinterface.c b/common/sockinterface.c |
|
13 |
-index a53c4a5..403189c 100644 |
|
14 |
-+++ b/common/sockinterface.c |
|
15 |
-@@ -521,11 +521,10 @@ VmRESTTcpReceiveNewData( |
|
16 |
- { |
|
17 |
- VMREST_LOG_DEBUG(pRESTHandle,"%s","Calling closed connection...."); |
|
18 |
- /**** Close connection ****/ |
|
19 |
-- dwError = VmRESTDisconnectClient( |
|
20 |
-- pRESTHandle, |
|
21 |
-- pSocket |
|
22 |
-- ); |
|
23 |
-- BAIL_ON_VMREST_ERROR(dwError); |
|
24 |
-+ VmRESTDisconnectClient( |
|
25 |
-+ pRESTHandle, |
|
26 |
-+ pSocket |
|
27 |
-+ ); |
|
28 |
- |
|
29 |
- /**** free request object memory ****/ |
|
30 |
- if (pRequest) |
|
31 |
-@@ -542,7 +541,7 @@ VmRESTTcpReceiveNewData( |
|
32 |
- |
|
33 |
- error: |
|
34 |
- |
|
35 |
-- VMREST_LOG_DEBUG(pRESTHandle,"ERROR code %u", dwError); |
|
36 |
-+ VMREST_LOG_ERROR(pRESTHandle,"ERROR code %u", dwError); |
|
37 |
- goto cleanup; |
|
38 |
- } |
|
39 |
- |
|
40 |
-diff --git a/transport/posix/socket.c b/transport/posix/socket.c |
|
41 |
-index 029633a..79c7a38 100644 |
|
42 |
-+++ b/transport/posix/socket.c |
|
43 |
-@@ -539,6 +539,8 @@ VmSockPosixWaitForEvent( |
|
44 |
- BAIL_ON_VMREST_ERROR(dwError); |
|
45 |
- } |
|
46 |
- |
|
47 |
-+ VMREST_LOG_DEBUG(pRESTHandle,"Notification on socket fd %d", pEventSocket->fd); |
|
48 |
-+ |
|
49 |
- if (pEvent->events & (EPOLLERR | EPOLLHUP)) |
|
50 |
- { |
|
51 |
- eventType = VM_SOCK_EVENT_TYPE_CONNECTION_CLOSED; |
|
52 |
-@@ -919,8 +921,23 @@ VmSockPosixRead( |
|
53 |
- |
|
54 |
- error: |
|
55 |
- |
|
56 |
-- if (pszBufPrev && pSocket) |
|
57 |
-+ if (pSocket) |
|
58 |
-+ { |
|
59 |
-+ VMREST_LOG_ERROR(pRESTHandle,"Socket read failed with Socket fd %d, dwError = %u, nRead = %d, errno = %u, errorCode = %u", pSocket->fd, dwError, nRead, errno, errorCode); |
|
60 |
-+ } |
|
61 |
-+ else |
|
62 |
-+ { |
|
63 |
-+ VMREST_LOG_ERROR(pRESTHandle,"Socket read failed with dwError = %u, nRead = %d, errno = %u, errorCode = %u", dwError, nRead, errno, errorCode); |
|
64 |
-+ } |
|
65 |
-+ |
|
66 |
-+ if (pszBufPrev && pSocket && pRESTHandle->pSockContext) |
|
67 |
- { |
|
68 |
-+ /**** Delete the socket from poller ****/ |
|
69 |
-+ VmSockPosixEventQueueDelete_inlock( |
|
70 |
-+ pRESTHandle->pSockContext->pEventQueue, |
|
71 |
-+ pSocket |
|
72 |
-+ ); |
|
73 |
-+ |
|
74 |
- VmRESTFreeMemory(pszBufPrev); |
|
75 |
- pszBufPrev = NULL; |
|
76 |
- pSocket->pszBuffer = NULL; |
|
77 |
-@@ -1542,6 +1559,14 @@ VmSockPosixSetRequestHandle( |
|
78 |
- pSocket->pTimerSocket |
|
79 |
- ); |
|
80 |
- BAIL_ON_VMREST_ERROR(dwError); |
|
81 |
-+ |
|
82 |
-+ /**** Delete actual IO socket from poller ****/ |
|
83 |
-+ dwError = VmSockPosixEventQueueDelete_inlock( |
|
84 |
-+ pQueue, |
|
85 |
-+ pSocket |
|
86 |
-+ ); |
|
87 |
-+ BAIL_ON_VMREST_ERROR(dwError); |
|
88 |
-+ |
|
89 |
- if (pSocket->pTimerSocket->fd > 0) |
|
90 |
- { |
|
91 |
- close(pSocket->pTimerSocket->fd); |
92 | 1 |
deleted file mode 100644 |
... | ... |
@@ -1,123 +0,0 @@ |
1 |
-From a7aba08f7fd2700c92fd9661eee212755ba8795e Mon Sep 17 00:00:00 2001 |
|
2 |
-From: Kumar Kaushik <kaushikk@vmware.com> |
|
3 |
-Date: Thu, 7 Dec 2017 12:53:17 -0800 |
|
4 |
-Subject: [PATCH] Fixing tls: unexpected message ERROR |
|
5 |
- |
|
6 |
-Change-Id: I63dce89d4dcfa445b6594d4b776ef8827f1498ff |
|
7 |
-(cherry picked from commit 424f6d0f3435eccad781d39ef0c656a00395dc46) |
|
8 |
- transport/posix/socket.c | 34 +++++++++++++++++++++++----------- |
|
9 |
- 1 file changed, 23 insertions(+), 11 deletions(-) |
|
10 |
- |
|
11 |
-diff --git a/transport/posix/socket.c b/transport/posix/socket.c |
|
12 |
-index d3a3dbc..18cef89 100644 |
|
13 |
-+++ b/transport/posix/socket.c |
|
14 |
-@@ -576,7 +576,6 @@ VmSockPosixWaitForEvent( |
|
15 |
- FALSE |
|
16 |
- ); |
|
17 |
- BAIL_ON_VMREST_ERROR(dwError); |
|
18 |
-- |
|
19 |
- } |
|
20 |
- |
|
21 |
- dwError = VmSockPosixEventQueueAdd_inlock( |
|
22 |
-@@ -895,7 +894,7 @@ VmSockPosixRead( |
|
23 |
- } |
|
24 |
- else |
|
25 |
- { |
|
26 |
-- VMREST_LOG_ERROR(pRESTHandle,"%s","Unknown socket read error: errno %u, errorCode %u, nRead %d", errno, errorCode, nRead); |
|
27 |
-+ VMREST_LOG_ERROR(pRESTHandle,"Unknown socket read error: errno %u, errorCode %u, nRead %d", errno, errorCode, nRead); |
|
28 |
- dwError = REST_ENGINE_FAILURE; |
|
29 |
- } |
|
30 |
- } |
|
31 |
-@@ -1007,6 +1006,9 @@ VmSockPosixWrite( |
|
32 |
- |
|
33 |
- while(nWrittenTotal < nBufLen ) |
|
34 |
- { |
|
35 |
-+ nWritten = 0; |
|
36 |
-+ errorCode = 0; |
|
37 |
-+ errno = 0; |
|
38 |
- if (pRESTHandle->pSSLInfo->isSecure && (pSocket->ssl != NULL)) |
|
39 |
- { |
|
40 |
- nWritten = SSL_write(pSocket->ssl,(pszBuffer + nWrittenTotal),nRemaining); |
|
41 |
-@@ -1030,7 +1032,7 @@ VmSockPosixWrite( |
|
42 |
- } |
|
43 |
- else |
|
44 |
- { |
|
45 |
-- if (errorCode == EAGAIN || errorCode == EWOULDBLOCK || errorCode == SSL_ERROR_WANT_WRITE) |
|
46 |
-+ if ((nWritten < 0) && (errorCode == EAGAIN || errorCode == EWOULDBLOCK || errorCode == SSL_ERROR_WANT_WRITE)) |
|
47 |
- { |
|
48 |
- if (timeOutSec >= 0) |
|
49 |
- { |
|
50 |
-@@ -1101,6 +1103,8 @@ VmSockPosixCloseSocket( |
|
51 |
- ) |
|
52 |
- { |
|
53 |
- DWORD dwError = REST_ENGINE_SUCCESS; |
|
54 |
-+ int ret = 0; |
|
55 |
-+ uint32_t errorCode = 0; |
|
56 |
- BOOLEAN bLocked = FALSE; |
|
57 |
- |
|
58 |
- if (!pRESTHandle || !pSocket ) |
|
59 |
-@@ -1121,18 +1125,24 @@ VmSockPosixCloseSocket( |
|
60 |
- pSocket->pTimerSocket->fd = -1; |
|
61 |
- } |
|
62 |
- |
|
63 |
-+ if (pRESTHandle->pSSLInfo->isSecure && pSocket->ssl) |
|
64 |
-+ { |
|
65 |
-+ ret = SSL_shutdown(pSocket->ssl); |
|
66 |
-+ if (ret < 0) |
|
67 |
-+ { |
|
68 |
-+ errorCode = SSL_get_error(pSocket->ssl, ret); |
|
69 |
-+ VMREST_LOG_ERROR(pRESTHandle,"Error on SSL_shutdown on socket %d, return value %d, errorCode %u", pSocket->fd, ret, errorCode); |
|
70 |
-+ } |
|
71 |
-+ SSL_free(pSocket->ssl); |
|
72 |
-+ pSocket->ssl = NULL; |
|
73 |
-+ } |
|
74 |
-+ |
|
75 |
- if (pSocket->fd >= 0) |
|
76 |
- { |
|
77 |
- close(pSocket->fd); |
|
78 |
- pSocket->fd = -1; |
|
79 |
- } |
|
80 |
- |
|
81 |
-- if (pRESTHandle->pSSLInfo->isSecure && pSocket->ssl) |
|
82 |
-- { |
|
83 |
-- SSL_shutdown(pSocket->ssl); |
|
84 |
-- SSL_free(pSocket->ssl); |
|
85 |
-- pSocket->ssl = NULL; |
|
86 |
-- } |
|
87 |
- |
|
88 |
- cleanup: |
|
89 |
- |
|
90 |
-@@ -1742,6 +1752,7 @@ VmSockPosixIsSafeToCloseConnOnTimeOut( |
|
91 |
- BAIL_ON_VMREST_ERROR(dwError); |
|
92 |
- |
|
93 |
- pSocket = pTimerSocket->pIoSocket; |
|
94 |
-+ errno = 0; |
|
95 |
- |
|
96 |
- if ((pRESTHandle->pSSLInfo->isSecure) && (pSocket->ssl)) |
|
97 |
- { |
|
98 |
-@@ -1771,6 +1782,7 @@ VmSockPosixIsSafeToCloseConnOnTimeOut( |
|
99 |
- do |
|
100 |
- { |
|
101 |
- errorCode = 0; |
|
102 |
-+ errno = 0; |
|
103 |
- nRead = 0; |
|
104 |
- nRead = read(pTimerSocket->fd, &res, sizeof(res)); |
|
105 |
- errorCode = errno; |
|
106 |
-@@ -1918,13 +1930,13 @@ VmRESTAcceptSSLContext( |
|
107 |
- } |
|
108 |
- else if ((ret == -1) && ((errorCode == SSL_ERROR_WANT_READ) || (errorCode == SSL_ERROR_WANT_WRITE))) |
|
109 |
- { |
|
110 |
-- VMREST_LOG_DEBUG(pRESTHandle,"SSL handshake not completed for socket %d", pSocket->fd); |
|
111 |
-+ VMREST_LOG_DEBUG(pRESTHandle," SSL handshake not completed for socket %d, ret %d, errorCode %u", pSocket->fd, ret, errorCode); |
|
112 |
- pSocket->bSSLHandShakeCompleted = FALSE; |
|
113 |
- bReArm = TRUE; |
|
114 |
- } |
|
115 |
- else |
|
116 |
- { |
|
117 |
-- VMREST_LOG_ERROR(pRESTHandle, "SSL handshake failed...connection will be closed for socket with fd %d", pSocket->fd); |
|
118 |
-+ VMREST_LOG_ERROR(pRESTHandle, "SSL handshake failed...connection will be closed for socket with fd %d, ret %d, errorCode %u", pSocket->fd, ret, errorCode); |
|
119 |
- dwError = VMREST_TRANSPORT_SSL_ACCEPT_FAILED; |
|
120 |
- BAIL_ON_VMREST_ERROR(dwError); |
|
121 |
- } |
122 | 1 |
deleted file mode 100644 |
... | ... |
@@ -1,151 +0,0 @@ |
1 |
-From 56c8c0ffd82c8fe8c396d8c00f23688adcdc9ecd Mon Sep 17 00:00:00 2001 |
|
2 |
-From: Kumar Kaushik <kaushikk@vmware.com> |
|
3 |
-Date: Wed, 15 Nov 2017 17:24:44 -0800 |
|
4 |
-Subject: [PATCH] Remove init/shutdown of syslog from library |
|
5 |
- |
|
6 |
-Change-Id: I7705f44c468d2ce69a15b531e108ef0cfbe391b8 |
|
7 |
- build/package/rpm/c-rest-engine.spec | 4 +++- |
|
8 |
- common/logging.c | 45 ++++++++---------------------------- |
|
9 |
- server/vmrestd/main.c | 8 ++++++- |
|
10 |
- 3 files changed, 20 insertions(+), 37 deletions(-) |
|
11 |
- |
|
12 |
-diff --git a/build/package/rpm/c-rest-engine.spec b/build/package/rpm/c-rest-engine.spec |
|
13 |
-index 8730113..02c1e62 100644 |
|
14 |
-+++ b/build/package/rpm/c-rest-engine.spec |
|
15 |
-@@ -1,7 +1,7 @@ |
|
16 |
- Name: c-rest-engine |
|
17 |
- Summary: Minimal http(s) server library |
|
18 |
- Version: 1.1 |
|
19 |
--Release: 1%{?dist} |
|
20 |
-+Release: 3%{?dist} |
|
21 |
- Group: Applications/System |
|
22 |
- Vendor: VMware, Inc. |
|
23 |
- License: Apache 2.0 |
|
24 |
-diff --git a/common/logging.c b/common/logging.c |
|
25 |
-index 6bef25c..385c0b6 100644 |
|
26 |
-+++ b/common/logging.c |
|
27 |
-@@ -41,13 +41,7 @@ VmRESTLogInitialize( |
|
28 |
- } |
|
29 |
- BAIL_ON_VMREST_ERROR(dwError); |
|
30 |
- |
|
31 |
-- if (pRESTHandle->pRESTConfig->useSysLog) |
|
32 |
-- { |
|
33 |
-- /**** Use syslog ****/ |
|
34 |
-- openlog(pRESTHandle->pRESTConfig->pszDaemonName, 0, LOG_DAEMON); |
|
35 |
-- setlogmask(LOG_UPTO(logLevelToSysLogLevel(pRESTHandle->debugLogLevel))); |
|
36 |
-- } |
|
37 |
-- else if (!(IsNullOrEmptyString(pRESTHandle->pRESTConfig->pszDebugLogFile))) |
|
38 |
-+ if ((!(IsNullOrEmptyString(pRESTHandle->pRESTConfig->pszDebugLogFile))) && (pRESTHandle->pRESTConfig->useSysLog == FALSE)) |
|
39 |
- { |
|
40 |
- if ((pRESTHandle->logFile = fopen(pRESTHandle->pRESTConfig->pszDebugLogFile, "a")) == NULL) |
|
41 |
- { |
|
42 |
-@@ -55,10 +49,6 @@ VmRESTLogInitialize( |
|
43 |
- dwError = REST_ENGINE_FAILURE; |
|
44 |
- } |
|
45 |
- } |
|
46 |
-- else |
|
47 |
-- { |
|
48 |
-- dwError = REST_ENGINE_FAILURE; |
|
49 |
-- } |
|
50 |
- BAIL_ON_VMREST_ERROR(dwError); |
|
51 |
- |
|
52 |
- cleanup: |
|
53 |
-@@ -76,11 +66,7 @@ VmRESTLogTerminate( |
|
54 |
- PVMREST_HANDLE pRESTHandle |
|
55 |
- ) |
|
56 |
- { |
|
57 |
-- if (pRESTHandle && pRESTHandle->pRESTConfig->useSysLog) |
|
58 |
-- { |
|
59 |
-- closelog(); |
|
60 |
-- } |
|
61 |
-- else if (pRESTHandle && pRESTHandle->logFile != NULL) |
|
62 |
-+ if (pRESTHandle && pRESTHandle->logFile != NULL) |
|
63 |
- { |
|
64 |
- fclose(pRESTHandle->logFile); |
|
65 |
- pRESTHandle->logFile = NULL; |
|
66 |
-@@ -95,10 +81,9 @@ VmRESTLog( |
|
67 |
- ...) |
|
68 |
- { |
|
69 |
- char extraLogMessage[EXTRA_LOG_MESSAGE_LEN] = {0}; |
|
70 |
-- struct timespec tspec = {0}; |
|
71 |
-- time_t ltime; |
|
72 |
-- struct tm mytm = {0}; |
|
73 |
- char logMessage[MAX_LOG_MESSAGE_LEN]; |
|
74 |
-+ struct tm* tm_info = NULL; |
|
75 |
-+ struct timeval tv = {0}; |
|
76 |
- |
|
77 |
- va_list va; |
|
78 |
- const char* logLevelTag = ""; |
|
79 |
-@@ -115,30 +100,20 @@ VmRESTLog( |
|
80 |
- vsnprintf( logMessage, sizeof(logMessage), fmt, va ); |
|
81 |
- logMessage[sizeof(logMessage)-1] = '\0'; |
|
82 |
- va_end( va ); |
|
83 |
-- ltime = time(<ime); |
|
84 |
-+ gettimeofday(&tv, NULL); |
|
85 |
-+ |
|
86 |
-+ tm_info = localtime(&tv.tv_sec); |
|
87 |
- logLevelTag = logLevelToTag(level); |
|
88 |
-- localtime_r(<ime, &mytm); |
|
89 |
-- snprintf(extraLogMessage, sizeof(extraLogMessage) - 1, |
|
90 |
-- "%4d%2d%2d%2d%2d%2d.%03ld:t@%lu:%-3.7s: ", |
|
91 |
-- mytm.tm_year+1900, |
|
92 |
-- mytm.tm_mon+1, |
|
93 |
-- mytm.tm_mday, |
|
94 |
-- mytm.tm_hour, |
|
95 |
-- mytm.tm_min, |
|
96 |
-- mytm.tm_sec, |
|
97 |
-- tspec.tv_nsec/NSECS_PER_MSEC, |
|
98 |
-- (unsigned long) pthread_self(), |
|
99 |
-- logLevelTag? logLevelTag : "UNKNOWN"); |
|
100 |
-+ strftime(extraLogMessage, sizeof(extraLogMessage) - 1, "%F %T", tm_info); |
|
101 |
- |
|
102 |
- if (pRESTHandle->pRESTConfig->useSysLog) |
|
103 |
- { |
|
104 |
- sysLogLevel = logLevelToSysLogLevel(level); |
|
105 |
-- snprintf(extraLogMessage, sizeof(extraLogMessage) - 1, "t@%lu: ", (unsigned long) pthread_self()); |
|
106 |
-- syslog(sysLogLevel, "%s: %s%s", logLevelToTag(level), extraLogMessage, logMessage); |
|
107 |
-+ syslog(sysLogLevel, "%s:%lu t@%lu %-3.7s: %s\n", extraLogMessage, (long unsigned)(tv.tv_usec), (unsigned long) pthread_self(),(logLevelTag? logLevelTag : "UNKNOWN"),logMessage); |
|
108 |
- } |
|
109 |
- else if (pRESTHandle->logFile != NULL) |
|
110 |
- { |
|
111 |
-- fprintf(pRESTHandle->logFile, "%s%s\n", extraLogMessage, logMessage); |
|
112 |
-+ fprintf(pRESTHandle->logFile, "%s:%lu t@%lu %-3.7s: %s\n", extraLogMessage, (long unsigned)(tv.tv_usec), (unsigned long) pthread_self(),(logLevelTag? logLevelTag : "UNKNOWN"),logMessage); |
|
113 |
- fflush( pRESTHandle->logFile ); |
|
114 |
- } |
|
115 |
- } |
|
116 |
-diff --git a/server/vmrestd/main.c b/server/vmrestd/main.c |
|
117 |
-index 353f597..214b28d 100644 |
|
118 |
-+++ b/server/vmrestd/main.c |
|
119 |
-@@ -116,7 +116,7 @@ int main() |
|
120 |
- pConfig1->maxDataPerConnMB = 10; |
|
121 |
- pConfig1->nWorkerThr = 5; |
|
122 |
- pConfig1->nClientCnt = 5; |
|
123 |
-- pConfig1->useSysLog = FALSE; |
|
124 |
-+ pConfig1->useSysLog = TRUE; |
|
125 |
- pConfig1->pszSSLCertificate = "/root/mycert.pem"; |
|
126 |
- pConfig1->isSecure = TRUE; |
|
127 |
- pConfig1->pszSSLKey = "/root/mycert.pem"; |
|
128 |
-@@ -127,6 +127,10 @@ int main() |
|
129 |
- pConfig1->pszSSLCipherList = NULL; |
|
130 |
- pConfig1->SSLCtxOptionsFlag = 0; |
|
131 |
- |
|
132 |
-+ /**** Init sys log ****/ |
|
133 |
-+ openlog("VMREST_KAUSHIK", 0, LOG_DAEMON); |
|
134 |
-+ setlogmask(LOG_UPTO(LOG_DEBUG)); |
|
135 |
-+ |
|
136 |
- dwError = VmRESTInit(pConfig, &gpRESTHandle); |
|
137 |
- dwError = VmRESTInit(pConfig1, &gpRESTHandle1); |
|
138 |
- |
|
139 |
-@@ -177,6 +181,8 @@ int main() |
|
140 |
- // VmRESTShutdownSSL(sslCtx1); |
|
141 |
- #endif |
|
142 |
- |
|
143 |
-+ closelog(); |
|
144 |
-+ |
|
145 |
- return dwError; |
|
146 |
- |
|
147 |
- } |