<bgdev />free

Вход Регистрация

Възможно ли е да се напише еднопасов URL-сплитер?
0

0 1
#93648 (ツ) johnfound
Създадено на 03.07.2023, видяно: 248 пъти.

В смисъл, функция, която да разделя URL на компоненти, относително коректен и да прави разделянето с едно минаване през стринга с URL? Или ако щете със сложност O(n).

Относително коректен означава, ако има на входа валидно URL, да го разделя коректно. Ако има невалидно URL, може да го разделя некоректно, но трябва да детектира, че URL-то е невалидно.

Всички елементи в URL-то може и да ги няма.

#93649 (ツ) palavrov
Създадено на 03.07.2023, видяно: 244 пъти.

Пробвал ли си там с разните му генератори на парсери по граматики които генерират крайни автомати?

#93650 (ツ) johnfound
Създадено на 03.07.2023, видяно: 230 пъти.
palavrov

Пробвал ли си там с разните му генератори на парсери по граматики които генерират крайни автомати?

Не. Не съм чак толкова добър програмист. Аз си ги пиша ръчно тия работи. Но тук даже не съм сигурен, че такова решение съществува...

#93652 (ツ) Stilgar
Създадено на 03.07.2023, видяно: 229 пъти.

O(N) със сигурност защото различните части на URL-то са константа и може да си ги събереш с един pass и после да пробваш различни неща върху списъка от части, single pass не знам...

#93655 (ツ) Реконструктор
Създадено на 03.07.2023, видяно: 217 пъти.

Не виждам що да не може

#93656 (ツ) palavrov
Последно редактирано на 03.07.2023 от palavrov, видяно: 215 пъти.
johnfound
palavrov

Пробвал ли си там с разните му генератори на парсери по граматики които генерират крайни автомати?

Не. Не съм чак толкова добър програмист. Аз си ги пиша ръчно тия работи. Но тук даже не съм сигурен, че такова решение съществува...

Парсер генераторите са вуду магии с дошли от праисторически митичнии програмисти които отдавна не живеят по нашите земи. Едва ли и чак толкова добрите програмисти които редовно ги ползват са наясно как точно работят затова може смело да ги погледнеш.

Там според разните му теории ако не бъркам имаше значение дали са с лява или дясна рекурсия за да може да се изгенерира краен автомат. Ако може то тогава със сигурност сложността ще е линейна и най вероятно ще може да е еднопасово. Само не знам дали няма да иска предварителен пас за да разбие всичко на токени - но то това е заобиколимо. Иска четене ...

#93662 (ツ) johnfound
Създадено на 04.07.2023, видяно: 180 пъти.

Добре, конкретен въпрос. По какво се отличава хоста от пътя?

Ясно, че ако има порт, то това преди него е хост. А ако няма изрично споменат порт?

Ето и списък на компонентите:

  struct URLparts
    .scheme    dd  ?   ; https://  двойния слеш част от схемата ли е или разделител?
    .user      dd  ?   ; username:
    .password  dd  ?   ; passw0rd@
    .host      dd  ?   ; localhost
    .port      dd  ?   ; :8080
    .path      dd  ?   ; /path/path/path/file.txt
    .query     dd  ?   ; ?arg=adoifjas
    .fragment  dd  ?   ; #local_fragment
  ends

Примери:

    /path/path/file.txt  просто абсолютен път на текущия хост (от рута)
    path/path/file.txt   относителен път на текущия хост, спрямо текущия път.
    host/path/file.txt   абсолютен път на хоста "host"
    https://host/path/file.txt  първото след схемата е хоста? Или след двойния слеш?
    user@host/path/file.txt     първото след юзера е хоста? Или не?
    google.com?q=something@myhost/path/ тук хоста е myhost, а не google.com

Реално в момента ми е трудно да предположа как да се различи вторият от третият пример? Или да се промени начина на запис, така че да са различими...

Някакви идеи-коментари?

#93663 (ツ) Golden Gega
Последно редактирано на 04.07.2023 от Golden Gega, видяно: 176 пъти.

Има си стандартни портове за http - 80, https - 443 ако се не лъжа и т.н.

Ако ти се занимава (което не ме учудва) с това нещо си потърси url regex

#93668 (ツ) Major Obvious
Създадено на 04.07.2023, видяно: 162 пъти.
johnfound

Добре, конкретен въпрос. По какво се отличава хоста от пътя?

Ясно, че ако има порт, то това преди него е хост. А ако няма изрично споменат порт?

Ето и списък на компонентите:

  struct URLparts
    .scheme    dd  ?   ; https://  двойния слеш част от схемата ли е или разделител?
    .user      dd  ?   ; username:
    .password  dd  ?   ; passw0rd@
    .host      dd  ?   ; localhost
    .port      dd  ?   ; :8080
    .path      dd  ?   ; /path/path/path/file.txt
    .query     dd  ?   ; ?arg=adoifjas
    .fragment  dd  ?   ; #local_fragment
  ends

Примери:

    /path/path/file.txt  просто абсолютен път на текущия хост (от рута)
    path/path/file.txt   относителен път на текущия хост, спрямо текущия път.
    host/path/file.txt   абсолютен път на хоста "host"
    https://host/path/file.txt  първото след схемата е хоста? Или след двойния слеш?
    user@host/path/file.txt     първото след юзера е хоста? Или не?
    google.com?q=something@myhost/path/ тук хоста е myhost, а не google.com

Реално в момента ми е трудно да предположа как да се различи вторият от третият пример? Или да се промени начина на запис, така че да са различими...

Някакви идеи-коментари?

Ти всички възможни видове урл-та на света ли искаш да парсваш или ще се ограничиш до някое подмножество? :) Конкретно в HTTP протокола, хоста не е опционален елемент и първите ти два примера не са валидни урл-та. Спецификацията я има тук: https://datatracker.ietf.org/doc/html/rfc1738

#93671 (ツ) BIGBUGEX
Последно редактирано на 04.07.2023 от BIGBUGEX, видяно: 146 пъти.

Преди много време правих собствено рутиране, като държах съдържанието на файловете в паметта. Това с nginx, и поддомейните ми бяха като контролери (от схемата MVC). Но до колкото си спомням ползвах някакво (С) апи преди фцги интерфейса. Трябва да погледна. Сайта беше на С++.

Едит: libfcgi.a е библиотеката.

#93673 (ツ) Stilgar
Създадено на 04.07.2023, видяно: 134 пъти.
johnfound

Добре, конкретен въпрос. По какво се отличава хоста от пътя?

Ясно, че ако има порт, то това преди него е хост. А ако няма изрично споменат порт?

Ето и списък на компонентите:

  struct URLparts
    .scheme    dd  ?   ; https://  двойния слеш част от схемата ли е или разделител?
    .user      dd  ?   ; username:
    .password  dd  ?   ; passw0rd@
    .host      dd  ?   ; localhost
    .port      dd  ?   ; :8080
    .path      dd  ?   ; /path/path/path/file.txt
    .query     dd  ?   ; ?arg=adoifjas
    .fragment  dd  ?   ; #local_fragment
  ends

Примери:

    /path/path/file.txt  просто абсолютен път на текущия хост (от рута)
    path/path/file.txt   относителен път на текущия хост, спрямо текущия път.
    host/path/file.txt   абсолютен път на хоста "host"
    https://host/path/file.txt  първото след схемата е хоста? Или след двойния слеш?
    user@host/path/file.txt     първото след юзера е хоста? Или не?
    google.com?q=something@myhost/path/ тук хоста е myhost, а не google.com

Реално в момента ми е трудно да предположа как да се различи вторият от третият пример? Или да се промени начина на запис, така че да са различими...

Някакви идеи-коментари?

Малко ми се чини че са неразличими тея. Може би host може да кажеш, че следва да е нещо с точка в него или localhost и така да го разпознаваш

#93674 (ツ) Golden Gega
Създадено на 04.07.2023, видяно: 129 пъти.

Важното е че ще отидат 5 дена за нещо дето се прави за 2 мин

#93675 (ツ) Major Obvious
Създадено на 04.07.2023, видяно: 126 пъти.
Golden Gega

Важното е че ще отидат 5 дена за нещо дето се прави за 2 мин

Може, но парсера на джони ще е средно с 5 милисекунди по-бърз от готовата библиотека и тия 5 дни загубени ще се избият за нула време.

#93676 (ツ) Golden Gega
Създадено на 04.07.2023, видяно: 125 пъти.
Major Obvious
Golden Gega

Важното е че ще отидат 5 дена за нещо дето се прави за 2 мин

Може, но парсера на джони ще е средно с 5 милисекунди по-бърз от готовата библиотека и тия 5 дни загубени ще се избият за нула време.

Когато си прав, прав си, а и може да се направи някаква световна иновация в парсирането

#93678 (ツ) Major Obvious
Създадено на 04.07.2023, видяно: 122 пъти.
Golden Gega

а и може да се направи някаква световна иновация в парсирането

По-скоро усещам че на форумния хаксор, дето намери 10-на секюрити дупки, ще му се отвори още доста работа.

#93679 (ツ) Дон Реба
Създадено на 04.07.2023, видяно: 120 пъти.

как никой до сега нбе каза "хахаха на виндовс проблем няма"

#93680 (ツ) Един от многото
Създадено на 04.07.2023, видяно: 109 пъти.
Дон Реба

как никой до сега нбе каза "хахаха на виндовс проблем няма"

Ахахах, припомни ми тая класика. 😄

#93682 (ツ) johnfound
Създадено на 04.07.2023, видяно: 107 пъти.
Major Obvious

Ти всички възможни видове урл-та на света ли искаш да парсваш или ще се ограничиш до някое подмножество? :) Конкретно в HTTP протокола, хоста не е опционален елемент и първите ти два примера не са валидни урл-та. Спецификацията я има тук: https://datatracker.ietf.org/doc/html/rfc1738

Ами те всички URL-та са по една схема. Ако работи с едните, трябва да работи със всички. В HTTP протокола, хоста е опционален. Ето ти една връзка без хост: /wazmovno-li-e-da-se-napishe-ednopasow-url-spliter.7946 която си работи съвсем даже добре.

Спецификацията я четох и пак ще я чета, но нещо много объркана ми се струва и не съм сигурен, че се спазва особено точно. Порових малко из нета и се оказва, че има няколко варианта на библиотеки за сплитване на URL-та които не работят еднакво...

#93684 (ツ) Stilgar
Създадено на 04.07.2023, видяно: 98 пъти.
Major Obvious
Golden Gega

Важното е че ще отидат 5 дена за нещо дето се прави за 2 мин

Може, но парсера на джони ще е средно с 5 милисекунди по-бърз от готовата библиотека и тия 5 дни загубени ще се избият за нула време.

И като казваш "милисекунди" сигурно имаш предвид наносекунди и то ако URL-то е поне 3000 символа

#93685 (ツ) Stilgar
Създадено на 04.07.2023, видяно: 97 пъти.
johnfound
Major Obvious

Ти всички възможни видове урл-та на света ли искаш да парсваш или ще се ограничиш до някое подмножество? :) Конкретно в HTTP протокола, хоста не е опционален елемент и първите ти два примера не са валидни урл-та. Спецификацията я има тук: https://datatracker.ietf.org/doc/html/rfc1738

Ами те всички URL-та са по една схема. Ако работи с едните, трябва да работи със всички. В HTTP протокола, хоста е опционален. Ето ти една връзка без хост: /wazmovno-li-e-da-se-napishe-ednopasow-url-spliter.7946 която си работи съвсем даже добре.

Спецификацията я четох и пак ще я чета, но нещо много объркана ми се струва и не съм сигурен, че се спазва особено точно. Порових малко из нета и се оказва, че има няколко варианта на библиотеки за сплитване на URL-та които не работят еднакво...

А може ли да има хост без протокол?

0 1

Възможно ли е да се напише еднопасов URL-сплитер?
0

AsmBB v3.0 (check-in: a316dab8b98d07d9); SQLite v3.42.0 (check-in: 831d0fb2836b71c9);
©2016..2023 John Found; Licensed under EUPL. Powered by Assembly language Created with Fresh IDE