/** @file
Header file for HttpLib.

  Copyright (c) 2016 - 2017, Intel Corporation. All rights reserved.<BR>
  (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>

  SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#pragma once

#include <Uefi.h>
#include <Library/NetLib.h>
#include <Library/HttpLib.h>
#include <Library/BaseLib.h>
#include <Library/DebugLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <IndustryStandard/Http11.h>
#include <Protocol/HttpUtilities.h>

#define BIT(x)  (1 << x)

#define HTTP_VERSION_CRLF_STR  " HTTP/1.1\r\n"
#define EMPTY_SPACE            " "

#define NET_IS_HEX_CHAR(Ch)   \
  ((('0' <= (Ch)) && ((Ch) <= '9')) ||  \
   (('A' <= (Ch)) && ((Ch) <= 'F')) ||  \
   (('a' <= (Ch)) && ((Ch) <= 'f')))

//
// Field index of the HTTP URL parse result.
//
#define   HTTP_URI_FIELD_SCHEME     0
#define   HTTP_URI_FIELD_AUTHORITY  1
#define   HTTP_URI_FIELD_PATH       2
#define   HTTP_URI_FIELD_QUERY      3
#define   HTTP_URI_FIELD_FRAGMENT   4
#define   HTTP_URI_FIELD_USERINFO   5
#define   HTTP_URI_FIELD_HOST       6
#define   HTTP_URI_FIELD_PORT       7
#define   HTTP_URI_FIELD_MAX        8

#define   HTTP_URI_PORT_MAX_NUM  65535

//
// Structure to store the parse result of a HTTP URL.
//
typedef struct {
  UINT32    Offset;
  UINT32    Length;
} HTTP_URL_FILED_DATA;

typedef struct {
  UINT16                 FieldBitMap;
  HTTP_URL_FILED_DATA    FieldData[HTTP_URI_FIELD_MAX];
} HTTP_URL_PARSER;

typedef enum {
  UrlParserUrlStart,
  UrlParserScheme,
  UrlParserSchemeColon,            // ":"
  UrlParserSchemeColonSlash,       // ":/"
  UrlParserSchemeColonSlashSlash,  // "://"
  UrlParserAuthority,
  UrlParserAtInAuthority,
  UrlParserPath,
  UrlParserQueryStart,    // "?"
  UrlParserQuery,
  UrlParserFragmentStart, // "#"
  UrlParserFragment,
  UrlParserUserInfo,
  UrlParserHostStart,     // "@"
  UrlParserHost,
  UrlParserHostIpv6,      // "["(Ipv6 address) "]"
  UrlParserPortStart,     // ":"
  UrlParserPort,
  UrlParserStateMax
} HTTP_URL_PARSE_STATE;
