36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
+
+
+
+
+
|
typedef struct HttpRequest HttpRequest;
struct HttpRequest {
int id; /* ID counter */
SOCKET s; /* Socket on which to receive data */
SOCKADDR_IN addr; /* Address from which data is coming */
};
/*
** Prefix for a temporary file.
*/
static char *zTempPrefix;
/*
** Look at the HTTP header contained in zHdr. Find the content
** length and return it. Return 0 if there is no Content-Length:
** header line.
*/
static int find_content_length(const char *zHdr){
while( *zHdr ){
|
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
-
-
+
+
|
int wanted = 0;
char *z;
char zRequestFName[100];
char zReplyFName[100];
char zCmd[2000]; /* Command-line to process the request */
char zHdr[2000]; /* The HTTP request header */
sprintf(zRequestFName, "win32_http_in%d.txt", p->id);
sprintf(zReplyFName, "win32_http_out%d.txt", p->id);
sprintf(zRequestFName, "%s_in%d.txt", zTempPrefix, p->id);
sprintf(zReplyFName, "%s_out%d.txt", zTempPrefix, p->id);
amt = 0;
while( amt<sizeof(zHdr) ){
got = recv(p->s, &zHdr[amt], sizeof(zHdr)-1-amt, 0);
if( got==SOCKET_ERROR ) goto end_request;
if( got==0 ){
wanted = 0;
break;
|
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
|
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
|
-
-
+
+
-
+
|
if( in ){
while( (got = fread(zHdr, 1, sizeof(zHdr), in))>0 ){
send(p->s, zHdr, got, 0);
}
}
end_request:
unlink(zRequestFName);
unlink(zReplyFName);
if( out ) fclose(out);
if( in ) fclose(in);
closesocket(p->s);
unlink(zRequestFName);
unlink(zReplyFName);
free(p);
}
/*
** Start a listening socket and process incoming HTTP requests on
** that socket.
*/
void win32_http_server(int iPort){
WSADATA wd;
SOCKET s;
SOCKADDR_IN addr;
int idCnt = 0;
if( WSAStartup(MAKEWORD(1,1), &wd) ){
fossil_fatal("unable to initialize winsock");
}
zTempPrefix = mprintf("fossil_server_P%d_", iPort);
s = socket(AF_INET, SOCK_STREAM, 0);
if( s==INVALID_SOCKET ){
fossil_fatal("unable to create a socket");
}
addr.sin_family = AF_INET;
addr.sin_port = htons(iPort);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
|