*/
#include <stdio.h>
+#include <stdlib.h>
#include <gtk/gtk.h>
#include <string.h>
-#include <errno.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-
#ifdef WINDOWS
-
-#include <io.h>
#include <winsock.h>
-#define access(a,b) _access(a,b)
-#define close(a) closesocket(a)
-
-char *dirname ( char * dir )
-{
- char *tmp = dir + strlen(dir) - 1;
- while ( tmp != dir && *tmp != '\\' )
- tmp--;
- *tmp = '\0';
- return dir;
-}
-
#else
-
#include <unistd.h>
-#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
-
-/* dirname */
-#include <libgen.h>
-
-#endif
+#endif
#include "http.h"
return 1;
}
-/* makes directory if neccessary */
-int http_download_get_url ( const char *hostname, const char *uri, const char *fn, int already_redirected, int sendhostname )
+int http_download_get_url ( const char *hostname, const char *uri, FILE *f, int already_redirected, DownloadOptions *options )
{
static char input_buffer[1024];
int sock;
int len;
- FILE *f, *tmp_f;
+ FILE *tmp_f;
/* int hnlen = strlen ( hostname ); */
- if ( access ( fn, F_OK ) == 0 )
- {
- return -3;
- } else {
- if ( errno == ENOENT)
- {
- char *tmp = g_strdup ( fn );
-#ifdef WINDOWS
- mkdir( dirname ( dirname ( tmp ) ) );
- g_free ( tmp ); tmp = g_strdup ( fn );
- mkdir( dirname ( tmp ) );
-#else
- mkdir( dirname ( dirname ( tmp ) ), 0777 );
- g_free ( tmp ); tmp = g_strdup ( fn );
- mkdir( dirname ( tmp ), 0777 );
-#endif
- g_free ( tmp );
- }
- if ( ! (f = fopen ( fn, "w+b" )) ) /* immediately open file so other threads won't -- prevents race condition */
- return -4;
- }
#ifdef WINDOWS
WSADATA usadata;
WSAStartup ( MAKEWORD(2,2), &usadata );
sock = http_connect ( hostname, 80 );
if (sock < 0)
{
- fclose ( f );
- remove ( fn );
return -1;
}
- if ( sendhostname ) {
+ if ( options != NULL && options->sendhostname ) {
send ( sock, "GET http://", 11, 0);
send ( sock, hostname, strlen(hostname), 0 );
send ( sock, uri, strlen ( uri ), 0 );
{
char *newhost = g_strndup ( input_buffer + 17, uri_start - input_buffer - 17 );
char *newuri = strdup ( uri_start );
- fclose ( f );
- remove ( fn );
close ( sock );
- rv = http_download_get_url ( newhost, newuri, fn, 1, sendhostname );
+ rv = http_download_get_url ( newhost, newuri, f, 1, sendhostname );
free ( newhost );
free ( newuri );
}
} while (input_buffer[0] != '\r' );
- fclose ( f );
- remove ( fn );
+ /* Something went wrong */
return 1;
}
{
if ( http_get_line ( sock, input_buffer, 1024 ) == 0 )
{
- fclose ( f );
- remove ( fn );
close ( sock );
return -2;
}
fwrite ( input_buffer, 1, len, f);
}
fclose ( tmp_f );
- fclose ( f );
close ( sock );
#ifdef WINDOWS
#endif
return 0;
}
-
-/* success = 0, -1 = couldn't connect, -2 HTTP error, -3 file exists, -4 couldn't write to file... */
-/* uri: like "/uri.html?whatever" */
-/* only reason for the "wrapper" is so we can do redirects. */
-int a_http_download_get_url ( const char *hostname, const char *uri, const char *fn )
-{
- return http_download_get_url ( hostname, uri, fn, 0, 1 );
-}
-
-int a_http_download_get_url_nohostname ( const char *hostname, const char *uri, const char *fn )
-{
- return http_download_get_url ( hostname, uri, fn, 0, 0 );
-}
-
-
-int usgs_hack ( const char *scale_factor, const char *uri, const char *fn )
-{
- static char input_buffer[1024];
- int sock;
- /* int hnlen = strlen ( scale_factor ); */
-
-#ifdef WINDOWS
- WSADATA usadata;
- WSAStartup ( MAKEWORD(2,2), &usadata );
-#endif
-
- sock = http_connect ( scale_factor, 80 );
- if (sock < 0)
- return -1;
-
- send ( sock, "GET /", 5, 0);
- send ( sock, uri, strlen ( uri ), 0 );
- send ( sock, " HTTP/1.0\r\n\r\n", 13, 0 );
-
- /* next, skip through all headers EXCEPT content length.,
- that is, if it begins with "Content-Length: " (strncasecmp),
- atoi that line from +16 (+17 ?), read that many bytes directly
- into file (IF we can open it, else return error) and we're done.
- */
-
- /* "HTTP/1.x 200 OK" check */
- for (;;) {
- if ( http_get_line ( sock, input_buffer, 1024 ) == 0 )
- break;
-
- if ( strncmp(input_buffer, "\t\t\t<img src=\"/g", 15) == 0 && strlen(input_buffer) > 28 )
- {
- char *uri = input_buffer + 13;
- close(sock);
- uri[strlen(uri)-4] = '\0';
- return a_http_download_get_url_nohostname ( scale_factor, uri, fn );
- }
- }
- close ( sock );
-#ifdef WINDOWS
- WSACleanup(); /* they sure make winsock programming easy. */
-#endif
- return -10;
-}