@@ -23,291 +23,39 @@
23 23 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
24 24 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This file contains code that implements the client-side HTTP protocol
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 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #ifdef __MINGW32__
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 <winsock2.h>
31 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #else
32 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # include <arpa/inet.h>
33 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # include <sys/socket.h>
34 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # include <netdb.h>
35 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # include <netinet/in.h>
36 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif
37 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #include <assert.h>
38 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #include <sys/types.h>
39 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #include <signal.h>
40 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
41 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
42 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Persistent information about the HTTP connection.
43 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
44 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
45 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #ifdef __MINGW32__
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 */
50 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif
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!
- */
57 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static void ws_init(){
58 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #ifdef __MINGW32__
59 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if (WSAStartup(MAKEWORD(2,0), &ws_info) != 0){
60 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fossil_panic("can't initialize winsock");
61 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
62 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif
63 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
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!
- */
68 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static void ws_cleanup(){
69 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #ifdef __MINGW32__
70 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- WSACleanup();
71 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif
72 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
73 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
74 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
75 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Open a socket connection to the server. Return 0 on success and
76 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** non-zero if an error occurs.
77 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
78 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int http_open_socket(void){
79 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static struct sockaddr_in addr; /* The server address */
80 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int addrIsInit = 0; /* True once addr is initialized */
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!
- if( g.urlIsHttps ){
84 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fossil_fatal("SSL/TLS is not yet implemented.");
85 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
86 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ws_init();
87 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( !addrIsInit ){
88 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- addr.sin_family = AF_INET;
89 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- addr.sin_port = htons(g.urlPort);
90 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *(int*)&addr.sin_addr = inet_addr(g.urlName);
91 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( -1 == *(int*)&addr.sin_addr ){
92 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #ifndef FOSSIL_STATIC_LINK
93 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct hostent *pHost;
94 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pHost = gethostbyname(g.urlName);
95 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pHost!=0 ){
96 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- memcpy(&addr.sin_addr,pHost->h_addr_list[0],pHost->h_length);
97 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else
98 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif
99 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- {
100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fossil_panic("can't resolve host name: %s\n", g.urlName);
101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- addrIsInit = 1;
104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Set the Global.zIpAddr variable to the server we are talking to.
106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** This is used to populate the ipaddr column of the rcvfrom table,
107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** if any files are received from the server.
108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- g.zIpAddr = mprintf("%s", inet_ntoa(addr.sin_addr));
110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- s = socket(AF_INET,SOCK_STREAM,0);
112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( s<0 ){
113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fossil_panic("cannot create a socket");
114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( connect(s,(struct sockaddr*)&addr,sizeof(addr))<0 ){
116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fossil_panic("cannot connect to host %s:%d", g.urlName, g.urlPort);
117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #ifdef __MINGW32__
119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pSocket = s;
120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #else
121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pSocket = fdopen(s,"r+");
122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- signal(SIGPIPE, SIG_IGN);
123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif
124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return 0;
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!
- #ifdef __MINGW32__
128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Read the socket until a newline '\n' is found. Return the number
130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** of characters read. pSockId contains the socket handel. pOut
131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** contains a pointer to the buffer to write to. pOutSize contains
132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** the maximum size of the line that pOut can handle.
133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int socket_recv_line(int pSockId, char* pOut, int pOutSize){
135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int received=0;
136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char letter;
137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- memset(pOut,0,pOutSize);
138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(; received<pOutSize-1;received++){
139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( recv(pSockId,(char*)&letter,1,0)>0 ){
140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pOut[received]=letter;
141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( letter=='\n' ){
142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- break;
143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- break;
146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return received;
149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Initialize a blob to the data on an input socket. return
153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** the number of bytes read into the blob. Any prior content
154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** of the blob is discarded, not freed.
155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** The function was placed here in http.c due to it's socket
157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** nature and we did not want to introduce socket headers into
158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** the socket neutral blob.c file.
159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int socket_read_blob(Blob *pBlob, int pSockId, int nToRead){
161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int i=0,read=0;
162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char rbuf[50];
163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_zero(pBlob);
164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while ( i<nToRead ){
165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- read = recv(pSockId, rbuf, 50, 0);
166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- i += read;
167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( read<=0 ){
168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return 0;
169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_append(pBlob, rbuf, read);
171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return blob_size(pBlob);
173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif
175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Make a single attempt to talk to the server. Return TRUE on success
178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** and FALSE on a failure.
179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** pHeader contains the HTTP header. pPayload contains the content.
181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** The content of the reply is written into pReply. pReply is assumed
182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** to be uninitialized prior to this call.
183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** If an error occurs, this routine return false, resets pReply and
185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** closes the persistent connection, if any.
186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int http_send_recv(Blob *pHeader, Blob *pPayload, Blob *pReply){
188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int closeConnection=1; /* default to closing the connection */
189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int rc;
190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int iLength;
191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int iHttpVersion;
192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int i;
193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nRead;
194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char zLine[2000];
195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pSocket==0 && http_open_socket() ){
197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return 0;
198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- iLength = -1;
200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #ifdef __MINGW32__
201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Use recv/send on the windows platform as winsock does not allow
203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** sockets to be used as FILE handles, thus fdopen, fwrite, fgets
204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** does not function on windows for sockets.
205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = send(pSocket, blob_buffer(pHeader), blob_size(pHeader), 0);
207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc!=blob_size(pHeader) ) goto write_err;
208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = send(pSocket, blob_buffer(pPayload), blob_size(pPayload), 0);
209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc!=blob_size(pPayload) ) goto write_err;
210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Read the response */
212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( socket_recv_line(pSocket, zLine, 2000) ){
213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for( i=0; zLine[i] && zLine[i]!='\n' && zLine[i]!='\r'; i++ ){}
214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( i==0 ) break;
215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zLine[i] = 0;
216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( strncasecmp(zLine, "http/1.", 7)==0 ){
217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( sscanf(zLine, "HTTP/1.%d %d", &iHttpVersion, &rc)!=2 ) goto write_err;
218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc!=200 ) goto write_err;
219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( iHttpVersion==0 ){
220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- closeConnection = 1;
221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- closeConnection = 0;
223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- } else if( strncasecmp(zLine, "content-length:", 15)==0 ){
225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- iLength = atoi(&zLine[16]);
226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else if( strncasecmp(zLine, "connection:", 11)==0 ){
227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(i=12; isspace(zLine[i]); i++){}
228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( zLine[i]=='c' || zLine[i]=='C' ){
229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- closeConnection = 1;
230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else if( zLine[i]=='k' || zLine[i]=='K' ){
231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- closeConnection = 0;
232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( iLength<0 ) goto write_err;
236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nRead = socket_read_blob(pReply, pSocket, iLength);
237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #else
238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = fwrite(blob_buffer(pHeader), 1, blob_size(pHeader), pSocket);
239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc!=blob_size(pHeader) ) goto write_err;
240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = fwrite(blob_buffer(pPayload), 1, blob_size(pPayload), pSocket);
241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc!=blob_size(pPayload) ) goto write_err;
242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( fflush(pSocket) ) goto write_err;
243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( fgets(zLine, sizeof(zLine), pSocket)==0 ) goto write_err;
244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( sscanf(zLine, "HTTP/1.%d %d", &iHttpVersion, &rc)!=2 ) goto write_err;
245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc!=200 ) goto write_err;
246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( iHttpVersion==0 ){
247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- closeConnection = 1; /* Connection: close */
248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- closeConnection = 0; /* Connection: keep-alive */
250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( fgets(zLine, sizeof(zLine), pSocket) ){
252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(i=0; zLine[i] && zLine[i]!='\n' && zLine[i]!='\r'; i++){}
253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( i==0 ) break;
254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zLine[i] = 0;
255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( strncasecmp(zLine,"content-length:",15)==0 ){
256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- iLength = atoi(&zLine[16]);
257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else if( strncasecmp(zLine, "connection:", 11)==0 ){
258 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(i=12; isspace(zLine[i]); i++){}
259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( zLine[i]=='c' || zLine[i]=='C' ){
260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- closeConnection = 1; /* Connection: close */
261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else if( zLine[i]=='k' || zLine[i]=='K' ){
262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- closeConnection = 0; /* Connection: keep-alive */
263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( iLength<0 ) goto write_err;
267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nRead = blob_read_from_channel(pReply, pSocket, iLength);
268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif
269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( nRead!=iLength ){
270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_reset(pReply);
271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- goto write_err;
272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( closeConnection ){
274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- http_close();
275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return 1;
277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- write_err:
279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- http_close();
280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return 0;
281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Sign the content in pSend, compress it, and send it to the server
285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** via HTTP. Get a reply, uncompress the reply, and store the reply
286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** in pRecv. pRecv is assumed to be uninitialized when
287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** this routine is called - this routine will initialize it.
288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** The server address is contain in the "g" global structure. The
290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** url_parse() routine should have been called prior to this routine
291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** in order to fill this structure appropriately.
292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- void http_exchange(Blob *pSend, Blob *pRecv){
294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Blob login, nonce, sig, pw, payload, hdr;
295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const char *zSep;
296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int i;
297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int cnt = 0;
28 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #include <assert.h>
29 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
30 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
31 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Construct the "login" card with the client credentials.
32 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
33 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** login LOGIN NONCE SIGNATURE
34 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
35 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The LOGIN is the user id of the client. NONCE is the sha1 checksum
36 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** of all payload that follows the login card. SIGNATURE is the sha1
37 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** checksum of the nonce followed by the user password.
38 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
39 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Write the constructed login card into pLogin. pLogin is initialized
40 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** by this routine.
41 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
42 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void http_build_login_card(Blob *pPayload, Blob *pLogin){
43 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob nonce; /* The nonce */
44 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob pw; /* The user password */
45 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob sig; /* The signature field */
298 46 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
299 47 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_zero(&nonce);
300 48 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_zero(&pw);
301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sha1sum_blob(pSend, &nonce);
49 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sha1sum_blob(pPayload, &nonce);
302 50 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_copy(&pw, &nonce);
303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_zero(&login);
51 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_zero(pLogin);
304 52 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( g.urlUser==0 ){
305 53 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
user_select();
306 54 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_blob(&pw, "SELECT pw FROM user WHERE uid=%d", g.userUid);
307 55 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sha1sum_blob(&pw, &sig);
308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_appendf(&login, "login %s %b %b\n", g.zLogin, &nonce, &sig);
56 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(pLogin, "login %s %b %b\n", g.zLogin, &nonce, &sig);
309 57 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
310 58 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( g.urlPasswd==0 ){
311 59 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( strcmp(g.urlUser,"anonymous")!=0 ){
312 60 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zPrompt = mprintf("password for %s: ", g.urlUser);
313 61 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob x;
@@ -317,48 +65,90 @@
317 65 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
318 66 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
g.urlPasswd = "";
319 67 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
320 68 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
321 69 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_append(&pw, g.urlPasswd, -1);
322 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* printf("presig=[%s]\n", blob_str(&pw)); */
323 70 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sha1sum_blob(&pw, &sig);
324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_appendf(&login, "login %s %b %b\n", g.urlUser, &nonce, &sig);
71 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(pLogin, "login %s %b %b\n", g.urlUser, &nonce, &sig);
325 72 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
326 73 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&nonce);
327 74 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&pw);
328 75 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&sig);
76 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
77 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
78 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
79 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Construct an appropriate HTTP request header. Write the header
80 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** into pHdr. This routine initializes the pHdr blob. pPayload is
81 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the complete payload (including the login card) already compressed.
82 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
83 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void http_build_header(Blob *pPayload, Blob *pHdr){
84 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i;
85 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zSep;
86 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
87 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_zero(pHdr);
88 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i = strlen(g.urlPath);
89 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( i>0 && g.urlPath[i-1]=='/' ){
90 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zSep = "";
91 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
92 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zSep = "/";
93 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
94 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(pHdr, "POST %s%sxfer HTTP/1.1\r\n", g.urlPath, zSep);
95 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(pHdr, "Host: %s\r\n", g.urlHostname);
96 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(pHdr, "User-Agent: Fossil/" MANIFEST_VERSION "\r\n");
97 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( g.fHttpTrace ){
98 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(pHdr, "Content-Type: application/x-fossil-debug\r\n");
99 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(pHdr, "Content-Type: application/x-fossil\r\n");
101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(pHdr, "Content-Length: %d\r\n\r\n", blob_size(pPayload));
103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Sign the content in pSend, compress it, and send it to the server
107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** via HTTP or HTTPS. Get a reply, uncompress the reply, and store the reply
108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** in pRecv. pRecv is assumed to be uninitialized when
109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** this routine is called - this routine will initialize it.
110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The server address is contain in the "g" global structure. The
112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** url_parse() routine should have been called prior to this routine
113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** in order to fill this structure appropriately.
114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void http_exchange(Blob *pSend, Blob *pReply){
116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob login; /* The login card */
117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob payload; /* The complete payload including login card */
118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob hdr; /* The HTTP request header */
119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int closeConnection; /* True to close the connection when done */
120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iLength; /* Length of the reply payload */
121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc; /* Result code */
122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iHttpVersion; /* Which version of HTTP protocol server uses */
123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zLine; /* A single line of the reply header */
124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i; /* Loop counter */
125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( transport_open() ){
127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_fatal(transport_errmsg());
128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Construct the login card and prepare the complete payload */
131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ http_build_login_card(pSend, &login);
329 132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( g.fHttpTrace ){
330 133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
payload = login;
331 134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_append(&payload, blob_buffer(pSend), blob_size(pSend));
332 135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
333 136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_compress2(&login, pSend, &payload);
334 137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&login);
335 138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
336 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_zero(&hdr);
337 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- i = strlen(g.urlPath);
338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( i>0 && g.urlPath[i-1]=='/' ){
339 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zSep = "";
340 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
341 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zSep = "/";
342 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
343 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_appendf(&hdr, "POST %s%sxfer HTTP/1.1\r\n", g.urlPath, zSep);
344 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_appendf(&hdr, "Host: %s\r\n", g.urlHostname);
345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_appendf(&hdr, "User-Agent: Fossil/" MANIFEST_VERSION "\r\n");
346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( g.fHttpTrace ){
347 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_appendf(&hdr, "Content-Type: application/x-fossil-debug\r\n");
348 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
349 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_appendf(&hdr, "Content-Type: application/x-fossil\r\n");
350 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
351 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_appendf(&hdr, "Content-Length: %d\r\n\r\n", blob_size(&payload));
352 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
353 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( g.fHttpTrace ){
354 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* When tracing, write the transmitted HTTP message both to standard
355 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** output and into a file. The file can then be used to drive the
356 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** server-side like this:
357 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
358 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** ./fossil http <http-trace-1.txt
359 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Construct the HTTP request header */
141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ http_build_header(&payload, &hdr);
142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* When tracing, write the transmitted HTTP message both to standard
144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** output and into a file. The file can then be used to drive the
145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** server-side like this:
146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** ./fossil http <http-trace-1.txt
148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( g.fHttpTrace ){
360 150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int traceCnt = 0;
361 151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zOutFile;
362 152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
FILE *out;
363 153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
traceCnt++;
364 154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zOutFile = mprintf("http-trace-%d.txt", traceCnt);
@@ -369,42 +159,72 @@
369 159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fwrite(blob_buffer(&hdr), 1, blob_size(&hdr), out);
370 160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fwrite(blob_buffer(&payload), 1, blob_size(&payload), out);
371 161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fclose(out);
372 162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
373 163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(cnt=0; cnt<2; cnt++){
375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( http_send_recv(&hdr, &payload, pRecv) ) break;
376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( cnt>=2 ){
378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fossil_fatal("connection to server failed");
379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Send the request to the server.
167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ transport_send(&hdr);
169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ transport_send(&payload);
380 170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&hdr);
381 171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&payload);
382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( g.fHttpTrace ){
383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- printf("HTTP RECEIVE:\n%s\n=======================\n", blob_str(pRecv));
384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_uncompress(pRecv, pRecv);
386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
387 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Make sure the socket to the HTTP server is closed
392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
393 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- void http_close(void){
394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pSocket ){
395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #ifdef __MINGW32__
396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- closesocket(pSocket);
397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #else
398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fclose(pSocket);
399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif
400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pSocket = 0;
401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** This is counter productive. Each time we open a connection we initialize
404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** winsock and then when closing we cleanup. It would be better to
405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** initialize winsock once at application start when we know we are going to
406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** use the socket interface and then cleanup once at application exit when
407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** we are all done with all socket operations.
408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ws_cleanup();
172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Read and interpret the server reply
175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ closeConnection = 1;
177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iLength = -1;
178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( (zLine = transport_receive_line())!=0 && zLine[0]!=0 ){
179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( strncasecmp(zLine, "http/1.", 7)==0 ){
180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( sscanf(zLine, "HTTP/1.%d %d", &iHttpVersion, &rc)!=2 ) goto write_err;
181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=200 ) goto write_err;
182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( iHttpVersion==0 ){
183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ closeConnection = 1;
184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ closeConnection = 0;
186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ } else if( strncasecmp(zLine, "content-length:", 15)==0 ){
188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=15; isspace(zLine[i]); i++){}
189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iLength = atoi(&zLine[i]);
190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( strncasecmp(zLine, "connection:", 11)==0 ){
191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char c;
192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=11; isspace(zLine[i]); i++){}
193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ c = zLine[i];
194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( c=='c' || c=='C' ){
195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ closeConnection = 1;
196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( c=='k' || c=='K' ){
197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ closeConnection = 0;
198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Extract the reply payload that follows the header
204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( iLength<0 ) goto write_err;
206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_zero(pReply);
207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_resize(pReply, iLength);
208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iLength = transport_receive(blob_buffer(pReply), iLength);
209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_resize(pReply, iLength);
210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( g.fHttpTrace ){
211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ printf("HTTP RECEIVE:\n%s\n=======================\n", blob_str(pReply));
212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_uncompress(pReply, pReply);
214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Close the connection to the server if appropriate.
218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( closeConnection ){
220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ transport_close();
221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return;
223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Jump to here if an error is seen.
226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ write_err:
228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ transport_close();
229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return;
410 230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
411 231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
412 232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
A DDED src/http_socket.c
413 233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
A DDED src/http_transport.c