First of all, you need to return n, not len(p).
Secondly, you need to return the error you got from calling the inner Read() method, else you won't be able to signal the EOF.
As to why this happens, it's a bit complicated: The tour code copies from your reader to stdout, and does so in large (32kB) chunks. So your reader was reporting that it had read "len(p)" == 32000 bytes - when of course it hadn't done anything like that. Also since it always returned "nil" as its error, the copy function never knew it had finished and eventually ran out of time.
Finally, you can remove the "n=n" stuff, as you're now using n and err as your return values, so the compiler won't complain that they're unused.
Hope that helps.