Variant HHVM_FUNCTION(parse_url, const String& url, int64_t component /* = -1 */) { Url resource; if (!url_parse(resource, url.data(), url.size())) { return false; } if (component > -1) { switch (component) { case k_PHP_URL_SCHEME: RETURN_COMPONENT(scheme); break; case k_PHP_URL_HOST: RETURN_COMPONENT(host); break; case k_PHP_URL_USER: RETURN_COMPONENT(user); break; case k_PHP_URL_PASS: RETURN_COMPONENT(pass); break; case k_PHP_URL_PATH: RETURN_COMPONENT(path); break; case k_PHP_URL_QUERY: RETURN_COMPONENT(query); break; case k_PHP_URL_FRAGMENT: RETURN_COMPONENT(fragment); break; case k_PHP_URL_PORT: if (resource.port) { return resource.port; } break; default: raise_warning( "parse_url(): Invalid URL component identifier %" PRId64, component); return false; } return init_null(); } ArrayInit ret(resource.port ? 8 : 7, ArrayInit::Map{}); SET_COMPONENT(scheme); SET_COMPONENT(host); if (resource.port) { ret.set(s_port, (int64_t)resource.port); } SET_COMPONENT(user); SET_COMPONENT(pass); SET_COMPONENT(path); SET_COMPONENT(query); SET_COMPONENT(fragment); return ret.toVariant(); }
Variant f_parse_url(CStrRef url, int component /* = -1 */) { Url resource; if (!url_parse(resource, url.data(), url.size())) { raise_notice("invalid url: %s", url.data()); return false; } if (component > -1) { switch (component) { case PHP_URL_SCHEME: RETURN_COMPONENT(scheme); break; case PHP_URL_HOST: RETURN_COMPONENT(host); break; case PHP_URL_USER: RETURN_COMPONENT(user); break; case PHP_URL_PASS: RETURN_COMPONENT(pass); break; case PHP_URL_PATH: RETURN_COMPONENT(path); break; case PHP_URL_QUERY: RETURN_COMPONENT(query); break; case PHP_URL_FRAGMENT: RETURN_COMPONENT(fragment); break; case PHP_URL_PORT: if (resource.port) { return resource.port; } break; default: throw_invalid_argument("component: %d", component); return false; } return null; } Array ret; SET_COMPONENT(scheme); SET_COMPONENT(host); SET_COMPONENT(user); SET_COMPONENT(pass); SET_COMPONENT(path); SET_COMPONENT(query); SET_COMPONENT(fragment); if (resource.port) { ret.set("port", (int64)resource.port); } return ret; }
Variant f_parse_url(const String& url, int component /* = -1 */) { Url resource; if (!url_parse(resource, url.data(), url.size())) { return false; } if (component > -1) { switch (component) { case k_PHP_URL_SCHEME: RETURN_COMPONENT(scheme); break; case k_PHP_URL_HOST: RETURN_COMPONENT(host); break; case k_PHP_URL_USER: RETURN_COMPONENT(user); break; case k_PHP_URL_PASS: RETURN_COMPONENT(pass); break; case k_PHP_URL_PATH: RETURN_COMPONENT(path); break; case k_PHP_URL_QUERY: RETURN_COMPONENT(query); break; case k_PHP_URL_FRAGMENT: RETURN_COMPONENT(fragment); break; case k_PHP_URL_PORT: if (resource.port) { return resource.port; } break; default: throw_invalid_argument("component: %d", component); return false; } return uninit_null(); } ArrayInit ret(8); SET_COMPONENT(scheme); SET_COMPONENT(host); if (resource.port) { ret.set(s_port, (int64_t)resource.port); } SET_COMPONENT(user); SET_COMPONENT(pass); SET_COMPONENT(path); SET_COMPONENT(query); SET_COMPONENT(fragment); return ret.create(); }