- From: Rob Cameron <cameron@cs.sfu.ca>
- Date: Sat, 24 May 2003 12:00:25 -0700 (PDT)
- To: fielding@apache.org, uri@w3.org
Here are some comments on my first experience with rfc2396bis-02 this morning as well as some comments on further work. 1. abnf2re had no problems with the grammar; it took only a few minutes to update my parser to work with this grammar. 2. Overall, the restructuring of the grammar seems much easier to follow, particularly with respect to empty components. 3. I wonder whether net_path should be named something else, just so people don't get the idea that it is a path for the purpose of 5.2. 4. I have been working on the inverse of the algorithm of section 5.2 for resolving relative references. I thought an algorithm for that might appear in this draft. Anyway, here's what I have in Python, close enough to the pseudcode of section 5.2 to be understood, I think. def compute_relative_URI(base, abs): Base_scheme, Base_authority, Base_path, Base_query, Base_fragment = parseURI(base) A_scheme, A_authority, A_path, A_query, A_fragment = parseURI(abs) if Base_scheme != A_scheme: return abs elif Base_authority != A_authority: return buildURI(None, A_authority, A_path, A_query, A_fragment) elif Base_path == A_path: return buildURI(None, None, '', A_query, A_fragment) else: Base_segments = string.split(Base_path, '/') A_segments = string.split(A_path, '/') common = common_prefix_length(Base_segments, A_segments) Base_extra = len(Base_segments) - common if Base_extra == 0: # must include final common component rel_segments = A_segments[common-1:] else: rel_segments = (Base_extra - 1) * ['..'] + A_segments[common:] if re.search(':', rel_segments[0]) or rel_segments[0] == '': rel_segments = ['.'] + rel_segments return buildURI(None, None, string.join(rel_segments, '/'), A_query, A_fragment) I have been comparing my algorithms with the uripath.py implementation and do find some discrepancies. Comments on the following examples would be welcome. (Also, there was a note about two interoperable implementations for standardization - is what I'm doing helpful?) a. relative reference .//x My resolve_relative_reference and join of uripath.py agree: >>> join('http://a/b/c/', './/x') 'http://a/b/c//x' >>> resolve_relative_URI('http://a/b/c/', './/x') 'http://a/b/c//x' But refTo of uripath.py does not invert. >>> refTo('http://a/b/c/', 'http://a/b/c//x') 'http://a/b/c//x' >>> compute_relative_URI('http://a/b/c/', 'http://a/b/c//x') './/x' b. relative reference ./f:g I think refTo of uripath.py is incorrect here. >>> join('http://a/b/c/', './f:g') 'http://a/b/c/f:g' >>> resolve_relative_URI('http://a/b/c/', './f:g') 'http://a/b/c/f:g' >>> refTo('http://a/b/c/', 'http://a/b/c/f:g') 'f:g' >>> compute_relative_URI('http://a/b/c/', 'http://a/b/c/f:g') './f:g' join('http://a/b/c?y', '?z') c. relative reference ?y >>> resolve_relative_URI('http://a/b/c/d;p?q', '?y') 'http://a/b/c/d;p?y' >>> compute_relative_URI('http://a/b/c/d;p?q', 'http://a/b/c/d;p?y') '?y' uripath.py does not seem to agree with the spec: >>> join('http://a/b/c/d;p?q', '?y') 'http://a/b/c/?y'
Received on Saturday, 24 May 2003 15:00:34 UTC