Rede

Este guia mostra como trabalhar com a funcionalidade relacionada com a rede, como proxy, eventos de rede, autenticação, TLS, autenticação de certificado de cliente, etc.

A funcionalidade relacionada com a rede pode ser acedida através da instância INetwork que pode ser obtida utilizando a propriedade Profile.Network . Utilizando a propriedade IEngine.Network, você obterá a instância Network associada ao Profile predefinido.

Aceitar o idioma

O DotNetBrowser permite configurar a Accept-Language utilizando a propriedade INetwork.AcceptLanguage . O valor do parâmetro de entrada representa o valor do cabeçalho HTTP Accept-Language .

Por exemplo, o valor “fr, en-gb;q=0.8, en;q=0.7” significaria: “Prefiro o francês, mas aceito o inglês britânico e outros tipos de inglês”:

network.AcceptLanguage = "fr, en-gb;q=0.8, en;q=0.7";
network.AcceptLanguage = "fr, en-gb;q=0.8, en;q=0.7"

ServerWhiteList

Desde o DotNetBrowser 1.9, é possível configurar a lista branca de autorização do servidor HTTP que representa uma string com uma lista de URLs separada por vírgula/semicolon. Esta funcionalidade permite-lhe utilizar a autenticação integrada do Windows (IWA) e a autenticação Kerberos para os domínios listados.

Com o IWA, o Chromium pode autenticar o usuário num servidor Web ou proxy sem sequer pedir ao usuário um nome de usuário ou uma senha. Para tal, ele utiliza credenciais em cache que são estabelecidas quando o usuário inicia uma sessão na máquina em que o navegador está sendo executado. O IWA é suportado apenas para os desafios Negotiate e NTLM.

O ServerWhiteList especifica quais os servidores que devem ser incluídos na lista branca para autenticação integrada. Por padrão, a autenticação integrada só é ativada quando existe um desafio de autenticação de um proxy ou de um servidor que esteja nesta lista permitida. Se esta lista não estiver definida, o engine Chromium tenta detectar se um servidor está na Intranet e responde aos pedidos IWA apenas para os servidores da Intranet. Se um servidor for detectado como Internet, os pedidos IWA deste servidor são ignorados.

O DelegateWhiteList especifica os servidores aos quais o Chromium pode delegar. Se esta lista não estiver definida, o Chromium não delega credenciais de usuário mesmo que um servidor seja detectado como Intranet.

Se você especificar vários nomes de servidores na lista, separe-os por vírgulas. São permitidos caracteres coringa (*).

Desde o Chromium 81, a autenticação integrada está desativada no modo de navegação anônima. Neste caso, o handler AuthenticateHandler será invocado para fornecer o nome de usuário e a senha. Desde o DotNetBrowser 2.23.3, é possível substituir esse comportamento. Para este efeito, é necessário adicionar o interrutor do Chromium --ambient-authentication-in-private-modes-enabled para substituir a política AmbientAuthenticationInPrivateModesEnabled.

Lista branca de autorização do servidor HTTP

Veja o exemplo de código abaixo:

network.HttpAuthPreferences.ServerWhiteList = "*google.com,*example.com,*baz";
network.HttpAuthPreferences.ServerWhiteList = "*google.com,*example.com,*baz"

Lista branca para delegar da rede HTTP

Veja o exemplo de código abaixo:

network.HttpAuthPreferences.DelegateWhiteList = "*google.com,*example.com,*baz";
network.HttpAuthPreferences.DelegateWhiteList = "*google.com,*example.com,*baz"

TLS

Verificação do certificado

Por padrão, o Chromium verifica todos os certificados SSL obtidos de um servidor Web durante o carregamento da página Web. O DotNetBrowser permite modificar este comportamento por padrão e assumir o controle do processo de verificação.

Para tratar da verificação de certificados, utilize o handler VerifyCertificateHandler. Antes de ser invocado, o Chromium verifica o certificado SSL e fornece os resultados da verificação ao handler. O handler recebe o próprio certificado SSL juntamente com os resultados da verificação. Você pode verificar o certificado SSL fornecido e notificar o engine se o aceita ou não. Veja o exemplo de código abaixo:

engine.Profiles.Default.Network.VerifyCertificateHandler
    = new Handler<VerifyCertificateParameters, VerifyCertificateResponse>(p =>
    {
        // Certificado SSL a verificar.
        Certificate certificate = p.Certificate;
        // Os resultados da verificação efetuada pelo verificador predefinido.
        IEnumerable<CertificateVerificationStatus> certificateStatuses =
            p.VerifyStatuses;
        // Devem ser utilizados os resultados da verificação por padrão.
        return VerifyCertificateResponse.Default();
    });
engine.Profiles.Default.Network.VerifyCertificateHandler = 
    New Handler(Of VerifyCertificateParameters, VerifyCertificateResponse)(Function(p)
        ' Certificado SSL para verificar.
        Dim certificate As Certificate = p.Certificate
        ' Os resultados da verificação efetuada pelo verificador predefinido.
        Dim certificateStatuses As IEnumerable(Of CertificateVerificationStatus) = 
            p.VerifyStatuses
        ' Devem ser utilizados os resultados da verificação por padrão.
        Return VerifyCertificateResponse.Default()
    End Function)

Autenticação do certificado do cliente

O DotNetBrowser suporta autenticação usando certificados de cliente HTTPS. Consulte o guia Autenticação para obter detalhes.

Eventos de rede e handlers

A API INetwork define um conjunto de eventos e handlers que seguem o ciclo de vida de um pedido Web. Você pode utilizar estes eventos para observar e analisar o tráfego. Estes handlers permitem-lhe interceptar, bloquear ou modificar pedidos.

O ciclo de vida dos eventos de pedidos bem sucedidos é o seguinte: Fluxo de eventos de rede

Antes do pedido de URL

O handler SendUrlRequestHandler é invocado quando um pedido HTTP está prestes a ocorrer. Você pode utilizar este handler para substituir o URL e redirecionar o pedido para outra localização. Por exemplo:

network.SendUrlRequestHandler =
    new Handler<SendUrlRequestParameters, SendUrlRequestResponse>(p =>
    {
        return SendUrlRequestResponse.Override("<new-url>");
    });
network.SendUrlRequestHandler = 
    New Handler(Of SendUrlRequestParameters, SendUrlRequestResponse)(Function(p)
        Return SendUrlRequestResponse.Override("<new-url>")
    End Function)

Antes de enviar dados de carregamento

O handler SendUploadDataHandler é invocado antes de os dados de carregamento serem enviados para um servidor Web. Aqui você pode substituir os dados de carregamento. Por exemplo:

network.SendUploadDataHandler =
    new Handler<SendUploadDataParameters, SendUploadDataResponse>(p =>
    {
        return SendUploadDataResponse.Override("<text-data>");
    });
network.SendUploadDataHandler = 
    New Handler(Of SendUploadDataParameters, SendUploadDataResponse)(Function(p)
        Return SendUploadDataResponse.Override("<text-data>")
    End Function)

Este handler não será chamado se o pedido não tiver os dados de carregamento.

São suportados os seguintes tipos de dados de carregamento:

  • byte[] representa uma sequência de bytes;
  • string - os dados do tipo de conteúdo text/plain ;
  • FormData - os dados do tipo de conteúdo application/x-www-form-urlencoded ;
  • MultipartFormData - os dados do tipo de conteúdo multipart/form-data .

Antes de iniciar a transação

O StartTransactionHandler handler é invocado antes do início da transação de rede. Você pode adicionar, modificar e eliminar os cabeçalhos dos pedidos HTTP antes de serem enviados para um servidor Web. Veja o exemplo de código abaixo:

network.StartTransactionHandler
    = new Handler<StartTransactionParameters, StartTransactionResponse>(p =>
    {
        IEnumerable<IHttpHeader> headers = p.Headers;
        List<HttpHeader> newHttpHeaders = headers.Cast<HttpHeader>().ToList();
        newHttpHeaders.Add(new HttpHeader("<header-name>", "<header-value>"));
        return StartTransactionResponse.OverrideHeaders(newHttpHeaders);
    });
network.StartTransactionHandler = 
    New Handler(Of StartTransactionParameters, StartTransactionResponse)(Function(p)
        Dim headers As IEnumerable(Of IHttpHeader) = p.Headers
        Dim newHttpHeaders As List(Of HttpHeader) = 
            headers.Cast(Of HttpHeader)().ToList()
        newHttpHeaders.Add(New HttpHeader("<header-name>", "<header-value>"))
        Return StartTransactionResponse.OverrideHeaders(newHttpHeaders)
    End Function)

Os seguintes cabeçalhos não são atualmente fornecidos ao handler:

- Authorization
- Cache-Control
- Connection
- Content-Length
- Host
- If-Modified-Since
- If-None-Match
- If-Range
- Partial-Data
- Pragma
- Proxy-Authorization
- Proxy-Connection
- Transfer-Encoding
Note que não garantimos que esta lista esteja completa ou estável.

Receber cabeçalhos

O handler ReceiveHeadersHandler é invocado para pedidos HTTP quando os cabeçalhos são recebidos. Aqui você pode adicionar, modificar ou remover os cabeçalhos HTTP recebidos através da rede. Veja o exemplo de código abaixo:

network.ReceiveHeadersHandler =
    new Handler<ReceiveHeadersParameters, ReceiveHeadersResponse>(p =>
    {
        IEnumerable<IHttpHeader> headers = p.Headers;
        List<HttpHeader> newHttpHeaders = headers.Cast<HttpHeader>().ToList();
        newHttpHeaders.Add(new HttpHeader("<header-name>", "<header-value>"));
        return ReceiveHeadersResponse.OverrideHeaders(newHttpHeaders);
    });
network.ReceiveHeadersHandler = 
    New Handler(Of ReceiveHeadersParameters, ReceiveHeadersResponse)(Function(p)
        Dim headers As IEnumerable(Of IHttpHeader) = p.Headers
        Dim newHttpHeaders As List(Of HttpHeader) = 
            headers.Cast(Of HttpHeader)().ToList()
        newHttpHeaders.Add(New HttpHeader("<header-name>", "<header-value>"))
        Return ReceiveHeadersResponse.OverrideHeaders(newHttpHeaders)
    End Function)

Redirecionar código de resposta recebido

O evento RedirectResponseCodeReceived ocorre quando é recebido um código de resposta de redirecionamento 3xx para o pedido. Você pode obter os detalhes sobre o redirecionamento, como o novo URL e o código de resposta. Veja o exemplo de código abaixo:

network.RedirectResponseCodeReceived += (s, e) => 
{
    string newUrl = e.NewUrl;
    int responseCode = e.ResponseCode;
};
AddHandler network.RedirectResponseCodeReceived, Sub(s, e)
    Dim newUrl As String = e.NewUrl
    Dim responseCode As Integer = e.ResponseCode
End Sub

Resposta iniciada

O evento ResponseStarted ocorre quando o primeiro byte do corpo da resposta URL é recebido. Para pedidos HTTP, significa que a linha de estado e os cabeçalhos de resposta estão disponíveis. Neste evento, é possível acessar o pedido correspondente e o código de resposta. Veja o exemplo de código abaixo:

network.ResponseStarted += (s, e) => 
{
    UrlRequest urlRequest = e.UrlRequest;
    int responseCode = e.ResponseCode;
};
AddHandler network.ResponseStarted, Sub(s, e)
    Dim urlRequest As UrlRequest = e.UrlRequest
    Dim responseCode As Integer = e.ResponseCode
End Sub

Pedido concluído

O evento RequestCompleted ocorre quando o pedido de URL foi concluído com êxito ou falhou. É possível verificar se o pedido foi iniciado, obter os detalhes do estado do pedido e acessar o código de resposta. Veja o exemplo de código abaixo:

network.RequestCompleted += (s, e) => 
{
    UrlRequest urlRequest = e.UrlRequest;
    // Os detalhes do estado do pedido de URL.
    RequestStatus urlRequestStatus = e.Status;
    // O código de resposta HTTP.
    int responseCode = e.ResponseCode;
};
AddHandler network.RequestCompleted, Sub(s, e)
    Dim urlRequest As UrlRequest = e.UrlRequest
    ' Os detalhes do estado do pedido de URL.
    Dim urlRequestStatus As RequestStatus = e.Status
    ' O código de resposta HTTP.
    Dim responseCode As Integer = e.ResponseCode
End Sub

Pedido destruído

O evento RequestDestroyed ocorre quando o pedido foi destruído e já não pode ser utilizado. Para acessar os detalhes do pedido destruído, utilize o seguinte código:

network.RequestDestroyed += (s, e) => 
{
    UrlRequest urlRequest = e.UrlRequest;
};
AddHandler network.RequestDestroyed, Sub(s, e)
    Dim urlRequest As UrlRequest = e.UrlRequest
End Sub

Bytes de resposta recebidos

O evento ResponseBytesReceived ocorre quando uma parte do corpo da resposta HTTP é recebida através da rede. Ele permite acessar os bytes do corpo da resposta HTTP:

network.ResponseBytesReceived += (s, e) => 
{
    byte[] data = e.Data;
};
AddHandler network.ResponseBytesReceived, Sub(s, e)
    Dim data() As Byte = e.Data
End Sub

Erro de script PAC

O evento PacScriptErrorOccurred ocorre quando há um erro no script PAC. Ele permite obter os pormenores do erro:

network.PacScriptErrorOccurred += (s, e) =>
{
    string errorText = e.ErrorText;
    uint lineNumber = e.LineNumber;
};
AddHandler network.PacScriptErrorOccurred, Sub(s, e)
    Dim errorText As String = e.ErrorText
    Dim lineNumber As UInteger = e.LineNumber
End Sub

Estado da conexão

O Chromium monitoriza internamente o estado da ligação à Internet. Quando a ligação à Internet é interrompida e depois restabelecida, o Chromium detecta este fato e recarrega programaticamente a página Web atualmente carregada. Você pode obter notificações quando o estado da ligação de rede é alterado utilizando esta API:

profile.Network.ConnectionTypeChanged += (s, e) =>
{
    ConnectionType connectionType = e.ConnectionType;
};
AddHandler profile.Network.ConnectionTypeChanged, Sub(s, e)
    Dim connectionType As ConnectionType = e.ConnectionType
End Sub
Go Top