* library/httpvfs.tcl (vfs::http::geturl): wrapper around
authorJeff Hobbs <hobbs@users.sourceforge.net>
Fri, 29 Sep 2006 21:46:51 +0000 (21:46 +0000)
committerJeff Hobbs <hobbs@users.sourceforge.net>
Fri, 29 Sep 2006 21:46:51 +0000 (21:46 +0000)
http::geturl that does 404 check.

ChangeLog
library/httpvfs.tcl

index d001120f0f43b8c19190f84943b6c76875c5cc79..afd5e8933d47630d21a23c197279ef20916d5b59 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2006-09-29  Jeff Hobbs  <jeffh@ActiveState.com>
+
+       * library/httpvfs.tcl (vfs::http::geturl): wrapper around
+       http::geturl that does 404 check.
+
 2006-09-19  Jeff Hobbs  <jeffh@ActiveState.com>
 
        * library/httpvfs.tcl (vfs::http::urlparse): add method to
index 5dd5942e15c857d1a161bdb684d4233ba3f08dff..1a89ced83e4fdad80096d4f6063827a08148eede 100644 (file)
@@ -288,6 +288,26 @@ proc vfs::http::urlname {name} {
     return $urlname
 }
 
+proc vfs::http::geturl {url args} {
+    # a wrapper around http::geturl that handles 404 or !ok status check
+    # returns error on no success, or a fully ready http token otherwise
+    set token [linsert $args 0 ::http::geturl $url]
+    http::wait $token
+
+    if {[http::ncode $token] == 404 || [http::status $token] ne "ok"} {
+       # 404 Not Found
+       set code [http::code $token]
+       http::cleanup $token
+       vfs::filesystem posixerror $::vfs::posix(ENOENT)
+       return -code error \
+           "could not read \"$url\": no such file or directory ($code)"
+    }
+
+    # treat returned token like a regular http token
+    # call http::cleanup on it when done
+    return $token
+}
+
 # If we implement the commands below, we will have a perfect
 # virtual file system for remote http sites.
 
@@ -299,17 +319,8 @@ proc vfs::http::stat {dirurl headers name} {
     # as a file (not a directory) since with http, even directories
     # really behave as the index.html they contain.
 
-    set token [::http::geturl "$dirurl$urlname" -validate 1 -headers $headers]
-    http::wait $token
-    set ncode [http::ncode $token]
-    if {$ncode == 404 || [http::status $token] ne "ok"} {
-       # 404 Not Found
-       set code [http::code $token]
-       http::cleanup $token
-       vfs::filesystem posixerror $::vfs::posix(ENOENT)
-       return -code error \
-           "could not read \"$name\": no such file or directory ($code)"
-    }
+    # this will through an error if the file doesn't exist
+    set token [geturl "$dirurl$urlname" -validate 1 -headers $headers]
     http::cleanup $token
     set mtime 0
     lappend res type file
@@ -326,20 +337,10 @@ proc vfs::http::access {dirurl headers name mode} {
        return -code error "read-only"
     }
     if {$name == ""} { return 1 }
-    set token [::http::geturl "$dirurl$urlname" -validate 1 -headers $headers]
-    http::wait $token
-    set ncode [http::ncode $token]
-    if {$ncode == 404 || [http::status $token] ne "ok"} {
-       # 404 Not Found
-       set code [http::code $token]
-       http::cleanup $token
-       vfs::filesystem posixerror $::vfs::posix(ENOENT)
-       return -code error \
-           "could not read \"$name\": no such file or directory ($code)"
-    } else {
-       http::cleanup $token
-       return 1
-    }
+    # this will through an error if the file doesn't exist
+    set token [geturl "$dirurl$urlname" -validate 1 -headers $headers]
+    http::cleanup $token
+    return 1
 }
 
 # We've chosen to implement these channels by using a memchan.
@@ -354,11 +355,9 @@ proc vfs::http::open {dirurl headers name mode permissions} {
     switch -glob -- $mode {
        "" -
        "r" {
-           set token [::http::geturl "$dirurl$urlname" -headers $headers]
-
+           set token [geturl "$dirurl$urlname" -headers $headers]
            set filed [vfs::memchan]
            fconfigure $filed -translation binary
-           http::wait $token
            puts -nonewline $filed [::http::data $token]
            http::cleanup $token