@@ -106,21 +106,61 @@ rtString rtUrlGetOrigin(const char* url)
106106 }
107107
108108 // See http://www.ietf.org/rfc/rfc3986.txt.
109- // URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
110- // scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )
109+ // URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
110+ // scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )
111+ // hier-part = "//" authority path-abempty / path-absolute / path-rootless / path-empty
112+ // authority = [ userinfo "@" ] host [ ":" port ]
113+ // userinfo = *( unreserved / pct-encoded / sub-delims / ":" )
114+ // unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
115+ // pct-encoded = "%" HEXDIG HEXDIG
116+ // sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
117+ // host = IP-literal / IPv4address / reg-name
118+ // path-abempty = *( "/" segment )
119+ // path-absolute = "/" [ segment-nz *( "/" segment ) ]
120+ // path-rootless = segment-nz *( "/" segment )
121+ // path-empty = 0<pchar>
122+ // segment = *pchar
123+ // segment-nz = 1*pchar
124+ // pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
125+ //
126+ // See https://tools.ietf.org/html/rfc6454#section-7.
127+ // serialized-origin = scheme "://" host [ ":" port ]
128+ // ; <scheme>, <host>, <port> from RFC 3986
129+
111130 u = url;
131+
132+ // scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )
112133 for (; *u && (*u == ' +' || *u == ' -' || *u == ' .' || isalpha (*u) || isdigit (*u)); u++);
134+ // URI = scheme ":" ...
113135 if (*u == ' :' && u != url)
114136 {
115137 u++;
138+ // hier-part = "//" ...
116139 if (*u == ' /' && *(u + 1 ) == ' /' )
117140 {
141+ const char * hier_part = u;
118142 u += 2 ;
143+ rtString scheme (url, (uint32_t ) (u - 3 - url));
144+
145+ // URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
119146 for (; *u && *u != ' /' && *u != ' ?' && *u != ' #' ; u++);
120- uint32_t byteLen = (uint32_t ) (u - url);
121- return rtString (url, byteLen);
147+
148+ // authority = [ userinfo "@" ] host [ ":" port ]
149+ const char * host = u - 1 ;
150+ for (; host >= hier_part + 2 && *host != ' @' ; host--);
151+ host++;
152+
153+ // serialized-origin = scheme "://" host [ ":" port ]
154+ rtString host_port;
155+ if (u > host)
156+ {
157+ host_port = rtString (host, (uint32_t ) (u - host));
158+ }
159+
160+ return scheme + rtString (" ://" ) + host_port;
122161 }
123162 }
124163 }
164+
125165 return rtString ();
126166}
0 commit comments