author | llornkcor <llornkcor> | 2002-10-31 00:09:31 (UTC) |
---|---|---|
committer | llornkcor <llornkcor> | 2002-10-31 00:09:31 (UTC) |
commit | 5a08fd92ac139820e1a1202d0b4b67190f24ccdb (patch) (unidiff) | |
tree | e9c0692cf445a886cd529b60f8e535922a7f5d4d /noncore/todayplugins/stockticker/libstocks/http.c | |
parent | ad396dd7b58fc772423f95be050f645fc7a6d9b9 (diff) | |
download | opie-5a08fd92ac139820e1a1202d0b4b67190f24ccdb.zip opie-5a08fd92ac139820e1a1202d0b4b67190f24ccdb.tar.gz opie-5a08fd92ac139820e1a1202d0b4b67190f24ccdb.tar.bz2 |
added - initial check in
Diffstat (limited to 'noncore/todayplugins/stockticker/libstocks/http.c') (more/less context) (ignore whitespace changes)
-rw-r--r-- | noncore/todayplugins/stockticker/libstocks/http.c | 300 |
1 files changed, 300 insertions, 0 deletions
diff --git a/noncore/todayplugins/stockticker/libstocks/http.c b/noncore/todayplugins/stockticker/libstocks/http.c new file mode 100644 index 0000000..462080d --- a/dev/null +++ b/noncore/todayplugins/stockticker/libstocks/http.c | |||
@@ -0,0 +1,300 @@ | |||
1 | /* libstocks - Library to get current stock quotes from Yahoo Finance | ||
2 | * | ||
3 | * Copyright (C) 2000 Eric Laeuffer | ||
4 | * | ||
5 | * This library is free software; you can redistribute it and/or | ||
6 | * modify it under the terms of the GNU Library General Public | ||
7 | * License as published by the Free Software Foundation; either | ||
8 | * version 2 of the License, or (at your option) any later version. | ||
9 | * | ||
10 | * This library is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
13 | * Library General Public License for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU Library General Public | ||
16 | * License along with this library; if not, write to the | ||
17 | * Free Software Foundation, Inc., 59 Temple Place - Suite 330, | ||
18 | * Boston, MA 02111-1307, USA. | ||
19 | */ | ||
20 | |||
21 | #define __HTTP_C__ | ||
22 | |||
23 | #ifdef __UNIX__ | ||
24 | #include <sys/socket.h> | ||
25 | #include <netinet/in.h> | ||
26 | #include <arpa/inet.h> | ||
27 | #include <netdb.h> | ||
28 | #include <unistd.h> | ||
29 | #elif __WINDOWS__ | ||
30 | #include <winsock.h> | ||
31 | #include <mbstring.h> | ||
32 | #endif | ||
33 | |||
34 | #include <sys/types.h> | ||
35 | #include <ctype.h> | ||
36 | #include <string.h> | ||
37 | #include <stdlib.h> | ||
38 | #include <stdio.h> | ||
39 | |||
40 | #include "http.h" | ||
41 | #include "stocks.h" | ||
42 | |||
43 | #define BUF_SIZE 1024 | ||
44 | #define HEADER_MAXBUF 512 | ||
45 | |||
46 | /* pointer to proxy server name or NULL */ | ||
47 | char *http_proxy_server=NULL; | ||
48 | /* proxy server port number or 0 */ | ||
49 | int http_proxy_port=0; | ||
50 | |||
51 | /*****************************************************************************/ | ||
52 | /* Gets the file from http://http_server/http_file */ | ||
53 | /* This function is used to get quotes csv file from yahoo. */ | ||
54 | /* It allocates memory for the file and defines *pdata (the pointer of datas)*/ | ||
55 | /*****************************************************************************/ | ||
56 | libstocks_return_code http_get(char *http_file, char *http_server, char **pdata) | ||
57 | { | ||
58 | struct hostent *host; /* structs needed by socket */ | ||
59 | struct sockaddr_in server; | ||
60 | int s; /* socket descriptor */ | ||
61 | char header[HEADER_MAXBUF]; /* request header */ | ||
62 | int hlg; /* header length */ | ||
63 | char buf[BUF_SIZE+1]; /* tempory buffer from socket read */ | ||
64 | int r; /* number of bytes read by read function */ | ||
65 | char *data=NULL; /* http server response */ | ||
66 | int data_lgr; /* http server response length */ | ||
67 | char *temp; /* pointer used to split header and csv */ | ||
68 | int error_code; /* error code returned by http server */ | ||
69 | char *csv_ptr; /* pointer to the csv content */ | ||
70 | int header_founded; /* test if header is founded */ | ||
71 | |||
72 | #ifdef DEBUG | ||
73 | printf("*http_get\n"); | ||
74 | #endif | ||
75 | |||
76 | /* get host info by name :*/ | ||
77 | if ((host = gethostbyname( http_proxy_server ? http_proxy_server : http_server))) | ||
78 | { | ||
79 | memset((char *) &server,0, sizeof(server)); | ||
80 | memmove((char *) &server.sin_addr, host->h_addr, host->h_length); | ||
81 | server.sin_family = host->h_addrtype; | ||
82 | server.sin_port = (unsigned short) htons( http_proxy_server ? http_proxy_port : 80 ); | ||
83 | |||
84 | } else | ||
85 | { | ||
86 | |||
87 | #ifdef DEBUG | ||
88 | printf(" gethostbyname : NOK\n"); | ||
89 | #endif | ||
90 | return ERRHOST; | ||
91 | } | ||
92 | |||
93 | /* create socket */ | ||
94 | if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) | ||
95 | { | ||
96 | |||
97 | #ifdef DEBUG | ||
98 | printf(" create socket : NOK\n"); | ||
99 | #endif | ||
100 | return ERRSOCK; | ||
101 | } | ||
102 | |||
103 | setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, 0, 0); | ||
104 | |||
105 | /* connect to server */ | ||
106 | if (connect(s, &server, sizeof(server)) < 0) | ||
107 | { | ||
108 | #ifdef DEBUG | ||
109 | printf(" connect to server : NOK\n"); | ||
110 | #endif | ||
111 | |||
112 | #ifdef __UNIX__ | ||
113 | close(s); | ||
114 | #elif __WINDOWS__ | ||
115 | closesocket(s); | ||
116 | #endif | ||
117 | return ERRCONN; | ||
118 | } | ||
119 | |||
120 | /* create header */ | ||
121 | if (http_proxy_server) | ||
122 | { | ||
123 | sprintf(header,"GET http://%.128s:80%.256s HTTP/1.0\015\012\015\012", | ||
124 | http_server, http_file); | ||
125 | } | ||
126 | else | ||
127 | { | ||
128 | sprintf(header,"GET %s HTTP/1.0\015\012\015\012",http_file); | ||
129 | } | ||
130 | |||
131 | hlg=strlen(header); | ||
132 | |||
133 | /* send header */ | ||
134 | #ifdef __UNIX__ | ||
135 | if (write(s,header,hlg)!=hlg) | ||
136 | #elif __WINDOWS__ | ||
137 | if (send(s,header,hlg, 0)!=hlg) | ||
138 | #endif | ||
139 | { | ||
140 | #ifdef DEBUG | ||
141 | printf(" send header : NOK\n"); | ||
142 | #endif | ||
143 | return ERRWHEA; | ||
144 | } | ||
145 | |||
146 | data_lgr = 0; | ||
147 | r=1; | ||
148 | while(r) | ||
149 | { | ||
150 | /* Clear Buffer */ | ||
151 | memset(buf,0,BUF_SIZE+1); | ||
152 | |||
153 | #ifdef __UNIX__ | ||
154 | r=read(s,buf,BUF_SIZE); | ||
155 | #elif __WINDOWS__ | ||
156 | r=recv(s,buf,BUF_SIZE,0); | ||
157 | #endif | ||
158 | |||
159 | if (r) | ||
160 | { | ||
161 | if(!data_lgr) | ||
162 | { | ||
163 | if((data = malloc(r+1))==NULL) | ||
164 | { | ||
165 | fprintf(stderr,"Memory allocating error (%s line %d)\n" | ||
166 | ,__FILE__, __LINE__); | ||
167 | exit(1); | ||
168 | } | ||
169 | |||
170 | memcpy(data,buf,r); | ||
171 | data_lgr = r; | ||
172 | data[r]=0; | ||
173 | } | ||
174 | else | ||
175 | { | ||
176 | if((temp = malloc(r+data_lgr+1))==NULL) | ||
177 | { | ||
178 | fprintf(stderr,"Memory allocating error (%s line %d)\n" | ||
179 | ,__FILE__, __LINE__); | ||
180 | exit(1); | ||
181 | } | ||
182 | memcpy(temp, data, data_lgr); | ||
183 | memcpy(temp+data_lgr, buf, r); | ||
184 | temp[r+data_lgr]=0; | ||
185 | data_lgr += r; | ||
186 | free(data); | ||
187 | data = temp; | ||
188 | } | ||
189 | } | ||
190 | } | ||
191 | |||
192 | /* close socket */ | ||
193 | #ifdef __UNIX__ | ||
194 | close(s); | ||
195 | #elif __WINDOWS__ | ||
196 | closesocket(s); | ||
197 | #endif | ||
198 | |||
199 | #ifdef DEBUG | ||
200 | printf("%s\n", data); | ||
201 | #endif | ||
202 | |||
203 | /* get headers to test status line */ | ||
204 | /* and to split headers and content */ | ||
205 | |||
206 | temp = data; | ||
207 | header_founded = 0; | ||
208 | while( !header_founded ) | ||
209 | { | ||
210 | if (*temp==0) return ERRRHEA; | ||
211 | |||
212 | if( *temp==0x0A ) | ||
213 | { | ||
214 | /* test if it is the header end */ | ||
215 | temp ++; | ||
216 | if (*temp == 0x0D) temp++; | ||
217 | if (*temp == 0x0A) header_founded = 1; | ||
218 | } | ||
219 | else | ||
220 | temp++; | ||
221 | } | ||
222 | |||
223 | *temp = 0; | ||
224 | temp++; | ||
225 | |||
226 | sscanf(data,"HTTP/1.%*d %03d",&error_code); | ||
227 | |||
228 | if (error_code != 200) | ||
229 | { | ||
230 | #ifdef DEBUG | ||
231 | printf(" HTTP error code : %d\n", error_code); | ||
232 | #endif | ||
233 | free(data); | ||
234 | return ERRPAHD; | ||
235 | } | ||
236 | |||
237 | if ((csv_ptr = malloc(strlen(temp)+1))==NULL) | ||
238 | { | ||
239 | free(data); | ||
240 | fprintf(stderr,"Memory allocating error (%s line %d)\n" | ||
241 | ,__FILE__, __LINE__); | ||
242 | exit(1); | ||
243 | } | ||
244 | |||
245 | memcpy(csv_ptr, temp, strlen(temp)+1); | ||
246 | free(data); | ||
247 | |||
248 | #ifdef DEBUG | ||
249 | printf(" CSV\n"); | ||
250 | printf("%s,\n", csv_ptr); | ||
251 | #endif | ||
252 | |||
253 | *pdata = csv_ptr; | ||
254 | |||
255 | return 0; | ||
256 | } | ||
257 | |||
258 | /******************************************************************************/ | ||
259 | /* Set the proxy server to use */ | ||
260 | /******************************************************************************/ | ||
261 | libstocks_return_code set_proxy(char *proxy) | ||
262 | { | ||
263 | char *ptr; | ||
264 | char c; | ||
265 | |||
266 | #ifdef DEBUG | ||
267 | printf("*set_proxy\n"); | ||
268 | #endif | ||
269 | |||
270 | /* Parse the proxy URL - It must start with http:// */ | ||
271 | #ifdef __UNIX__ | ||
272 | if (strncasecmp("http://",proxy,7)) return ERRPROX; | ||
273 | #elif __WINDOWS__ | ||
274 | if (_mbsnbicmp("http://",proxy,7)) return ERRPROX; | ||
275 | #endif | ||
276 | |||
277 | proxy+=7; | ||
278 | |||
279 | /* find ":" in the proxy url */ | ||
280 | ptr = proxy; | ||
281 | for (c=*ptr; (c && c!=':');) c=*ptr++; | ||
282 | |||
283 | /* ptr points just after the ":" or at the end of proxy if : not founded */ | ||
284 | *(ptr-1)=0; /* clear the ":" */ | ||
285 | |||
286 | http_proxy_server=strdup(proxy); | ||
287 | |||
288 | #ifdef DEBUG | ||
289 | printf("http_proxy_server : %s\n", http_proxy_server); | ||
290 | #endif | ||
291 | |||
292 | /* get the port number of the url */ | ||
293 | if (sscanf(ptr,"%d",&http_proxy_port)!=1) return ERRPROX; | ||
294 | |||
295 | #ifdef DEBUG | ||
296 | printf("http_proxy_port : %d\n", http_proxy_port); | ||
297 | #endif | ||
298 | |||
299 | return 0; | ||
300 | } | ||