Posted to tcl by dizach at Mon May 17 08:00:19 GMT 2010view raw
- Function wibble::getblock hangs tcl under cetrain conditions, when using Internet Explorer 8. For a discussion on this see http://wiki.tcl.tk/23626
- To figure out whether this is a wibble or a tcl bug, the problem can be reproduced with the following:
- Put the html code into a file 'wibble_test.html' in wibble's root directory:
- <html>
- <head>
- <script>
- ajax = function (url,f,p,m) {
- // f=callback, m=method (GET|POST), p=post data
- var req = null;
- if (window.XMLHttpRequest) {
- req = new XMLHttpRequest();
- if (req.overrideMimeType) {
- req.overrideMimeType('application/jsonrequest');
- }
- } else if (window.ActiveXObject) {
- try {
- req = new ActiveXObject("Msxml2.XMLHTTP");
- } catch (e) {
- try {
- req = new ActiveXObject("Microsoft.XMLHTTP");
- } catch (e) {}
- }
- }
- req.onreadystatechange = function() {
- if(req.readyState == 4) {
- if(req.status == 200 || req.status == 304) {
- f(req.responseText);
- } else {
- //alert("Error: returned status code " + req.status + " " + req.statusText);
- }
- }
- };
- req.open((m?m:"GET"), url, true);
- if (m) {
- req.setRequestHeader("Content-type", "application/x-www-form-urlencoded'; charset=utf-8'");
- }
- req.send(p);
- };
- gotReply = function (h) {
- var el=document.createElement("p");
- el.innerHTML = h;
- element.parentNode.appendChild(el);
- };
- askWibble = function (el) {
- element = el;
- ajax("/test",gotReply,encodeURI("a=this&b=is&c=a&d=test"),"POST");
- el=document.createElement("p");
- el.innerHTML = "asking wibble...<br/>";
- element.parentNode.appendChild(el);
- };
- </script>
- </head>
- <body>
- <input type='button' value='Press this' onclick='askWibble(this)'/>
- </body>
- </html>
- Replace wibble::getblock with:
- proc ::wibble::getblock {chan size} {
- puts stderr size=$size
- while {1} {
- set chunklet [chan read $chan $size]
- puts stderr "{$size - [string length $chunklet]}"
- set size [expr {$size - [string length $chunklet]}]
- append chunk $chunklet
- if {$size == 0} {
- puts stderr "return size==0"
- return $chunk
- } elseif {[chan eof $chan]} {
- chan close $chan
- puts stderr "return eof"
- return -level [info level]
- } else {
- puts stderr "before yield"
- yield
- puts stderr "after yield"
- }
- }
- }
- Add test zone proc 'mytest':
- proc ::mytest {request response} {
- dict set response content "<tt style='color:#080'>This is Wibble. Ask me more!</tt>"
- dict set response header content-type text/html
- dict set response status "200 ok"
- ::wibble::sendresponse $response
- }
- Add test zone handler
- ...
- # Define zone handlers.
- # Add test zone handler.
- wibble::handle /test ::mytest
- wibble::handle /vars vars
- ...
- Run wibble and direct IE8 (only Internet Explorer has the problem) to:
- http://localhost:8080/wibble_test.html
- Tcl hangs with 100% CPU load.