async function errorHandling(context) {
    try {
      return await context.next();
    } catch (err) {
      return new Response(`${err.message}\n${err.stack}`, { status: 500 });
    }
  }

  function basicAuthentication(request) {
    const Authorization = request.headers.get('Authorization');
  
    const [scheme, encoded] = Authorization.split(' ');
  
    // The Authorization header must start with Basic, followed by a space.
    if (!encoded || scheme !== 'Basic') {
      throw new BadRequestException('Malformed authorization header.');
    }
  
    // Decodes the base64 value and performs unicode normalization.
    // @see https://datatracker.ietf.org/doc/html/rfc7613#section-3.3.2 (and #section-4.2.2)
    // @see https://dev.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String/normalize
    const buffer = Uint8Array.from(atob(encoded), character => character.charCodeAt(0));
    const decoded = new TextDecoder().decode(buffer).normalize();
  
    // The username & password are split by the first colon.
    //=> example: "username:password"
    const index = decoded.indexOf(':');
  
    // The user & password are split by the first colon and MUST NOT contain control characters.
    // @see https://tools.ietf.org/html/rfc5234#appendix-B.1 (=> "CTL = %x00-1F / %x7F")
    if (index === -1 || /[\0-\x1F\x7F]/.test(decoded)) {
      throw new BadRequestException('Invalid authorization value.');
    }
  
    return {
      user: decoded.substring(0, index),
      pass: decoded.substring(index + 1),
    };
  }
  
  function UnauthorizedException(reason) {
    return new Response(reason, {
        status: 401,
        statusText: 'Unauthorized',
        headers: {
          'Content-Type': 'text/plain;charset=UTF-8',
          // Disables caching by default.
          'Cache-Control': 'no-store',
          // Returns the "Content-Length" header for HTTP HEAD requests.
          'Content-Length': reason.length,
        },
      });
  }
  
  function BadRequestException(reason) {
    return new Response(reason, {
        status: 400,
        statusText: 'Bad Request',
        headers: {
          'Content-Type': 'text/plain;charset=UTF-8',
          // Disables caching by default.
          'Cache-Control': 'no-store',
          // Returns the "Content-Length" header for HTTP HEAD requests.
          'Content-Length': reason.length,
        },
      });
  }
  
  
  function authentication(context) {
    //context.env.BASIC_USER="admin"
    //context.env.BASIC_PASS="admin"
    //check if the env variables Disable_Dashboard are set
    if (typeof context.env.img_url == "undefined" || context.env.img_url == null || context.env.img_url == "") {
        return new Response('Dashboard is disabled. Please bind a KV namespace to use this feature.', { status: 200 });
    }

    if(typeof context.env.BASIC_USER == "undefined" || context.env.BASIC_USER == null || context.env.BASIC_USER == ""){
        return context.next();
    }else{
        if (context.request.headers.has('Authorization')) {
            // Throws exception when authorization fails.
            const { user, pass } = basicAuthentication(context.request);                         
                if (context.env.BASIC_USER !== user || context.env.BASIC_PASS !== pass) {
                    return UnauthorizedException('Invalid credentials.');
                }else{
                    return context.next();
                }
            
        } else {
            return new Response('You need to login.', {
                status: 401,
                headers: {
                // Prompts the user for credentials.
                'WWW-Authenticate': 'Basic realm="my scope", charset="UTF-8"',
                // 'WWW-Authenticate': 'None',
                },
            });
        }
    }  
    
  }
  
  export const onRequest = [errorHandling, authentication];