CINIT(PRIVATE, OBJECTPOINT, 103),
CINIT(LOW_SPEED_LIMIT, LONG , 19),
CINIT(LOW_SPEED_TIME, LONG, 20),
+ CINIT(PROTOCOLS, LONG, 181),
+ CINIT(REDIR_PROTOCOLS, LONG, 182),
}
CURLoption;
+#define CURLPROTO_HTTP (1<<0)
+#define CURLPROTO_HTTPS (1<<1)
+#define CURLPROTO_FTP (1<<2)
typedef enum
{
CURLINFO_TEXT = 0,
{
const char* dllnames [] =
{
-#if defined(WIN64)
- "libcurl64.dll",
-#elif defined(WIN32)
+#if defined(WIN32)
"libcurl-4.dll",
"libcurl-3.dll",
#elif defined(MACOSX)
switch(status)
{
case CURLCBSTATUS_OK:
- Con_Printf("Download of %s: OK\n", di->filename);
+ Con_DPrintf("Download of %s: OK\n", di->filename);
break;
case CURLCBSTATUS_FAILED:
- Con_Printf("Download of %s: FAILED\n", di->filename);
+ Con_DPrintf("Download of %s: FAILED\n", di->filename);
break;
case CURLCBSTATUS_ABORTED:
- Con_Printf("Download of %s: ABORTED\n", di->filename);
+ Con_DPrintf("Download of %s: ABORTED\n", di->filename);
break;
case CURLCBSTATUS_SERVERERROR:
- Con_Printf("Download of %s: (unknown server error)\n", di->filename);
+ Con_DPrintf("Download of %s: (unknown server error)\n", di->filename);
break;
case CURLCBSTATUS_UNKNOWN:
- Con_Printf("Download of %s: (unknown client error)\n", di->filename);
+ Con_DPrintf("Download of %s: (unknown client error)\n", di->filename);
break;
default:
- Con_Printf("Download of %s: %d\n", di->filename, status);
+ Con_DPrintf("Download of %s: %d\n", di->filename, status);
break;
}
}
static void curl_quiet_callback(int status, size_t length_received, unsigned char *buffer, void *cbdata)
{
- if(developer.integer)
- curl_default_callback(status, length_received, buffer, cbdata);
+ curl_default_callback(status, length_received, buffer, cbdata);
}
/*
qcurl_easy_setopt(di->curle, CURLOPT_LOW_SPEED_TIME, (long) 45);
qcurl_easy_setopt(di->curle, CURLOPT_WRITEDATA, (void *) di);
qcurl_easy_setopt(di->curle, CURLOPT_PRIVATE, (void *) di);
+ qcurl_easy_setopt(di->curle, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS | CURLPROTO_FTP);
+ if(qcurl_easy_setopt(di->curle, CURLOPT_REDIR_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS | CURLPROTO_FTP) != CURLE_OK)
+ {
+ Con_Printf("^1WARNING:^7 for security reasons, please upgrade to libcurl 7.19.4 or above. In a later version of DarkPlaces, HTTP redirect support will be disabled for this libcurl version.\n");
+ //qcurl_easy_setopt(di->curle, CURLOPT_FOLLOWLOCATION, 0);
+ }
+
qcurl_multi_add_handle(curlm, di->curle);
di->started = true;
++numdownloads;
else
{
char fn[MAX_OSPATH];
+ char urlbuf[1024];
const char *p, *q;
size_t length;
downloadinfo *di;
+ // if URL is protocol:///* or protocol://:port/*, insert the IP of the current server
+ p = strchr(URL, ':');
+ if(p)
+ {
+ if(!strncmp(p, ":///", 4) || !strncmp(p, "://:", 4))
+ {
+ char addressstring[128];
+ *addressstring = 0;
+ InfoString_GetValue(cls.userinfo, "*ip", addressstring, sizeof(addressstring));
+ q = strchr(addressstring, ':');
+ if(!q)
+ q = addressstring + strlen(addressstring);
+ if(*addressstring)
+ {
+ dpsnprintf(urlbuf, sizeof(urlbuf), "%.*s://%.*s%s", (int) (p - URL), URL, (int) (q - addressstring), addressstring, URL + (p - URL) + 3);
+ URL = urlbuf;
+ }
+ }
+ }
+
// Note: This extraction of the file name portion is NOT entirely correct.
//
// It does the following: