Sunteți pe pagina 1din 22

Ministerul Educaiei al Republicii Moldova

Universitatea Tehnic a Moldovei


Facultatea Calculatoare, Informatica i Microelectronica
Departamentul Inginerie Software i Automatic

Raport
Lucrare de laborator nr.3
Disciplina: Programarea n reea
Tema: Protocolul HTTP

A efectuat:
St. gr. TI-143 GainaCristin

A verificat:
Lect. asist. Ciudin S.

Chiinu 2017
Cuprins
1
HTTP protocol..................................................................................................................................3

1.1. Modul de funcionare...............................................................................................................3

1.2. Erori de HTTP..........................................................................................................................3

1.3. Metode.....................................................................................................................................8

1.4. Cmpurile headerului...............................................................................................................9

2.HTML Agility Pack.....................................................................................................................10

3.WebRequest i WebResponse.....................................................................................................12

4.Dispatcher....................................................................................................................................14

5.Realizarea lucrrii de laborator................................................................................................16

Concluzii.........................................................................................................................................17

Bibliografie.....................................................................................................................................18

Anexa A MainWindow...................................................................................................................19

Anexa B WebCrawling..................................................................................................................21

2
1.HTTP protocol

Hypertext Transfer Protocol (HTTP) este metoda cea mai des utilizat pentru accesarea
informaiilor n Internet care sunt pstrate pe servere World Wide Web (WWW). Protocolul HTTP este un
protocol de tip text, fiind protocolul "implicit" al WWW. Adic, dac un URL nu conine partea de
protocol, aceasta se consider ca fiind http. HTTP presupune c pe calculatorul destina ie ruleaz un
program care nelege protocolul. Fiierul trimis la destinaie poate fi un document HTML (abreviaie de
la HyperText Markup Language), un fiier grafic, de sunet, animaie sau video, de asemenea un program
executabil pe server-ul respectiv sau i un editor de text. Dup clasificarea dup modelul de referin OSI,
protocolul HTTP este un protocol de nivel aplicaie. Realizarea i evoluia sa este coordonat de ctre
World Wide Web Consortium (W3C).

1.1.Modul de funcionare

HTTP ofer o tehnic de comunicare prin care paginile web se pot transmite de la un computer
aflat la distan spre propriul computer. Dac se apeleaz un link sau o adres de web cum ar fi
http://www.example.com, atunci se cere calculatorului host s afieze o pagin web (index.html sau
altele). n prima faz numele (adresa) www.example.com este convertit de protocolul DNS ntr-o adres
IP. Urmeaz transferul prin protocolul TCP pe portul standard 80 al serverului HTTP, ca rspuns la
cererea HTTP-GET. Informaii suplimentare ca de ex. indica ii pentru browser, limba dorit .a. se pot
aduga n header-ul (antetul) pachetului HTTP. n urma cererii HTTP-GET urmeaz din partea serverului
rspunsul cu datele cerute, ca de ex.: pagini n (X)HTML, cu fiiere ataate ca imagini, fi iere de stil
(CSS), scripturi (Javascript), dar pot fi i pagini generate dinamic (SSI, JSP, PHP i ASP.NET). Dac
dintr-un anumit motiv informaiile nu pot fi transmise, atunci serverul trimite napoi un mesaj de eroare.
Modul exact de desfurare a acestei aciuni (cerere i rspuns) este stabilit n specificaiile HTTP.

1.2.Erori de HTTP

Erorile de HTTP sunt clasificate n 5 clase (categorii). Acestea sunt (pentru fiecare clasa sunt date
cteva dintre erorile coninute):

1xx - erori informaionale: aceast clas a status-ului indic un rspuns provizoriu al serverului
i conine numai linia de status (de rspuns) sau alte aplicaii opionale. Nu sunt aplicaii necesare
pentru acest clasa de rspuns/status. Aceste status-uri pot fi ignorate.

100 - contiunu:
Utilizatorul ar trebui s i continue cererea/aciunea. Acest rspuns provizoriu este folosit pentru a

3
informa utilizatorul c partea iniial a cererii a fost receptat i c deocamdat nu a fost refuzat
de server. Utilizatorul ar trebui s continue i s ignore acest rspuns.

101 - schimbare protocol:


Server-ul nelege i are intenia de a de a ndeplini cererea utilizatorului, rspunnd prin aceast
eroare c pri ale server-ului sunt n proces de schimbare/mutare. Server-ul va schimba protocolul
imediat dup ce rspunsul pentru linia 101 va fi terminat. Protocolul ar trebui schimbat doar n
momentul n care acest lucru este avantajos i se permite.

2xx - rspuns reuit: clasa de rspuns/status ce indic utilizatorului c cererea a fost primit,
neleas i acceptat cu succes.

200 - ok:
Aceast cerere a fost executat cu succes. Informaia a revenit cu un rspuns pozitiv, indiferent de
modul n care s-a fcut cererea.

201 - creat/realizat:
Cererea a fost ndeplinit avnd ca rezultat crearea unui nou rezultat. Noul rezultat poate fi
referit/raportat de ctre URI-uile napoiate la intrarea rspunsului.

202 - acceptat:
Cererea a fost acceptata pentru procesare, dar aceasta din urm nu a fost terminat complet.
Scopul acestui mesaj este de a permite unui server s accepte cereri de la ali utilizatori, fr a cere
conexiunii clientului s insiste pn ce procesul/cererea e complet.

203 - informaie neautorizat:


Informaia returnat/revenit nu e definitiv ca fiind din server-ul principal, ci e
adunata/receptionata de la un server local.

204 - fara continut:


Server-ul a indeplinit cererea si nu e nevoit sa intoarca raspunsul, dar ar dori sa raspunda printr-o
informaie recent, gen meta.

205 - coninut refcut:


Cererea a fost ndeplinita i ar trebui ca browser-ul s poat modifica/reseta modul de vizualizare a
documentului ce a cauzat aceast cerere ctre server.

4
206 - coninut parial:
Serverul a ndeplinit parial cererea de primire de la surs.

3xx - redirectri: aceast clas de rspuns/status indic faptul c aciunile urmtoare vor trebui
fcute de browser pentru a putea fi ndeplinita cererea. Cererea ar putea fi direcionat de browser
fr a interaciona cu utilizatorul dac i numai dac metoda folosit n cea de a doua cerere este
Primit/recepionat sau Direcionat/condus.

300 - diferite/multiple alegeri:


Sursa cererii corespunde unor seturi de descrieri, fiecare cu locaii specifice, iar browser-ul - dat
fiind negocierea informaiei, primete rspunsul astfel nct utilizatorul/browser-ul s poat alege
modul dorit astfel nct redirectarea s fie spre acea locaie. n cazul n care cererea a fost de tip
Condus/trimis, rspunsul ar trebui s includ o intrare cu lista caracteristicilor i locaiilor de
unde utilizatorul sau browser-ul poate alege sursa cea mai apropiat.

301 - modificat/mutat permanent:


Cererii i-a fost atribuite o surs nou i permanent URI iar cererile urmtoare ar trebui s
foloseasc una din sursele returnate URI. Dac acest mesaj/cod este primit ca rspuns al unei
cereri tip Primit/recepionat sau Direcionat/condus, browser-ul nu trebuie s redirectioneze
automat cererea, doar dac nu poate fi confirmat de ctre utilizator.

302 - gsit:
Sursa cererii este temporar pe un alt URI. n cazul n care redirectarea ar putea fi schimbat
ocazional, utilizatorul ar trebui s foloseasc n continuare cererea URI (Request-URI) n cazul
unor cereri ulterioare.

Dac mesajul/statusul 302 este recepionat ca rspuns al unei cereri alta dect Primit/recepionat
sau Direcionat/condus, browser-ul nu trebuie s redirecteze automat cererea dac aceasta nu
poate fi confirmat de crte utilizator.

303 - vezi alta surs:


Rspunsul cererii poate fi gsit sub un diferit URI i ar trebui s fie recepionat folosind metoda
Primit/recepionat de la acea surs.

304 - nemodificat:
n cazul n care clientul a efectuat o cerere de tip Primit/recepionat i accesul este permis, dar
documentul nu a fost modificat, serverul ar trebui s rspund cu acest mesaj/status.
5
305 - folosete proxy:
Cererea trebuie accesat printr-un proxy dat de ctre cmpul de locaie. Acesta este dat de ctre
URI. Beneficiarul va repeta acest unic cerere prin intermediul unui proxy. Rspunsul 305 va fi
generat doar de ctre serverul de origine.

306 (nefolosit):
Acest mesaj/status a fost folosit ntr-o vesiune anterioar a specificaiilor deci nu mai este folosit,
el fiind reinut.

307 - redirectare temporar:


Sursa cerut se afl temporar la un diferit URI. Din moment ce redirectarea poate fi modificata
ocazional, utilizatoarul ar trebui s continuie s foloseasc URI-ul cerut pentru viitoarele aciuni.

4xx - erori ale utilizatorilor: aceast clas de mesaje/statusuri este folosit n cazurile n care
utilizatorul ar putea grei formularea cererii. Excepia fiind rspunsurule pentru cererile tip
Direcionat/condus, atunci serverul ar trebui s conin o intrare cu o explicaie a situaiei erorii
i dac e o eroare temporar sau pemanent. Aceste rspunsuri sunt aplicabile pentru orice fel de
cerere. Browser-ele ar trebui s arate orice intrare cerut de utilizator.

400 - cerere greit:


Cererea nu a putut fi neleas/perceput de ctre server din cauza unei sintaxe greite/incomplete.
Utilizatorul ar trebui s nu repete cererea fr ca aceasta s suporte modificri.

401 - neautorizat:
Cererea necesit autentificarea/nregistrarea utilizatorului. Rspunsul trebuie s includ WWW -
cmp de autentificare coninnd o somaie aplicabil utilizatorului. Utilizatorul poate repeta
cererea. Dac cererea deja includea cmpul de autorizare, atunci raspunsul 401 indic faptul c
autorizarea a fost refuzat. Dac rspunsul 401 conine aceeai somaie ca rspuns principal iar
browser-ul a executat autentificarea cel puin o dat, atunci utilizatorul ar trebui s i se prezinte
intrarea dat n rspuns, din moment ce aceasta include informaii relevante.

402 - necesit plata:


Rezervat pentru utilizare ulterioar.

403 - interzis:
Serverul a neles cererea, dar refuz s o ndeplineasc. Autorizarea nu ajut n nici un caz, iar
cererea nu ar mai trebui repetata.
6
404 - negsit:
Serverul nu a gsit nimic care s corespund cererii URI. Nu se dau indicaii despre condiia
temporar sau permanent.

405 - metod nepermis:


Metoda specificat n linia de cerere (Request-Line) nu este permis de ctre sursa identificat
dup URI-ul cerut.

406 - neacceptat:
Sursa identificat de cerere este capabil s genereze doar intrri care au coninut specific
neacceptat de ctre condiiile de acceptare trimise prin cerere.

407 - autentificare prin proxy:


Mesajul este similar celui 401, dar indic situaia n care utilizatorul trebuie s se autentifice prin
proxy.

408 - cerere expirat:


Utilizatorul nu a fcut cererea n timpul n care serverul era pregtit sa o atepte. Se poate repeta
cererea fr modificri prealabile.

5xx - erori de server: rspunsurile/status-urile ce ncep cu unitatea/cifra 5 indic cazurile n care


serverul e contient de greelile produse sau e incapabil s execute cererea. Excepie facnd
rspunsul unei cereri Direcionat/condus, serverul ar trebui, n acest caz sa includ o afiare cu o
explicaie a situaiei de eroare, fie c e temporara sau permanent.

500 - eroare intern de server:


Server-ul a ntmpinat o condiie neateptat i o previne spre a putea ndeplini cererea.

501 - nendeplinit/nerecunoscut:
Server-ul nu poate suporta funcionalitatea cerut pentru a putea ndeplini cererea. Acesta este
rspunsul specific n cazurile n care server-ul nu recunoate metoda de cerere i nu e capabil s o
suporte indiferent de mijloc/resurs.

502 - poart/ieire greit:


Server-ul, n timp ce ncerca s se comporte ca o poart/ieire sau ca un proxy, a recepionat un
rspuns invalid de la un server de deasupra/anterior n ncercarea de a ndeplini cererea.

7
503 - serviciu nedisponibil:
n prezent server-ul nu poate s se ocupe de cererile trimise din cauza unei suprancrcri sau a
serviciilor de ntreinere a server-ului ce au loc n acel moment. Aceasta este o stare temporar i
n curnd va fi remediat.

504 - poart/ieire expirat:


Server-ul, n timp ce ncerca s se comporte ca o poart/ieire sau ca un proxy, nu a primit un
rspuns la timp de la serverele de deasupra/anterioare lui specificat de URI (ex. HTTP, FTP,
LDAP) sau de la un server auxiliar (ex. DNS) necesar accesrii n ncercarea de a
termina/ndeplini cererea.

505 - versiunea HTTP nu e suportat/susinut:


Serveru-l nu suport sau refuz s suporte versiunea de protocol a HTTP ce a fost folosit n
formularea cererii. Server-ul sugereaz c e incapabil s completeze/termine cererea folosind
aceeai versiune cu cea a clientului.

1.3.Metode

Metodele disponibile sunt :

1. GET: este cea mai folosit metod, fiind utilizat atunci cnd serverului i se cere o resurs.

2. HEAD: se comport exact ca metoda GET, dar serverul returneaz doar antetul resursei, ceea
ce permite clientului s inspecteze antetul resursei, fr a fi nevoit s obin i corpul resursei.

3. PUT: metoda este folosit pentru a depune documente pe server, fiind inversul metodei GET.

4. POST: a fost proiectat pentru a trimite date de intrare ctre server.

5. DELETE: este opusul metodei PUT.

6. TRACE: este o metod folosit de obicei pentru diagnosticare, putnd da mai multe informa ii
despre traseul urmat de legtura HTTP, fiecare server proxy adugndu-i semntura n antetul
Via.

7. OPTIONS: este folosit pentru identificarea capacitilor serverului Web, nainte de a face o
cerere.

8
8. CONNECT: este o metod folosit n general de serverele intermediare.

1.4.Cmpurile headerului

Cmpurile headerului este descrierea cererile i a rspunsurile mesajelor n


HTTP. Cmpurile definesc parametri de procesare a unui tranfer HTTP.

Accept Tipul de content care este acceptat de cerere.

Authorization autentificarea pentru HTTP autentificare.

Connection controleaz opiunile pentru conectarea conect i lista de Hop-


By-Hop cmpuri ale cererii.

Content-Length lungimea corpului de cerere msurat n octei (8-bit).

Date timpul cnd a fost expediat mesajul.

From adresa de mail a utilizatorului care a format cererea.

Acestea nu sunt toate cmpurile headerului.

9
2.HTML Agility Pack

HTML Agility Pack este un HTML parser agil, care construie te un DOM
citire/scriere i suport XPATH sau XSLR. n cuvinte mai simple este o librarie .Net
care permite parsarea web fiierilor (HTML, PHP sau aspx).

Putem instala libraria HTML Agility Pack prin serviciul Nuget. Este posibil de
instalat prin Package Manager Console Install-Package HtmlAgilityPack.

Dup ce am adugat referina la librrie trebuie s adaugm numele de spa iu


a librrii care este using HtmlAgilityPack.

Pentru a parsa un HTML fiier de pe un server (pentru a parsa un link din


internet) este posibil de utilizat clasa HtmlWeb.

HtmlWeb web = new HtmlWeb();

HtmlDocument document = web.Load(link);

Dup execuia codului de sus n variabila document se va afla tot html-ul.

Dac avem deacum un document html care trebuie sa fie parsat e destul
urmtoarea:

HtmlDocument document = new HtmlDocument();

Document.Load(directiva);

Urmeaz un exemplu concret:

<html>
<head>
</head>
<body>
<div id="div1">
<a href="div1-a1">Link 1 inside div1</a>
<a href="div1-a2">Link 2 inside div1</a>
</div>
<a href="a3">Link 3 outside all divs</a>
10
<div id="div2">
<a href="div2-a1">Link 1 inside div2</a>
<a href="div2-a2">Link 2 inside div2</a>
</div>
</body>
</html>
Avem un document Html mai sus, de exemplu dorim tagurile a, adica toate
hyperlinkurile.

HtmlDocument document2 = new HtmlDocument();


document2.Load(@"C:\Temp\sample.txt")
HtmlNode[] nodes = document2.DocumentNode.SelectNodes("//a").ToArray();

Specificarea unui div din document:

HtmlDocument document2 = new HtmlDocument();


document2.Load(@"C:\Temp\sample.txt")
HtmlNode node = document2.DocumentNode.SelectNodes("//div[@id='div1']").First();

11
3.WebRequest i WebResponse

WebRequest este o clas abstract prin care se face cerere de la oare care
server prin intermediul URI. Clasa se afl n System.Net ca i WebResponse.
WebResponse este o clas n care se nscrie rspunsul de la cererea transmis
anterior.

WebRequest are dou constructoare:

WebRequest() iniializeaz un nou exemplar al clasei WebRequest.

WebRequest(SerializationInfo,StreamingContext) se iniializeaz pe baza unor


valori unicale.

Proprietile clasei WebRequest sunt:

Method ntoarce sau seteaz metoda de cerere la server.

RequestUri ntoarce sau seteaz uri pe care se va face o cerere.

TimeOut seteaz sau ntoarce timpul de viaa unei cereri.

Metodele clasei WebRequest sunt:

Abort() ntrerupe cererea.

Create(Uri) iniializeaz o instan WebRequest cu uri specificat.

CreateHttp(Uri) iniializeaz o instan HttpWebRequest cu uri specificat.

Exemplu:

using System;
using System.IO;
using System.Net;
using System.Text;

namespace Examples.System.Net
{
public class WebRequestGetExample

12
{
public static void Main ()
{
//Crearea unei cereri spre url specificat
WebRequest request = WebRequest.Create ("http://www.google.com");
// Dac severul necesit o verificare de validare
request.Credentials = CredentialCache.DefaultCredentials;
// Primirea rspunsuilui
HttpWebResponse response = (HttpWebResponse)request.GetResponse ();
// Vizualizarea strii rspunsuilui
Console.WriteLine (response.StatusDescription);
// Primete coninutul fiierului html
Stream dataStream = response.GetResponseStream ();
// Deschide un stream pentru acces mai rapid
StreamReader reader = new StreamReader (dataStream);
// Citirea coninutului
string responseFromServer = reader.ReadToEnd ();
// Afiarea rezultatelor
Console.WriteLine (responseFromServer);
//Eradierea strimului i a rspunsului
dataStream.Close ();
response.Close ();
}
}
}

13
4.Dispatcher

Dispecerul menine o coad de elemente de lucru prioritar pentru un anumit fir. Atunci cnd un
Dispatcher este creat pe un fir, acesta devine singurul Dispecerul care poate fi asociat cu firul, chiar dac
dispecerul este oprit.

Dac ncercai s obinei CurrentDispatcher pentru firul de curent i un Dispecer nu este asociat
cu firul, va fi creat un Dispecer. Un Dispecerul este creat atunci cnd creai un DispatcherObject. Dac
creai un Dispatcher pe un fir de fundal, asigurai-v c pentru a nchide expeditorul nainte de a ie i firul.
n cazul n care un Dispatcher este oprit, acesta nu poate fi repornit.

n WPF, un DispatcherObject poate fi accesat numai de ctre dispecerul este asociat. De exemplu,
un fir de fundal nu poate actualiza coninutul unui buton, care este asociat cu Dispecerul pe firul UI.
Pentru ca firul de fundal pentru a avea acces la proprietatea Coninutul butonului, firul de fond trebuie s
delege activitatea Dispecerului asociat cu firul UI. Acest lucru se realizeaz prin utilizarea fie Invoke sau
BeginInvoke. Invocare este sincron i asincron este BeginInvoke. Se adaug opera ia la coada
dispecerului la DispatcherPriority specificat.

n cazul n care BeginInvoke este numit pe un Dispecer care a nchis, proprietatea de stare a
DispatcherOperation returnat este setat la Abandonat. Toate metodele de pe Dispecer, cu excep ia
DisableProcessing, sunt liber filetate. Obiectele care deriv din DispatcherObject au afinitate fir.

Obiectele care deriv din solidificabil sunt libere filetate atunci cnd sunt nghe ate. Pentru mai
multe informaii, consultai Obiecte solidificabil Prezentare general.

Exemplu:
//Delegat care va indica la metoda ce se va invoca
public delegate void updater(string str);
// Metoda ce se executa de firele de execuie
public void method(object link)
{
try
{
WebRequest request = WebRequest.Create((string)link);
WebResponse response = request.GetResponse();
14
this.richTextBox.Dispatcher.BeginInvoke(new updater(update), ((string)link + " ========
Status: " + ((HttpWebResponse)response).StatusCode.ToString()));
}
catch (Exception exc)
{
this.richTextBox.Dispatcher.BeginInvoke(new updater(update), ((string)link + " ========
Status: " + exc.Message));
}
}
//Metoda ce se invok n timpul executiei unui fir pentru a seta un GUI element
public void update(string linkStatus)
{
this.richTextBox.AppendText(init+ "__ "+linkStatus);
this.richTextBox.AppendText("\n");
init++;
}

15
5.Realizarea lucrrii de laborator

Fig. 1 Rezultatul primit

Mai sus este reprezentat un textbox i un richtextbox. n textbox se introduce cheia dup care
serviciul Google caut informaie, iar richtextbox afieaz adresele resurselor care conin informaia
despre cheia cutat. Pe lng adresele care sunt afiate este i starea serverului pe care ruleaz adresa
cutare.

Dup ce se introduce o cheie n textbox se tasteaz enter pentru ca programul s cere de la google
pagina cu rezultatele serviciului de cautare Google, pe care o parseaz selectnd nodurile ce reprezint
referine la adresele serverilor cu informaia despre cheia cautat. Cererea la google pentru a primi pagina
rezultat se face cu ajutorul HtmlAgilityPack prin clasa HtmlWeb vezi Anexa B.

Html Aglity Pack automat face o cerere i primete un raspuns de la Uri specificat n contructor,
dup care rspunsul este stocat n HtmlDocument, rspunsul este sub form de Html document cu noduri
vezi capitolul HtmlAgilityPack. Apoi se trece la parsarea documentului raspuns, se selecteaz nodurile ce
reprezint referin apoi imediat sunt preluate valorile din atributele href. Aa cum valoarea n href
utilizeaz serviciul google este nevoie de cutat prile de interogare la google pentru a primi url-ului
necesar care totui se conine n valoarea hrefului.

Dup toate menionate se preiau adresele la servere i se cere strile serverilor cu ajutorul
claselor din spaiul de nume System.Net i anume clasele WebReequest i WebResponse.

16
Concluzii

Lucrarea de laborator numrul trei la programarea n reea este realizat n limbajul C# utiliznd
mediul de dezvoltare Visual Studio 2015. Sarcina laboratorului este de a lucra cu protocolul HTTP i
anume de fcut un validator de adrese de verificat dac serverele sunt valide. HTTP ofer o tehnic de
comunicare prin care paginile web se pot transmite de la un computer aflat la distan spre propriul
computer. Dac se apeleaz un link sau o adres de web cum ar fi http://www.example.com, atunci se cere
calculatorului host s afieze o pagin web (index.html sau altele). Sa accesat la serviciile google de
cautare, pentru a primi o pagin cu rspunsuri dup cutare, din pagin sunt selectate toate nodurile ce
conin adresele serverelor care urmeaz de controlat la validare. Cotrolul validrii sa produs prin
WebRequest i WebResponse prin care sa fcut cereri i sa primit rspunsuri. Rspunsurile au fost stocate
ntr-o list text care afieaz adresele si validrile. Problema listei este c un element ui creat ntr-un fir
este interzis s fie modificat n alt fir (fir de orice tip). Rezolvarea este de a folosi serviciul Dispatcherului
care permite de a invoka o metod care poate modifica elemetui UI prin intermediul unui delegat vezi
Anexa A.

17
Bibliografie

1. Hyper text transfer protocol. [Resursa electronic].-regim de acces:


https://www.w3.org/Protocols/
2. HTTP. [Resursa electronic].-regim de acces:
https://habrahabr.ru/post/215117/
3. WebRequest Class . [Resursa electronic].-regim de acces:
https://msdn.microsoft.com/ru-ru/library/system.net.webrequest(v=vs.110).aspx
4. WebResponse Class. [Resursa electronic].-regim de acces:
https://msdn.microsoft.com/ru-ru/library/system.net.webresponse(v=vs.110).aspx

5. Dispatcher. [Resursa electronic].-regim de acces:


https://msdn.microsoft.com/ro-ro/library/system.windows.threading.dispatcher(v=vs.110).aspx

6. PR programarea in retea. [Resursa electronic].-regim de acces:


http://moodle.ati.utm.md/course/view.php?id=90

18
Anexa A MainWindow
using System;
using System.Net;
using System.Threading;
using System.Windows;
using System.Windows.Input;
using WebCng;

namespace Lab_3_PR
{
public partial class MainWindow : Window
{
private static string urlToGoogleSearch = "https://www.google.com/search?num=100&q=";
private string checkLinks = "/url?q=";
public delegate void updater(string str);
int init = 0;
public MainWindow()
{
InitializeComponent();
}
private void textBox_KeyDown(object sender, KeyEventArgs e)
{
init = 0;
if (e.Key == Key.Enter)
{
richTextBox.Document.Blocks.Clear();
WebCrawling wc = new WebCrawling(urlToGoogleSearch, checkLinks, textBox.Text);
foreach (string link in wc.Links)
{
Thread th = new Thread(new ParameterizedThreadStart(method));
th.Start(link);
}
}
}
public void method(object link)
{
try
{
WebRequest request = WebRequest.Create((string)link);
WebResponse response = request.GetResponse();
this.richTextBox.Dispatcher.BeginInvoke(new updater(update), ((string)link + " ========
Status: " + ((HttpWebResponse)response).StatusCode.ToString()));

19
}
catch (Exception exc)
{
this.richTextBox.Dispatcher.BeginInvoke(new updater(update), ((string)link + " ========
Status: " + exc.Message));
}
}
public void update(string linkStatus)
{
this.richTextBox.AppendText(init+ "__ "+linkStatus);
this.richTextBox.AppendText("\n");
init++;
}
}
}

20
Anexa B WebCrawling
using HtmlAgilityPack;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WebCng
{
public class WebCrawling
{
private static string urlToGoogleSearch;
private List<string> links = new List<string>();
private string checkLinks;
public string URL { get { return urlToGoogleSearch; } set { urlToGoogleSearch = value; } }
public string SubstractSufix { get { return checkLinks; } set { checkLinks=value; } }
public List<string> Links { get { return links; } set { links = value; } }
private HtmlWeb htmlFromWeb = new HtmlWeb();
HtmlDocument htmlFromUrl;
List<HtmlNode> htmlNodeWhatContainLinks;
public WebCrawling(string urlToGoogleSearch,string substractSufix, string searchKey)
{
this.URL = urlToGoogleSearch;
this.SubstractSufix = substractSufix;
htmlFromUrl = htmlFromWeb.Load(urlToGoogleSearch + searchKey);
htmlNodeWhatContainLinks =
htmlFromUrl.DocumentNode.SelectNodes("//h3[@class='r']//a").Where(x =>
x.Attributes["href"].Value.Contains(checkLinks)).ToList();
set(htmlNodeWhatContainLinks);
}
private void set(List<HtmlNode> htmlNodeWhatContainLinks)
{
List<string> linksTemp = new List<string>();
foreach (HtmlNode LinksNode in htmlNodeWhatContainLinks)
{
linksTemp.Add(cut(LinksNode.Attributes["href"].Value, checkLinks.Length));
}
Links = linksTemp;
}
private string cut(string strtocut, int checkLinksLength)
{

21
return strtocut.Substring(checkLinksLength, strtocut.IndexOf("&amp;sa=U") - 7);
}
}
}

22