.. only:: comment

    © Crown-owned copyright 2025, Defence Science and Technology Laboratory UK

.. _WebBrowser:

WebBrowser
##########

The ``WebBrowser`` provides a client interface for connecting to the :ref:`WebServer`.

Key features
============

- Connects to the :ref:`WebServer` via the ``SoftwareManager``.
- Simulates HTTP requests and HTTP packet transfer across a network
- Allows the emulation of HTTP requests between client and server:
    - Automatically uses ``DNSClient`` to resolve domain names
    - GET: performs an HTTP GET request from client to server
- Leverages the Service base class for install/uninstall, status tracking, etc.

Usage
=====

- Install on a Node via the ``SoftwareManager`` to start the ``WebBrowser``.
- Service runs on HTTP port 80 by default.
- Execute sending an HTTP GET request with ``get_webpage``

Implementation
==============

- Leverages ``SoftwareManager`` for sending payloads over the network.
- Provides easy interface for making HTTP requests between an HTTP client and server.
- Extends base Service class.


Examples
========

Python
""""""

The ``WebBrowser`` utilises :ref:`DNSClient` and :ref:`DNSServer` to resolve a URL.

The :ref:`DNSClient` must be configured to use the :ref:`DNSServer`. The :ref:`DNSServer` should be configured to have the ``WebBrowser`` ``target_url`` within its ``domain_mapping``.

.. code-block:: python

    from primaite.simulator.network.hardware.nodes.host.computer import Computer
    from primaite.simulator.system.applications.web_browser import WebBrowser

    # Create Computer
    computer = Computer(config={
        "hostname":"computer",
        "ip_address":"192.168.1.2",
        "subnet_mask":"255.255.255.0",
        "default_gateway":"192.168.1.1",
        "start_up_duration":0,
        }
    )
    computer.power_on()

    # Install WebBrowser on computer
    computer.software_manager.install(WebBrowser)
    web_browser: WebBrowser = computer.software_manager.software.get("web-browser")
    web_browser.run()

    # configure the WebBrowser
    web_browser.target_url = "example.com"

    # once DNS server is configured with the correct domain mapping
    # this should work
    web_browser.get_webpage()

Via Configuration
"""""""""""""""""

.. code-block:: yaml

    simulation:
        network:
            nodes:
            - hostname: example_computer
            type: computer
            ...
            applications:
            - type: web-browser
            options:
                target_url: http://example.com/

Configuration
=============


``target_url``
""""""""""""""

The URL that the ``WebBrowser`` will request when ``get_webpage`` is called without parameters.

The URL can be in any format so long as the domain is within it e.g.

The domain ``example.com`` can be matched by

- http://example.com/
- example.com


``Common Attributes``
^^^^^^^^^^^^^^^^^^^^^

See :ref:`Common Configuration`
