3. Redireccions HTTP (3 punts)

El registre d’accés a un servidor d’HTTP (web) conté línies com les següents:

10.0.171.19 srv09.example.edu [12/Mar/2023:00:01:05 +0100] "GET /fi/examens/curs2019-2020/2/L2/G10/reescalat.html HTTP/1.1" 301 "Mozilla/5.0 (compatible; SemrushBot/7~bl; +http://www.semrush.com/bot.html)"
10.0.115.33 srv03.example.edu [12/Mar/2023:00:01:30 +0100] "GET /inf/examens/curs2022-2023/1/L1-G40/solucio.html HTTP/1.1" 304 "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36"
10.0.207.108 srv08.example.edu [12/Mar/2023:00:00:30 +0100] "GET /inf/_sources/examens/curs2018-2019/1/parcial-torn1/index.rst.txt HTTP/1.1" 200 "Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)"

Totes les línies tenen la mateixa estructura i contenen la informació següent: IP del client, domini, data i hora, petició d’accés rebuda, codi de l’estat i agent que envia la petició. Aquestes dades estan separades per un espai en blanc. Però, observa que la petició i l’agent estan delimitats per cometes dobles, i que la data i l’hora de la petició estan agrupades amb claudàtors.

Per exemple, a la primera línia del registre anterior,

  • la IP del client és 10.0.171.19,

  • el domini és srv09.example.edu,

  • la data i hora és [12/Mar/2023:00:01:05 +0100],

  • la petició és "GET /fi/examens/curs2019-2020/2/L2/G10/reescalat.html HTTP/1.1",

  • el codi d’estat és 301 i

  • l’agent és "Mozilla/5.0 (compatible; SemrushBot/7~bl; +http://www.semrush.com/bot.html)".

Per tal d’analitzar dades d’accés a un servidor d’HTTP, dissenya les funcions següents i desa-les al mòdul redireccions (fitxer redireccions.py):

redireccions.analitza_linia(linia)

Retorna la IP, el domini, la petició, l’estat i l’agent continguts en linia.

El paràmetre linia (str) és una línia d’un registre d’accés d’un servidor d’HTTP.

La IP, el domini, la petició i l’agent són strings extrets de linia. L’estat també s’ha d’extreure de linia, però com a enter.

Per exemple:


>>> print(linies_l[0])
10.0.171.19 srv09.example.edu [12/Mar/2023:00:01:05 +0100] "GET /fi/examens/curs2019-2020/2/L2/G10/reescalat.html HTTP/1.1" 301 "Mozilla/5.0 (compatible; SemrushBot/7~bl; +http://www.semrush.com/bot.html)"
>>> ip, dom, pt, est, ag = analitza_linia(linies_l[0])
>>> ip
'10.0.171.19'
>>> dom
'srv09.example.edu'
>>> pt
'GET /fi/examens/curs2019-2020/2/L2/G10/reescalat.html HTTP/1.1'
>>> est
301
>>> ag
'Mozilla/5.0 (compatible; SemrushBot/7~bl; +http://www.semrush.com/bot.html)'

Fixa’t que tant la petició com l’agent estan delimitats per cometes dobles a la línia, però que les cometes dobles no hi han de ser al resultat.

Trobaràs més tests al fitxer test-redireccions-analitza_linia.txt


redireccions.codi_3xx(linies)

El paràmetre linies és una llista d'strings en què cada element és una línia d’un registre d’accés d’un servidor d’HTTP.

Retorna la llista dels accessos que tenen un codi de l’estat entre 300 (inclòs) i 400 (exclòs) i que corresponen a un bot.

Un accés correspon a un bot si l’agent de la petició conté +http.

Els elements de la llista resultant són tuples de tres elements: el domini, el recurs al qual es vol accedir i la IP. Dins la petició, el recurs està separat per un espai en blanc del mètode, que el precedeix, i de la versió del protocol, que el segueix.

A la petició de la primera línia de l’exemple, el recurs és /fi/examens/curs2019-2020/2/L2/G10/reescalat.html, el mètode és GET i el protocol HTTP/1.1.


>>> from pprint import pprint

>>> pprint(linies_l[:3])
['10.0.171.19 srv09.example.edu [12/Mar/2023:00:01:05 +0100] "GET '
 '/fi/examens/curs2019-2020/2/L2/G10/reescalat.html HTTP/1.1" 301 "Mozilla/5.0 '
 '(compatible; SemrushBot/7~bl; +http://www.semrush.com/bot.html)"',
 '10.0.115.33 srv03.example.edu [12/Mar/2023:00:01:30 +0100] "GET '
 '/inf/examens/curs2022-2023/1/L1-G40/solucio.html HTTP/1.1" 304 "Mozilla/5.0 '
 '(Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
 'Chrome/110.0.0.0 Safari/537.36"',
 '10.0.207.108 srv08.example.edu [12/Mar/2023:00:00:30 +0100] "GET '
 '/inf/_sources/examens/curs2018-2019/1/parcial-torn1/index.rst.txt HTTP/1.1" '
 '200 "Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)"']
>>> c3xx = codi_3xx(linies_l[:3])
>>> pprint(c3xx)
[('srv09.example.edu',
  '/fi/examens/curs2019-2020/2/L2/G10/reescalat.html',
  '10.0.171.19')]

Trobaràs més tests al fitxer test-redireccions-codi_3xx.txt