Index: library/http/http.tcl
===================================================================
--- library/http/http.tcl
+++ library/http/http.tcl
@@ -745,18 +745,30 @@
 	    flush $sock
 	    fileevent $sock readable [list http::Event $sock $token]
 	}
 
 	if {![info exists state(-command)]} {
-	    # geturl does EVERYTHING asynchronously, so if the user calls it
-	    # synchronously, we just do a wait here.
+	    if {!$state(-timeout) &&  ![string length $state(-queryprogress)] && !$isQueryChannel && ![info exists state(-channel)]} {
+		# special full-sync case, avoid doing a wait
 
-	    wait $token
-	    if {$state(status) eq "error"} {
-		# Something went wrong, so throw the exception, and the
-		# enclosing catch will do cleanup.
-		return -code error [lindex $state(error) 0]
+		fconfigure $sock -blocking on
+		if {$isQuery || $isQueryChannel} {
+		    uplevel #0 [list http::Write $token]
+		}
+		while {![regexp {^(?:ok|error)$} $state(status)]} {
+		    uplevel #0 [list http::Event $sock $token]
+		}
+	    } else {
+		# otherwise, geturl does EVERYTHING asynchronously; so if the user calls it
+		# synchronously, we just do a wait here.
+		
+		wait $token
+		if {$state(status) eq "error"} {
+		    # Something went wrong, so throw the exception, and the
+		    # enclosing catch will do cleanup.
+		    return -code error [lindex $state(error) 0]
+		}
 	    }
 	}
     } err]} {
 	# The socket probably was never connected, or the connection dropped
 	# later.

