summaryrefslogtreecommitdiff
path: root/noncore/todayplugins/stockticker/libstocks/http.c
Unidiff
Diffstat (limited to 'noncore/todayplugins/stockticker/libstocks/http.c') (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/todayplugins/stockticker/libstocks/http.c300
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 */
47char *http_proxy_server=NULL;
48/* proxy server port number or 0 */
49int 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/*****************************************************************************/
56libstocks_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/******************************************************************************/
261libstocks_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}