LINUX.ORG.RU

Програмка на erlang, как учлушить?


0

0

Всем привет.

Написал такую фиговину на erlang - на вход подаётся строка uri, на выходе - record из четырёх компонентов scheme, authority, path, query. Регэкспы из RFC2396.

Сдаётся мне что-то тут недостаточно функционально, может кто подскажет, как учучшить?

-module(uri).

-export([parse/1]).

-record(uri, {
	  scheme,
	  authority,
	  path,
	  query_component % 'query' is the reserved erlang word
	 }).

-define(URI_SCHEME_RE,    "^([^:/?#]+):").
-define(URI_AUTHORITY_RE, "^//([^/?#]*)").
-define(URI_PATH_RE,      "^[^?#]*").
-define(URI_QUERY_RE,     "^[?]([^#]*)").

parse(URI) ->
    parse_scheme(URI, #uri{}).

parse_scheme(URI, Record) ->
    case regexp:first_match(URI, ?URI_SCHEME_RE) of
	{match, _, Length} ->
	    {Scheme, [$: | Rest]} = lists:split(Length - 1, URI),
	    parse_authority(Rest, Record#uri{scheme = Scheme});
	nomatch ->
	    parse_authority(URI, Record)
    end.

parse_authority(URI, Record) ->
    case regexp:first_match(URI, ?URI_AUTHORITY_RE) of
	{match, _, Length} ->
	    {[$/, $/ | Authority], Rest} = lists:split(Length, URI),
	    parse_path(Rest, Record#uri{authority = Authority});
	nomatch ->
	    parse_path(URI, Record)
    end.

parse_path(URI, Record) ->
    case regexp:first_match(URI, ?URI_PATH_RE) of
	{match, _, Length} ->
	    {Path, Rest} = lists:split(Length, URI),
	    parse_query(Rest, Record#uri{path = Path});
	nomatch ->
	    parse_query(URI, Record)
    end.

parse_query(URI, Record) ->
    case regexp:first_match(URI, ?URI_QUERY_RE) of
	{match, _, Length} ->
	    {[$? | Query], _} = lists:split(Length, URI),
	    Record#uri{query_component = Query};
	nomatch ->
	    Record
    end.
★★★★
Ответ на: комментарий от ott

Это где такое? У меня такового модуля нет. Хотя в общем-то суть не в том, что конкретно этот код делает. =)

Bohtvaroh ★★★★
() автор топика
Ответ на: комментарий от Bohtvaroh

Всё-таки http_uri:parse/1 не кошерен - не умеет относительные пути...

Bohtvaroh ★★★★
() автор топика

Переписал без регэкспов, а то с ними было чудовищно медленно, теперь работает где-то в 3 раза быстрее http_uri:parse/1, правда у меня порт и юзернэйм из authority не выщемляется, но это на вскидку значительно на результат не влияет.

http://pastebin.com/f5af209c2

Bohtvaroh ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.