On 11 Aug 2011, at 14:52, Igor Stasenko wrote:
Yes, of course we could just fix url and that's it. But my question was more general (because i knew why and where it fails ;)
OK ;-)
But ok.. If you think we should always explicitly use scheme, in that case, i think it should produce errors earlier, i.e. if it cannot detect any scheme, it should raise a malformed url error. Because as you can see in
ScriptLoader new installingInstaller
it throws error at random place, when MC trying to connect using URL. I'd prefer that URL throw an error, so we could see 1-2 stack frames below the caller who passing wrong url, but not like today, it buried under a lot of unrelated stuff from MC.
Well, I did some commits (with more tests) adding support so that ZnUrl fromString: 'www.squeaksource.com/installer' defaultScheme: #http becomes equivalent to ZnUrl fromString: 'http://www.squeaksource.com/installer' although I think the second is better (and it is what #asZnUrl currently wants). I did not (yet) change the current behavior of #asZnUrl to either always use #http as default scheme or throw an exception for a missing scheme, because I still think that it can be useful to have neither of these two behaviors, see for example ZnUrlTests>>#testParsePathOnly and ZnUrlTests>>#testRelative. But maybe we'll come across more arguments in the future. Sven
On 11 August 2011 14:24, Sven Van Caekenberghe <sven@beta9.be> wrote:
Hi Igor,
On 05 Aug 2011, at 11:07, Igor Stasenko wrote:
The problem is in:
ScriptLoader new installingInstaller.
without default scheme this thing is broken, since it using url without scheme. :(
Of course i could use gofer for loading it.. but i found this is most easy way to load installer.
I studied this a bit, but the base problem is the specification of the MC location. If you replace:
mc := Smalltalk globals at: #MCHttpRepository fPresent: [ :repoClass | repoClass location: 'www.squeaksource.com/Installer' user: 'squeak' password: 'squeak' ].
with
mc := Smalltalk globals at: #MCHttpRepository ifPresent: [ :repoClass | repoClass location: 'http://www.squeaksource.com/Installer' user: 'squeak' password: 'squeak' ].
in ScriptLoader>>#installingInstaller,
it should work. Note that all MCHttpRepository are created like this, the template specifies it as well:
MCHttpRepository location: 'http://www.squeaksource.com/' user: '' password: ''
I could make this into a patch/slice if you want.
Concering ZnUrl parsing, I am not sure that something has to change. ZnUrl is based on WAUrl that behaves the same. I just checked java.net.URL and they even throw an exception when you don't specify a scheme ;-) (because of the ambiguity).
Consider also relative URLs: for example, in the context of http://www.example.com:8080/examples/index.html, the relative URL about.html should be resolvable/composable to http://www.example.com:8080/examples/about.html. The current ZnUrl implementation sees about.html (but also foo.com) as a path, which is OK in this absolute/relative idea. The older Url class turns about.html into a host specification instead, which would be wrong from this prespective.
On the other hand, most browsers (and curl for example), will consider a string like 'foo' to mean a host as in http://foo
With the scheme prefix 'http://' you actually indicate what you want, maybe some extra API can support this default behavior programmatically, I am still thinking about this.
Regards,
Sven