@@ -25,11 +25,11 @@
25 25 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
26 26 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#include "config.h"
27 27 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#include "http.h"
28 28 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef __MINGW32__
29 29 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# include <windows.h>
30 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # include <winsock.h>
30 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # include <winsock2.h>
31 31 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#else
32 32 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# include <arpa/inet.h>
33 33 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# include <sys/socket.h>
34 34 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# include <netdb.h>
35 35 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# include <netinet/in.h>
@@ -39,24 +39,34 @@
39 39 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#include <signal.h>
40 40 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
41 41 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
42 42 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Persistent information about the HTTP connection.
43 43 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
44 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static FILE *pSocket = 0; /* The socket on which we talk to the server */
45 44 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
46 45 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef __MINGW32__
47 46 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static WSADATA ws_info;
47 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int pSocket = 0; /* The socket on which we talk to the server on */
48 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #else
49 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static FILE *pSocket = 0; /* The socket filehandle on which we talk to the server */
48 50 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
49 51 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
52 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
53 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Winsock must be initialize before use. This helper method allows us to
54 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** always call ws_init in our code regardless of platform but only actually
55 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** initialize winsock on the windows platform.
56 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
50 57 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static void ws_init(){
51 58 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef __MINGW32__
52 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if (WSAStartup(MAKEWORD(1,1), &ws_info) != 0){
59 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if (WSAStartup(MAKEWORD(2,0), &ws_info) != 0){
53 60 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_panic("can't initialize winsock");
54 61 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
55 62 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
56 63 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
57 64 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
65 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
66 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Like ws_init, winsock must also be cleaned up after.
67 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
58 68 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static void ws_cleanup(){
59 69 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef __MINGW32__
60 70 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
WSACleanup();
61 71 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
62 72 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -67,13 +77,14 @@
67 77 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
68 78 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int http_open_socket(void){
69 79 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static struct sockaddr_in addr; /* The server address */
70 80 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int addrIsInit = 0; /* True once addr is initialized */
71 81 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int s;
82 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
83 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ws_init();
72 84 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
73 85 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !addrIsInit ){
74 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ws_init();
75 86 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
76 87 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
addr.sin_family = AF_INET;
77 88 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
addr.sin_port = htons(g.urlPort);
78 89 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*(int*)&addr.sin_addr = inet_addr(g.urlName);
79 90 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( -1 == *(int*)&addr.sin_addr ){
@@ -101,16 +112,65 @@
101 112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_panic("cannot create a socket");
102 113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
103 114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( connect(s,(struct sockaddr*)&addr,sizeof(addr))<0 ){
104 115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_panic("cannot connect to host %s:%d", g.urlName, g.urlPort);
105 116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef __MINGW32__
118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pSocket = s;
119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #else
106 120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pSocket = fdopen(s,"r+");
107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #ifndef __MINGW32__
108 121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
signal(SIGPIPE, SIG_IGN);
109 122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
110 123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 0;
111 124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Read the socket until a newline '\n' is found. Return the number
128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** of characters read. pSockId contains the socket handel. pOut
129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** contains a pointer to the buffer to write to. pOutSize contains
130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the maximum size of the line that pOut can handle.
131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int socket_recv_line(int pSockId, char* pOut, int pOutSize){
133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int received=0;
134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char letter;
135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memset(pOut,0,pOutSize);
136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(; received<pOutSize-1;received++){
137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( recv(pSockId,(char*)&letter,1,0)>0 ){
138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pOut[received]=letter;
139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( letter=='\n' ){
140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return received;
147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Initialize a blob to the data on an input socket. return
151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the number of bytes read into the blob. Any prior content
152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** of the blob is discarded, not freed.
153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The function was placed here in http.c due to it's socket
155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** nature and we did not want to introduce socket headers into
156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the socket netural blob.c file.
157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int socket_read_blob(Blob *pBlob, int pSockId, int nToRead){
159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i=0,read=0;
160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char rbuf[50];
161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_zero(pBlob);
162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while ( i<nToRead ){
163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ read = recv(pSockId, rbuf, 50, 0);
164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i += read;
165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( read<0 ){
166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 0;
167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(pBlob, rbuf, read);
169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return blob_size(pBlob);
171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
112 172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
113 173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
114 174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Make a single attempt to talk to the server. Return TRUE on success
115 175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** and FALSE on a failure.
116 176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
@@ -120,40 +180,78 @@
120 180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
121 181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If an error occurs, this routine return false, resets pReply and
122 182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** closes the persistent connection, if any.
123 183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
124 184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int http_send_recv(Blob *pHeader, Blob *pPayload, Blob *pReply){
185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int closeConnection=1; /* default to closing the connection */
125 186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc;
126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int closeConnection;
127 187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iLength;
128 188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iHttpVersion;
129 189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int i;
130 190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nRead;
131 191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char zLine[2000];
132 192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
133 193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pSocket==0 && http_open_socket() ){
134 194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 0;
135 195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iLength = -1;
197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef __MINGW32__
198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Use recv/send on the windows platform as winsock does not allow
200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** sockets to be used as FILE handles, thus fdopen, fwrite, fgets
201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** does not function on windows for sockets.
202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = send(pSocket, blob_buffer(pHeader), blob_size(pHeader), 0);
204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=blob_size(pHeader) ) goto write_err;
205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = send(pSocket, blob_buffer(pPayload), blob_size(pPayload), 0);
206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=blob_size(pPayload) ) goto write_err;
207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Read the response */
209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( socket_recv_line(pSocket, zLine, 2000) ){
210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for( i=0; zLine[i] && zLine[i]!='\n' && zLine[i]!='\r'; i++ ){}
211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( i==0 ) break;
212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zLine[i] = 0;
213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( strncasecmp(zLine, "http/1.", 7)==0 ){
214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( sscanf(zLine, "HTTP/1.%d %d", &iHttpVersion, &rc)!=2 ) goto write_err;
215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=200 ) goto write_err;
216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( iHttpVersion==0 ){
217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ closeConnection = 1;
218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ closeConnection = 0;
220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ } else if( strncasecmp(zLine, "content-length:", 15)==0 ){
222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iLength = atoi(&zLine[16]);
223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( strncasecmp(zLine, "connection:", 11)==0 ){
224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=12; isspace(zLine[i]); i++){}
225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zLine[i]=='c' || zLine[i]=='C' ){
226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ closeConnection = 1;
227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( zLine[i]=='k' || zLine[i]=='K' ){
228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ closeConnection = 0;
229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( iLength<0 ) goto write_err;
233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nRead = socket_read_blob(pReply, pSocket, iLength);
234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #else
136 235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = fwrite(blob_buffer(pHeader), 1, blob_size(pHeader), pSocket);
137 236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc!=blob_size(pHeader) ) goto write_err;
138 237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = fwrite(blob_buffer(pPayload), 1, blob_size(pPayload), pSocket);
139 238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc!=blob_size(pPayload) ) goto write_err;
140 239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( fflush(pSocket) ) goto write_err;
141 240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( fgets(zLine, sizeof(zLine), pSocket)==0 ) goto write_err;
142 241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( sscanf(zLine, "HTTP/1.%d %d", &iHttpVersion, &rc)!=2 ) goto write_err;
143 242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc!=200 ) goto write_err;
144 243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( iHttpVersion==0 ){
145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- closeConnection = 1;
244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ closeConnection = 1; /* Connection: close */
146 245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- closeConnection = 0;
246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ closeConnection = 0; /* Connection: keep-alive */
148 247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- iLength = -1;
150 248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( fgets(zLine, sizeof(zLine), pSocket) ){
151 249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0; zLine[i] && zLine[i]!='\n' && zLine[i]!='\r'; i++){}
152 250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( i==0 ) break;
153 251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zLine[i] = 0;
154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( strncasecmp(zLine, "content-length:",15)==0 ){
252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( strncasecmp(zLine,"content-length:",15)==0 ){
155 253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
iLength = atoi(&zLine[16]);
156 254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( strncasecmp(zLine, "connection:", 11)==0 ){
157 255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=12; isspace(zLine[i]); i++){}
158 256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( zLine[i]=='c' || zLine[i]=='C' ){
159 257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
closeConnection = 1; /* Connection: close */
@@ -162,10 +260,11 @@
162 260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
163 261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
164 262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
165 263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( iLength<0 ) goto write_err;
166 264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nRead = blob_read_from_channel(pReply, pSocket, iLength);
265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
167 266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( nRead!=iLength ){
168 267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(pReply);
169 268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
goto write_err;
170 269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
171 270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( closeConnection ){
@@ -287,10 +386,21 @@
287 386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
288 387 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Make sure the socket to the HTTP server is closed
289 388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
290 389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void http_close(void){
291 390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pSocket ){
391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef __MINGW32__
392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ closesocket(pSocket);
393 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #else
292 394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fclose(pSocket);
395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
293 396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pSocket = 0;
294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ws_cleanup();
295 397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This is counter productive. Each time we open a connection we initialize
400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** winsock and then when closing we cleanup. It would be better to
401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** initialize winsock once at application start when we know we are going to
402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** use the socket interface and then cleanup once at application exit when
403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** we are all done with all socket operations.
404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ws_cleanup();
296 406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
297 407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!