On 05/16/2018 11:23 PM, Hans van der Meer wrote: > I would be satisfied when a returned 404 error code will be handled > within a reasonable (configurable) time delay. As for redirection, there > I would not mind if it is not included. > Restrictions like that are not a problem for me, because this is for > building a pdf that accesses many internet located files. The check on > existence is therefore especially meant for spotting missing or misnamed > files.
You can use libcurl via ffi: https://curl.haxx.se/libcurl/ \startluacode local ffi = require("ffi") ffi.cdef[[ typedef struct Curl_easy CURL; typedef int CURLcode; typedef int CURLoption; typedef int CURLINFO; typedef size_t(*callback)(void *buffer, size_t size, size_t nmemb, void *userp); CURLcode curl_global_init(long flags); CURL *curl_easy_init(void); CURLcode curl_easy_setopt(CURL *curl, CURLoption option, ...); CURLcode curl_easy_perform(CURL *curl); CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ...); void curl_easy_cleanup(CURL *curl); void curl_global_cleanup(void); ]] -- magic numbers local CURL_GLOBAL_DEFAULT = 3 local CURLOPT_URL = 10002 local CURLOPT_NOBODY = 44 local CURLOPT_HEADER = 42 local CURLOPT_WRITEFUNCTION = 20011 local CURLINFO_RESPONSE_CODE = 0x200000 + 2 local lcurl = ffi.load("curl") local function discard(buffer, size, nmemb, userp) return size * nmemb end function check_status(url) lcurl.curl_global_init(CURL_GLOBAL_DEFAULT) local curl = lcurl.curl_easy_init() lcurl.curl_easy_setopt(curl, CURLOPT_URL, url) lcurl.curl_easy_setopt(curl, CURLOPT_NOBODY, ffi.cast("long",1)) lcurl.curl_easy_setopt(curl, CURLOPT_HEADER, ffi.cast("long",1)) lcurl.curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, ffi.cast("callback",discard)); local res = lcurl.curl_easy_perform(curl) local c_http_code = ffi.new("long[1]") lcurl.curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, c_http_code); lcurl.curl_easy_cleanup(curl) lcurl.curl_global_cleanup() return tonumber(c_http_code[0]) end \stopluacode \starttext \ctxlua{context(check_status("http://example.com/"))} \ctxlua{context(check_status("https://example.com/"))} \ctxlua{context(check_status("https://example.com/xyz"))} \stoptext > > Hans van der Meer > >> On 16 May 2018, at 12:41, Henri Menke <henrime...@gmail.com >> <mailto:henrime...@gmail.com>> wrote: >> >> On 05/16/2018 09:31 PM, Hans van der Meer wrote: >>> I tried to determine the existence of a file on the internet. See the >>> following macro call: >>> >>> % Test if file exists. >>> \edef\theurl{\linkprotocol://\urlbase\xmlatt{#1}{link}\thesuffix} >>> \doiffileelse >>> {\theurl} >>> {\verbose{HVDM-PEV-TEST}{file exists: \theurl}} >>> {\verbose{HVDM-PEV-TEST}{file does not exist: \theurl}} >>> >>> It seems that \doiffileelse always results in true except for local >>> files where nonexistence is correctly handled. >>> >>> For example the following url definitely does not exist but nevertheless >>> \doiffileelse reports its existence: >>> HVDM-PEV-TEST > file exists: >>> http://hansvandermeer.myqnapcloud.com/archive/denhaag/hga-dtb-1869-6040.pdf >>> >>> Is it possible that the \doiffile macros are extended for files on the >>> internet or a correponding set \doifurl is developed? >> >> I'm not speaking for the devs here, but I don't think that this is going >> to be included. It would require that all webpages send proper 404 >> codes and timeout after reasonable delay. Also how would you handle >> redirects? Should the ConTeXt run be stalled because checking for a >> files existence on the web is caught in a redirect loop? >> >>> >>> Hans van der Meer >>> >>> >>> >>> ___________________________________________________________________________________ >>> If your question is of interest to others as well, please add an >>> entry to the Wiki! >>> >>> maillist : ntg-context@ntg.nl <mailto:ntg-context@ntg.nl> / >>> http://www.ntg.nl/mailman/listinfo/ntg-context >>> webpage : http://www.pragma-ade.nl / http://context.aanhet.net >>> archive : https://bitbucket.org/phg/context-mirror/commits/ >>> wiki : http://contextgarden.net >>> ___________________________________________________________________________________ >>> >> >> ___________________________________________________________________________________ >> If your question is of interest to others as well, please add an entry >> to the Wiki! >> >> maillist : ntg-context@ntg.nl >> <mailto:ntg-context@ntg.nl> / http://www.ntg.nl/mailman/listinfo/ntg-context >> webpage : http://www.pragma-ade.nl >> <http://www.pragma-ade.nl/> / http://context.aanhet.net >> <http://context.aanhet.net/> >> archive : https://bitbucket.org/phg/context-mirror/commits/ >> wiki : http://contextgarden.net <http://contextgarden.net/> >> ___________________________________________________________________________________ > > > > ___________________________________________________________________________________ > If your question is of interest to others as well, please add an entry to the > Wiki! > > maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context > webpage : http://www.pragma-ade.nl / http://context.aanhet.net > archive : https://bitbucket.org/phg/context-mirror/commits/ > wiki : http://contextgarden.net > ___________________________________________________________________________________ > ___________________________________________________________________________________ If your question is of interest to others as well, please add an entry to the Wiki! maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context webpage : http://www.pragma-ade.nl / http://context.aanhet.net archive : https://bitbucket.org/phg/context-mirror/commits/ wiki : http://contextgarden.net ___________________________________________________________________________________