http_uri.erl

来自「OTP是开放电信平台的简称」· ERL 代码 · 共 114 行

ERL
114
字号
% ``The contents of this file are subject to the Erlang Public License,%% Version 1.1, (the "License"); you may not use this file except in%% compliance with the License. You should have received a copy of the%% Erlang Public License along with this software. If not, it can be%% retrieved via the world wide web at http://www.erlang.org/.%% %% Software distributed under the License is distributed on an "AS IS"%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See%% the License for the specific language governing rights and limitations%% under the License.%% %% The Initial Developer of the Original Code is Ericsson Utvecklings AB.%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings%% AB. All Rights Reserved.''%% %%     $Id$%%-module(http_uri).-export([parse/1]).%%%=========================================================================%%%  API%%%=========================================================================parse(AbsURI) ->    case parse_scheme(AbsURI) of	{error, Reason} ->	    {error, Reason};	{Scheme, Rest} ->	    case (catch parse_uri_rest(Scheme, Rest)) of		{UserInfo, Host, Port, Path, Query} ->		    {Scheme, UserInfo, Host, Port, Path, Query};		_  ->		    {error, {malformed_url, AbsURI}}    	    end    end.%%%========================================================================%%% Internal functions%%%========================================================================parse_scheme(AbsURI) ->    case split_uri(AbsURI, ":", {error, no_scheme}, 1, 1) of	{error, no_scheme} ->	    {error, no_scheme};	{StrScheme, Rest} ->	    case list_to_atom(http_util:to_lower(StrScheme)) of		Scheme when Scheme == http; Scheme == https ->		    {Scheme, Rest};		Scheme ->		    {error, {not_supported_scheme, Scheme}}	    end    end.parse_uri_rest(Scheme, "//" ++ URIPart) ->    {Authority, PathQuery} = 	case split_uri(URIPart, "/", URIPart, 1, 0) of	    Split = {_, _} ->		Split;	    URIPart ->		case split_uri(URIPart, "\\?", URIPart, 1, 0) of		    Split = {_, _} ->			Split;		    URIPart ->			{URIPart,""}		end	end,        {UserInfo, HostPort} = split_uri(Authority, "@", {"", Authority}, 1, 1),    {Host, Port} = parse_host_port(Scheme, HostPort),    {Path, Query} = parse_path_query(PathQuery),    {UserInfo, Host, Port, Path, Query}.parse_path_query(PathQuery) ->    {Path, Query} =  split_uri(PathQuery, "\\?", {PathQuery, ""}, 1, 0),    {path(Path), Query}.    parse_host_port(Scheme,"[" ++ HostPort) -> %ipv6    DefaultPort = default_port(Scheme),    {Host, ColonPort} = split_uri(HostPort, "\\]", {HostPort, ""}, 1, 1),    {_, Port} = split_uri(ColonPort, ":", {"", DefaultPort}, 0, 1),    {Host, int_port(Port)};parse_host_port(Scheme, HostPort) ->    DefaultPort = default_port(Scheme),    {Host, Port} = split_uri(HostPort, ":", {HostPort, DefaultPort}, 1, 1),    {Host, int_port(Port)}.    split_uri(UriPart, SplitChar, NoMatchResult, SkipLeft, SkipRight) ->    case regexp:first_match(UriPart, SplitChar) of	{match, Match, _} ->	    {string:substr(UriPart, 1, Match - SkipLeft),	     string:substr(UriPart, Match + SkipRight, length(UriPart))}; 	nomatch ->	    NoMatchResult    end.default_port(http) ->    80;default_port(https) ->    443.int_port(Port) when is_integer(Port) ->    Port;int_port(Port) when is_list(Port) ->    list_to_integer(Port).path("") ->    "/";path(Path) ->    Path.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?