Posted to tcl by mjanssen at Wed Jul 04 13:39:09 GMT 2007view raw

  1. proc login {s host port url} {
  2. upvar state State
  3. global env
  4. fconfigure $s -blocking 1 -buffering line -translation crlf
  5. sspi::create neg $env(username) $env(userdomain)
  6.  
  7. set response [neg token]
  8.  
  9. puts $s "GET $url HTTP/1.1\nHost: $host\nProxy-Authorization: Negotiate [base64::encode -wrapchar {} $response]\n"
  10.  
  11. set response {}
  12. while {[set line [gets $s]] ne "" } {
  13. append response $line\r\n
  14. # break if headers done
  15. if {$line == ""} {
  16. break
  17. }
  18. }
  19. set length {}
  20.  
  21. regexp {Content-Length: ([0-9]*)} $response -> length
  22. regexp {^HTTP/.\.. ([0-9]+)} $response -> status
  23. puts $status
  24.  
  25. if {$length eq {} } {
  26. set body [read $s]
  27. } else {
  28. if {$length != 0 } {
  29. set body [read $s [expr $length-1] ]
  30. } else {
  31. set body {}
  32. }
  33. }
  34. regexp {Proxy-Authenticate: Negotiate (.*)\r\n} $response -> challenge
  35. puts $challenge
  36. set challenge [base64::decode $challenge]
  37. neg next $challenge
  38. set response [neg token]
  39. set head [catch {set State(-headers)}]
  40. set State(-headers) [concat [list Proxy-Authorization [list Negotiate [base64::encode -wrapchar {} $response]]] $head]
  41. rename neg {}
  42. }
  43.  
  44. http::config -proxyhost nl-proxy -proxyport 3128 -proxydialog login