Define tag cannot set a null value' error

博客指出定义标签值value不能为空,常被忽略且较难发现的错误原因是数据库某些字段为空,重点围绕解决该数据库字段为空引发的问题。
解决:定义标签值value不能为空,常忽略一点且为较难发现的是数据库的某些字段为空而造成错误
/* * This file is part of the openHiTLS project. * * openHiTLS is licensed under the Mulan PSL v2. * You can use this software according to the terms and conditions of the Mulan PSL v2. * You may obtain a copy of Mulan PSL v2 at: * * http://license.coscl.org.cn/MulanPSL2 * * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. * See the Mulan PSL v2 for more details. */ /** * @defgroup crypt_errno * @ingroup crypt * @brief error number module of crypto module */ #ifndef CRYPT_ERRNO_H #define CRYPT_ERRNO_H #ifdef __cplusplus extern "C" { #endif /** * @ingroup crypt_errno * @brief Return success */ #define CRYPT_SUCCESS 0 /** * @ingroup crypt_errno * * CRYPTO module return value. */ enum CRYPT_ERROR { CRYPT_NULL_INPUT = 0x01010001, /**< Null pointer input error, bufferLen is 0. */ CRYPT_SECUREC_FAIL, /**< Security function returns an error. */ CRYPT_MEM_ALLOC_FAIL, /**< Failed to apply for memory. */ CRYPT_NO_REGIST_RAND, /**< The global random number is not registered.*/ CRYPT_ERR_ALGID, /**< Incorrect algorithm ID. */ CRYPT_INVALID_ARG, /**< Invalid input parameter. */ CRYPT_NOT_SUPPORT, /**< unsupported operation. */ CRYPT_INCONSISTENT_OPERATION, /**< Inconsistent operation. */ CRYPT_INVALID_KEY, /**< invalid key. */ CRYPT_PAIRWISE_CHECK_FAIL, /**< key-pair check failed. */ CRYPT_BN_BUFF_LEN_NOT_ENOUGH = 0x01020001, /**< Insufficient buffer length. */ CRYPT_BN_SPACE_NOT_ENOUGH, /**< Insufficient big number space. */ CRYPT_BN_BITS_TOO_MAX, /**< The maximum bit limit is exceeded of the big number. */ CRYPT_BN_RAND_GEN_FAIL, /**< Failed to generate the random number. */ CRYPT_BN_OPTIMIZER_STACK_FULL, /**< Optimizer stack is full. */ CRYPT_BN_NO_NEGATIVE_ZERO, /**< The big number is set to a positive number only. */ CRYPT_BN_ERR_RAND_ZERO, /**< Generates a random number smaller than 0. */ CRYPT_BN_ERR_RAND_NEGATIVE, /**< Generate a negative random number. */ CRYPT_BN_ERR_RAND_TOP_BOTTOM, /**< The top or bottom is invalid during random number generation. */ CRYPT_BN_ERR_RAND_BITS_NOT_ENOUGH, /**< The bit is too small during random number generation. */ CRYPT_BN_OPTIMIZER_GET_FAIL, /**< Failed to obtain the space from the optimizer. */ CRYPT_BN_ERR_DIVISOR_ZERO, /**< The divisor cannot be 0. */ CRYPT_BN_ERR_EXP_NO_NEGATIVE, /**< The value of exponent cannot be negative. */ CRYPT_BN_MONT_BASE_TOO_MAX, /**< Montgomery module exponentiation base is too large. */ CRYPT_BN_NOR_GEN_PRIME, /**< Prime Number Generation Failure. */ CRYPT_BN_NOR_CHECK_PRIME, /**< prime number check failed. */ CRYPT_BN_ERR_GCD_NO_ZERO, /**< The maximum common divisor cannot contain 0. */ CRYPT_BN_ERR_NO_INVERSE, /**< Cannot obtain the inverse module. */ CRYPT_BN_ERR_SQRT_PARA, /**< The parameter is incorrect when modulus square root. */ CRYPT_BN_ERR_LEGENDE_DATA, /**< Failed to find a specific number for z to p's Legendre sign (z|p) equal to -1 when calculating the square root. */ CRYPT_BN_ERR_NO_SQUARE_ROOT, /**< The square root cannot be found. */ CRYPT_BN_ERR_MASKCOPY_LEN, /**< Data lengths are inconsistent when data is copied with masks. */ CRYPT_BN_ERR_QUICK_MODDATA, /**< Uses the BN_ModNistEccMul and BN_ModNistEccSqr interfaces, the module data is not supported. */ CRYPT_BN_FLAG_INVALID, /**< Invalid big number flag. */ CRYPT_BN_CONVERT_INPUT_INVALID, /**< Invalid input parameter of big number strings. */ CRYPT_BN_NOT_SUPPORT_EXTENSION, /**< The big number does not support dynamic extension. */ CRYPT_BN_INPUT_INVALID, /**< Invalid external big number input. */ CRYPT_BN_BITS_INVALID, /**< The bits of the big number exceeds the limit. */ CRYPT_BN_ERR_SWAP_LEN, /**< Data lengths are inconsistent when data is swapped with masks. */ CRYPT_RSA_BUFF_LEN_NOT_ENOUGH = 0x01030001, /**< The buffer length is insufficient. */ CRYPT_RSA_NO_KEY_INFO, /**< Lacks valid key information. */ CRYPT_RSA_ERR_KEY_BITS, /**< Incorrect key length. */ CRYPT_RSA_ERR_E_VALUE, /**< The value of parameter e is incorrect. */ CRYPT_RSA_NOR_KEYGEN_FAIL, /**< Key generation failure, it's normal error. */ CRYPT_RSA_NOR_VERIFY_FAIL, /**< Failed to verify the signature. it's normal error. */ CRYPT_RSA_ERR_ENC_BITS, /**< Incorrect length of the encrypted plaintext of the public key. */ CRYPT_RSA_ERR_DEC_BITS, /**< Incorrect length of the decrypted ciphertext of the private key. */ CRYPT_RSA_ERR_PSS_SALT_LEN, /**< Incorrect salt length of the PSS operation. */ CRYPT_RSA_ERR_PSS_SALT_DATA, /**< PSS operation salt data error, failed to compare the salt extracted during signature verification with the user's input. */ CRYPT_RSA_ERR_PKCSV15_SALT_LEN, /**< Incorrect salt length of the PKCSV15 operation. */ CRYPT_RSA_ERR_PKCSV15_SALT_DATA, /**< PKCSV15 salt data error. */ CRYPT_RSA_ERR_INPUT_VALUE, /**< Some special values, which are used as input errors. */ CRYPT_RSA_ERR_MD_ALGID, /**< The hash ID of the input parameter is incorrect when the pkcs1.5 padding mode is set. */ CRYPT_RSA_PAD_NO_SET_ERROR, /**< Padding information is not set when using RSA key for signature verification. */ CRYPT_RSA_CTRL_NOT_SUPPORT_ERROR, /**< The Ctrl type is not supported When RSA is used for Ctrl. */ CRYPT_RSA_SET_SALT_NOT_PSS_ERROR, /**< When the padding type of the key is not pss, and set the salt information, return failure. */ CRYPT_RSA_SET_EMS_PKCSV15_LEN_ERROR,/**< Sets the PKCSV15 padding information, the length of the input data is incorrect and return failure. */ CRYPT_RSA_SET_EMS_PSS_LEN_ERROR, /**< Sets the PSS padding information, the length of the input data is incorrect, and return failure. */ CRYPT_RSA_SET_RSAES_OAEP_LEN_ERROR, /**< Sets the OAEP padding information, the length of the input data is incorrect and return failure. */ CRYPT_RSA_SET_FLAG_LEN_ERROR, /**< The length of the input data is incorrect and return failure When sets the flag. */ CRYPT_RSA_FLAG_NOT_SUPPORT_ERROR, /**< Unsupported flag. */ CRYPT_RSA_ERR_SALT_LEN, /**< Salt length error. */ CRYPT_RSA_ERR_ALGID, /**< The hash ID of the input parameter is incorrect or conflict occurs when sets the signature, signature verification, and padding parameters. */ CRYPT_RSA_ERR_GEN_SALT, /**< An error is returned when salt information fails to be generated during PSS signature. */ CRYPT_RSA_ERR_ENC_INPUT_NOT_ENOUGH, /**< The plaintext length is too short for RSA NO PAD encryption. */ CRYPT_RSA_ERR_DATA_LEN, /**< Incorrect encryption length. */ CRYPT_RSA_ERR_PAD_NUM, /**< Incorrect padding length. */ CRYPT_RSA_PUBKEY_NOT_EQUAL, /**< RSA public keys are not equal. */ CRYPT_RSA_KEYPAIRWISE_CONSISTENCY_FAILURE, /**< RSA pair-wise consistency failure. */ CRYPT_RSA_ERR_BLIND_TYPE, /**< Invalid RSA blinding type. Only RSA-BSSA is currently supported. */ CRYPT_RSA_ERR_NO_BLIND_INFO, /**< RSA blinding information is missing. The blind/unblind operation requires previous blinding parameters. */ CRYPT_RSA_ERR_NO_PUBKEY_INFO, /**< The rsa pub key is missing. */ CRYPT_RSA_PADDING_NOT_SUPPORTED, /**< The specified RSA padding mode is not supported in blinding. */ CRYPT_RSA_ERR_BSSA_PARAM, /**< The param of bssa is not invalid. */ CRYPT_RSA_GET_SALT_LEN_ERROR, /**< The input length of getting salt-len is incorrect. */ CRYPT_RSA_GET_SALT_NOT_PSS_ERROR, /**< When the padding type of the key is not pss, and get the salt len. */ CRYPT_RSA_ERR_PSS_PARAMS, /**< The parameter is error when the padding type of the key is pss. */ CRYPT_RSA_ERR_NO_PRVKEY_INFO, /**< The rsa prv key is missing. */ CRYPT_RSA_ERR_INVALID_PRVKEY, /**< The private key is invalid. */ CRYPT_EAL_BUFF_LEN_NOT_ENOUGH = 0x01040001, /**< Insufficient buffer length. */ CRYPT_EAL_BUFF_LEN_TOO_LONG, /**< Insufficient buffer length. */ CRYPT_EAL_ERR_ALGID, /**< Incorrect algorithm ID. */ CRYPT_EAL_ALG_NOT_SUPPORT, /**< Algorithm not supported, algorithm behavior not supported. */ CRYPT_EAL_ERR_NEW_PARA_FAIL, /**< Failed to generate parameters. */ CRYPT_EAL_ERR_RAND_WORKING, /**< DRBG is in the working state. */ CRYPT_EAL_ERR_RAND_NO_WORKING, /**< DRBG is not working. */ CRYPT_EAL_ERR_METH_NULL_MEMBER, /**< The method variable member is NULL. */ CRYPT_EAL_ERR_GLOBAL_DRBG_NULL, /**< The global DRBG is null. */ CRYPT_EAL_ERR_DRBG_REPEAT_INIT, /**< DRBG is initialized repeatedly. */ CRYPT_EAL_ERR_DRBG_INIT_FAIL, /**< DRBG initialization failure. */ CRYPT_EAL_ERR_STATE, /**< The usage process is incorrect. For example, run the update command without running the init command. For details, see related algorithms. */ CRYPT_EAL_CIPHER_DATA_ERROR, /**< Data error occurs when unpadding the decrypted data. For X923, the last bit is the length of the original data, and the rest data is 0, if this requirement is not met, an error is reported. For pkcs, all padding data is (the length of the padding data - the length of the original data), if this requirement is not met,an error will be reported. For ISO7816, the first bit of padding data is 0x80, and the other bits are 0, if this requirement is not met, an error will be reported. */ CRYPT_EAL_PADDING_NOT_SUPPORT, /**< Unsupported padding. */ CRYPT_EAL_CIPHER_CTRL_ERROR, /**< CRYPT_EAL_CipherCtrl interface unsupported CTRL type. */ CRYPT_EAL_CIPHER_FINAL_WITH_AEAD_ERROR, /**< An error occurs when the final operation is performed on the AEAD algorithm. */ CRYPT_EAL_PKEY_CTRL_ERROR, /**< When the CRYPT_EAL_PkeyCtrl interface performs CTRL, the function is not supported or the input length is incorrect. */ CRYPT_EAL_MAC_CTRL_TYPE_ERROR, /**< When the CRYPT_EAL_PkeyCtrl interface performs CTRL, the function is not supported or the input length is incorrect. */ CRYPT_EAL_PKEY_DUP_ERROR, /**< Pkey context duplicate failure. */ CRYPT_EAL_PKEY_CMP_DIFF_KEY_TYPE, /**< Pkey comparison failure: different algorithm types. */ CRYPT_EAL_ERR_PART_OVERLAP, /**< Some memory overlap. */ CRYPT_EAL_INTO_TYPE_NOT_SUPPORT, /**< The info type is not supported. */ CRYPT_EAL_ALG_ASM_NOT_SUPPORT, /**< Algorithm assembly is not supported. */ CRYPT_EAL_CIPHER_ERR_NEWCTX, CRYPT_EAL_PKEY_CHECK_ERROR, /**< Pkey check failure. */ CRYPT_EAL_MD_METH_NULL, CRYPT_SHA2_INPUT_OVERFLOW = 0x01050001, /**< The length of the input data exceeds the maximum processing range of SHA2. */ CRYPT_SHA2_OUT_BUFF_LEN_NOT_ENOUGH, /**< The length of the buffer that storing the output result is insufficient. */ CRYPT_DRBG_ERR_STATE = 0x01060001, /**< DRBG status error. */ CRYPT_DRBG_FAIL_GET_ENTROPY, /**< Failed to obtain the entropy. */ CRYPT_DRBG_FAIL_GET_NONCE, /**< Failed to obtain the nonce. */ CRYPT_DRBG_ALG_NOT_SUPPORT, /**< Does not support the given algorithm. */ CRYPT_DRBG_INVALID_LEN, /**< Incorrect data length. */ CRYPT_DRBG_PARAM_ERROR, /**< Incorrect input parameter. */ CRYPT_CURVE25519_NO_PUBKEY = 0x01080001, /**< No public key. */ CRYPT_CURVE25519_NO_PRVKEY, /**< No private key. */ CRYPT_CURVE25519_KEYLEN_ERROR, /**< Incorrect key length. */ CRYPT_CURVE25519_SIGNLEN_ERROR, /**< Incorrect signature length. */ CRYPT_CURVE25519_HASH_METH_ERROR, /**< Hash method is not SHA512. */ CRYPT_CURVE25519_VERIFY_FAIL, /**< Signature verification fails due to incorrect signature. */ CRYPT_CURVE25519_NO_HASH_METHOD, /**< Hash method not set. */ CRYPT_CURVE25519_UNSUPPORTED_CTRL_OPTION, /**< Unsupported mode of operation. */ CRYPT_CURVE25519_KEY_COMPUTE_FAILED, /**< Failed to generate the shared key. */ CRYPT_CURVE25519_INVALID_PUBKEY, /**< Invalid public key. */ CRYPT_CURVE25519_PUBKEY_NOT_EQUAL, /**< Public keys are not equal. */ CRYPT_CURVE25519_INVALID_PRVKEY, /**< Invalid private key. */ CRYPT_CURVE25519_PAIRWISE_CHECK_FAIL, /**< The public and private keys are inconsistent. */ CRYPT_SHA1_INPUT_OVERFLOW = 0x01090001, /**< The length of the input data exceeds the maximum processing range of SHA1. */ CRYPT_SHA1_OUT_BUFF_LEN_NOT_ENOUGH, /**< The length of the buffer that storing the output result is insufficient. */ CRYPT_ENTROPY_RCT_FAILURE = 0x010A0001, /**< RCT detection fails, restart the entropy source. */ CRYPT_ENTROPY_APT_FAILURE, /**< APT detection fails, restart the entropy source. */ CRYPT_ENTROPY_CONDITION_FAILURE, /**< Processing method error after invoking. */ CRYPT_ENTROPY_RANGE_ERROR, /**< Entropy source generation range error */ CRYPT_ENTROPY_ECF_ALG_ERROR, /**< Entropy source conditioning algorithm is incorrect. */ CRYPT_ENTROPY_ECF_IS_ERROR, /**< Entropy source conditioning is incorrect. */ CRYPT_ENTROPY_ES_CREATE_ERROR, /**< Entropy pool creation error. */ CRYPT_ENTROPY_ES_STATE_ERROR, /**< Incorrect entropy pool status. */ CRYPT_ENTROPY_ES_CTRL_ERROR, /**< Incorrect entropy pool settings. */ CRYPT_ENTROPY_ES_NO_NS, /**< No available noise source in the entropy pool. */ CRYPT_ENTROPY_ES_NS_NOT_FOUND, /**< Noise source not found. */ CRYPT_ENTROPY_ES_DUP_NS, /**< Noise source Repetition. */ CRYPT_ENTROPY_ES_NS_NOT_AVA, /**< Noise source not available. */ CRYPT_ENTROPY_ES_NS_FULL, /**< Noise source list is full. */ CRYPT_ENTROPY_ES_CF_NOT_SUPPORT, /**< Nonditioning function not supported. */ CRYPT_ENTROPY_ES_CF_ERROR, /**< Nonditioning function error. */ CRYPT_ENTROPY_ES_ENTROPY_NOT_ENOUGH, /**< Not getting enough entropy. */ CRYPT_ENTROPY_ES_POOL_ERROR, /**< Entropy pool error. */ CRYPT_ENTROPY_ES_POOL_INSUFFICIENT, /**< Entropy pool capacity is insufficient. */ CRYPT_ENTROPY_CTRL_INVALID_PARAM, /**< Entropy invalid parameter. */ CRYPT_DSA_BUFF_LEN_NOT_ENOUGH = 0x010B0001, /**< Insufficient buffer length. */ CRYPT_DSA_ERR_KEY_PARA, /**< Incorrect key parameter data. */ CRYPT_DSA_ERR_KEY_INFO, /**< Incorrect key information. */ CRYPT_DSA_VERIFY_FAIL, /**< Verification failure. */ CRYPT_DSA_ERR_TRY_CNT, /**< Key generation and signature fail to be generated within the specified number of attempts. */ CRYPT_DSA_DECODE_FAIL, /**< Data decoding fails, the data does not meet the decoding requirements. */ CRYPT_DSA_UNSUPPORTED_CTRL_OPTION, /**< Unsupported mode of operation. */ CRYPT_DSA_PARA_ERROR, /**< The value of the key parameter does not meet the requirements. The ctx command does not contain necessary parameter information. */ CRYPT_DSA_PUBKEY_NOT_EQUAL, /**< Public keys are not equal. */ CRYPT_DSA_PARA_NOT_EQUAL, /**< Key parameters are not equal. */ CRYPT_DSA_INVALID_PRVKEY, /**< Invalid private key. */ CRYPT_DSA_PAIRWISE_CHECK_FAIL, /**< The public and private keys are inconsistent. */ CRYPT_HMAC_OUT_BUFF_LEN_NOT_ENOUGH = 0x010C0001, /**< The length of the buffer that storing the output result is insufficient. */ CRYPT_HMAC_ERR_UNSUPPORTED_CTRL_OPTION, /**< Unsupport the control type. */ CRYPT_HMAC_ERR_NO_MD_LIB_CTX, /**< MD library context not set. */ CRYPT_HMAC_PARAM_ERROR, /**< Incorrect input parameter. */ CRYPT_DH_BUFF_LEN_NOT_ENOUGH = 0x010D0001, /**< The buffer length is insufficient. */ CRYPT_DH_PARA_ERROR, /**< The value of the key parameter does not meet the requirements, the ctx command does not contain necessary parameter information. */ CRYPT_DH_KEYINFO_ERROR, /**< The value of the public and private keys do not meet the requirements, the ctx does not contain the necessary public and private keys. */ CRYPT_DH_RAND_GENERATE_ERROR, /**< Key generation fails within the specified number of attempts. */ CRYPT_DH_PAIRWISE_CHECK_FAIL, /**< The public and private keys are inconsistent. */ CRYPT_DH_UNSUPPORTED_CTRL_OPTION, /**< Unsupported mode of operation. */ CRYPT_DH_CREATE_PARA_FAIL, /**< Failed to create the p, q, and g parameters of the DH algorithm. */ CRYPT_DH_PUBKEY_NOT_EQUAL, /**< Public keys are not equal. */ CRYPT_DH_PARA_NOT_EQUAL, /**< DH key parameters are not equal. */ CRYPT_DH_SET_FLAG_LEN_ERROR, /**< The length of the input data is incorrect and return failure when setting the flag. */ CRYPT_DH_FLAG_NOT_SUPPORT_ERROR, /**< Unsupported flag. */ CRYPT_DH_INVALID_PRVKEY, /**< Invalid private key. */ CRYPT_CHACHA20_KEYLEN_ERROR = 0x010E0001, /**< The key length input is incorrect during key setting. */ CRYPT_CHACHA20_NONCELEN_ERROR, /**< The length of the input nounce is incorrect when you set the nounce. */ CRYPT_CHACHA20_COUNTLEN_ERROR, /**< The length of the input count is incorrect when you set the count. */ CRYPT_CHACHA20_NO_KEYINFO, /**< Lack of valid key information during encryption and decryption. */ CRYPT_CHACHA20_NO_NONCEINFO, /**< Lack of valid nounce information during encryption and decryption. */ CRYPT_CHACHA20_CTRLTYPE_ERROR, /**< The input type is not supported when the ctrl interface is used. */ CRYPT_AES_ERR_KEYLEN = 0x010F0001, /**< Incorrect key length. */ CRYPT_MODES_TAGLEN_ERROR = 0x01100001, /**< In AEAD mode, the length of the TAG is incorrect when the tag is obtained and verified. */ CRYPT_MODES_IVLEN_ERROR, /**< The length of the input IV is incorrect when setting the IV. */ CRYPT_MODES_KEYUSE_TOOMANY_TIME, /**< In GCM mode, the number of times that a key can be used for encryption and decryption is limited. When the number of times that a key is used exceeds the limit, an error is reported. */ CRYPT_MODES_CRYPTLEN_OVERFLOW, /**< In AEAD mode, the length of the plaintext or ciphertext input for a single encryption exceeds the limit. */ CRYPT_MODES_CTRL_TAGLEN_ERROR, /**< In GCM or CCM mode, the length of the input parameter or the length of the input parameter data is incorrect when the ctrl interface is used to set the tag length. */ CRYPT_MODES_AAD_REPEAT_SET_ERROR, /**< In the AEAD mode, the AAD information is set repeatedly. */ CRYPT_MODE_BUFF_LEN_NOT_ENOUGH, /**< The buffer length is insufficient. */ CRYPT_MODE_ERR_INPUT_LEN, /**< The function input length is not the expected length. */ CRYPT_MODES_CTRL_TYPE_ERROR, /**< The input type is not supported when the ctrl interface is used. */ CRYPT_MODES_AAD_IS_SET_ERROR, /**< In ccm mode, an error is returned when the tagLen and msgLen are set after the aad is set. */ CRYPT_MODES_MSGLEN_OVERFLOW, /**< In ccm mode, the length of the input message during encryption and decryption exceeds the set msgLen. */ CRYPT_MODES_CTRL_MSGLEN_ERROR, /**< In ccm mode, When the ctrl interface is used to set the msg length, the input parameter length or the input parameter data length is incorrect. (This specification is affected by ivLen.) */ CRYPT_MODES_MSGLEN_LEFT_ERROR, /**< In ccm mode, when the ctrl interface is used to obtain the tag, the length of the encrypted and decrypted messages does not reach the configured number. As a result, an error occurs. */ CRYPT_MODES_ERR_KEYLEN, /**< Incorrect key length set. */ CRYPT_MODES_ERR_KEY, /**< Incorrect key set. */ CRYPT_MODES_ERR_FEEDBACKSIZE, /**< The operation are not support by the algorithm on which the pattern depends on. */ CRYPT_MODES_METHODS_NOT_SUPPORT, /**< Mode depends does not support the behavior. */ CRYPT_MODES_FEEDBACKSIZE_NOT_SUPPORT, /**< The algorithm does not support the setting of feedbacksize. */ CRYPT_MODES_PADDING_NOT_SUPPORT, /**< Unsupported padding. */ CRYPT_HKDF_DKLEN_OVERFLOW = 0x01110001, /**< The length of the derived key exceeds the maximum. */ CRYPT_HKDF_NOT_SUPPORTED, /**< Unsupport HKDF algorithm. */ CRYPT_HKDF_PARAM_ERROR, /**< Incorrect input parameter. */ CRYPT_HKDF_ERR_MAC_ID_NOT_SET, /**< Mac id not set. */ CRYPT_HKDF_ERR_MAC_METH, /**< Mac method err. */ CRYPT_CMAC_OUT_BUFF_LEN_NOT_ENOUGH = 0x01120001, /**< The length of the buffer that storing the output result is insufficient. */ CRYPT_CMAC_INPUT_OVERFLOW, /**< The input length exceeds the limit. As a result, the integer type is reversed. */ CRYPT_CMAC_ERR_UNSUPPORTED_CTRL_OPTION, /**< Unsupport the control type. */ CRYPT_GMAC_ERR_UNSUPPORTED_CTRL_OPTION, /**< Unsupport the control type. */ CRYPT_SCRYPT_PARAM_ERROR = 0x01130001, /**< Incorrect input parameter. */ CRYPT_SCRYPT_NOT_SUPPORTED, /**< Unsupport the SCRYPT algorithm. */ CRYPT_SCRYPT_DATA_TOO_MAX, /**< The data calculated by the SCRYPT algorithm is too large. */ CRYPT_PBKDF2_PARAM_ERROR = 0x01150001, /**< Incorrect input parameter. */ CRYPT_PBKDF2_NOT_SUPPORTED, /**< Does not support the PBKDF2 algorithm. */ CRYPT_PBKDF2_ERR_MAC_METH, /**< Mac method err. */ CRYPT_PBKDF2_ERR_MAC_ID_NOT_SET, /**< Mac id not set. */ CRYPT_ECC_POINT_AT_INFINITY = 0x01160001, /**< Point at infinity. */ CRYPT_ECC_POINT_NOT_ON_CURVE, /**< Point is not on the curve. */ CRYPT_ECC_POINT_ERR_CURVE_ID, /**< Curve ID is inconsistent or incorrect. */ CRYPT_ECC_POINT_WINDOW_TOO_MAX, /**< Window is too max. */ CRYPT_ECC_POINT_NOT_EQUAL, /**< The two points are not equal. */ CRYPT_ECC_POINT_BLIND_WITH_ZERO, /**< The random number generated during point salting is 0. */ CRYPT_ECC_POINT_NOT_AFFINE, /**< Point is not affine coordinates. */ CRYPT_ECC_NOT_SUPPORT, /**< This function is not supported. */ CRYPT_ECC_POINT_MUL_ERR_K_LEN, /** The scalar length exceeds the curve specification when using the dot multiplication function */ CRYPT_ECC_BUFF_LEN_NOT_ENOUGH, /**< Insufficient buffer length. */ CRYPT_ECC_ERR_POINT_FORMAT, /**< The encoding format input during point encoding is incorrect. */ CRYPT_ECC_ERR_POINT_CODE, /**< Incorrect point code information. */ CRYPT_ECC_PKEY_ERR_UNSUPPORTED_CTRL_OPTION, /**< Unsupport the control type. */ CRYPT_ECC_PKEY_ERR_EMPTY_KEY, /**< Key is null. */ CRYPT_ECC_PKEY_ERR_INVALID_POINT_FORMAT, /**< Invalid dot format. */ CRYPT_ECC_PKEY_ERR_CTRL_LEN, /**< Control input parameter is incorrect. */ CRYPT_ECC_PKEY_ERR_INVALID_PRIVATE_KEY, /**< Invalid private key. */ CRYPT_ECC_PKEY_ERR_INVALID_PUBLIC_KEY, /**< Invalid public key. */ CRYPT_ECC_PKEY_ERR_TRY_CNT, /**< Key generation or generater signature fail within the specified number of attempts. */ CRYPT_ECC_PKEY_ERR_SIGN_LEN, /**< Invalid sign length */ CRYPT_ECC_ERR_PARA, /**< Incorrect curve parameter. */ CRYPT_ECC_INVERSE_INPUT_ZERO, /** Modulo inverse input is 0. */ CRYPT_ECC_KEY_PUBKEY_NOT_EQUAL, /**< ECC public keys are not equal. */ CRYPT_ECC_PAIRWISE_CHECK_FAIL, /**< The public and private keys are inconsistent. */ CRYPT_ECC_INVALID_PRVKEY, /**< Invalid private key. */ CRYPT_SHA3_OUT_BUFF_LEN_NOT_ENOUGH = 0x01170001, /**< Insufficient buffer length for storing output results. */ CRYPT_SHA3_INVALID_STATE, /**< Invalid state. */ CRYPT_ECDH_ERR_UNSUPPORT_CURVE_TYPE = 0x01180001, /**< Unsupported curve type. */ CRYPT_ECDH_ERR_EMPTY_KEY, /**< Key is null. */ CRYPT_ECDH_ERR_INVALID_COFACTOR, /**< Invalid cofactor value. */ CRYPT_ECDH_PAIRWISE_CHECK_FAIL, /**< The public and private keys are inconsistent. */ CRYPT_ECDH_INVALID_PRVKEY, /**< Invalid private key. */ CRYPT_ECDSA_ERR_EMPTY_KEY = 0x01190001, /**< Key is NULL. */ CRYPT_ECDSA_ERR_TRY_CNT, /**< Key generation and generate signature fail within the specified number of attempts. */ CRYPT_ECDSA_VERIFY_FAIL, /**< Verification failure. */ CRYPT_ECDSA_ERR_UNSUPPORTED_CTRL_OPTION, /**< Unsupport the control type. */ CRYPT_ECDSA_BUFF_LEN_NOT_ENOUGH, /**< BUFF insufficient length. */ CRYPT_ECDSA_PAIRWISE_CHECK_FAIL, /**< The public and private keys are inconsistent. */ CRYPT_ECDSA_INVALID_PRVKEY, /**< Invalid private key. */ CRYPT_SM3_INPUT_OVERFLOW = 0x011A0001, /**< The length of the input data exceeds the maximum processing range of the SM3. */ CRYPT_SM3_OUT_BUFF_LEN_NOT_ENOUGH, /**< The length of the buffer that storing the output result is insufficient. */ CRYPT_SM4_ERR_IV_LEN = 0x011B0001, /**< Wrong key length set. */ CRYPT_SM4_ERR_MSG_LEN, /**< Wrong data length is set. */ CRYPT_SM4_ERR_KEY_LEN, /**< Wrong key length is set. */ CRYPT_SM4_UNSAFE_KEY, /**< DataKey is the same as tweakKey. */ CRYPT_MD5_INPUT_OVERFLOW = 0x011D0001, /**< The length of the input data exceeds the maximum processing range of the MD5. */ CRYPT_MD5_OUT_BUFF_LEN_NOT_ENOUGH, /**< The length of the buffer that storing the output result is insufficient. */ CRYPT_MD_ERR_NEWCTX, /**< create md ctx failed. */ CRYPT_SM2_BUFF_LEN_NOT_ENOUGH = 0x01200001, /**< Insufficient buffer length. */ CRYPT_SM2_NO_PUBKEY, /**< SM2 the public key is not set. */ CRYPT_SM2_NO_PRVKEY, /**< SM2 The private key is not set. */ CRYPT_SM2_ERR_EMPTY_KEY, /**< SM2 key is null. */ CRYPT_SM2_ERR_TRY_CNT, /**< Key generation and generate signature fail within the specified number of attempts. */ CRYPT_SM2_VERIFY_FAIL, /**< verification failure. */ CRYPT_SM2_ERR_UNSUPPORTED_CTRL_OPTION, /**< Unsupported control type. */ CRYPT_SM2_ERR_NO_HASH_METHOD, /**< No hash method information. */ CRYPT_SM2_USERID_NOT_SET, /**< Unset userID. */ CRYPT_SM2_R_NOT_SET, /**< The peer R value is not set. */ CRYPT_SM2_INVALID_SERVER_TYPE, /**< The user is neither the initiator nor the recipient. */ CRYPT_SM2_ERR_CTRL_LEN, /**< Incorrect ctrl length. */ CRYPT_SM2_DECRYPT_FAIL, /**< Decryption failure. */ CRYPT_SM2_ERR_DATA_LEN, /**< Incorrect data length. */ CRYPT_SM2_ERR_GET_S, /**< Failed to obtain the checksum. */ CRYPT_SM2_ERR_S_NOT_SET, /**< Unset checksum. */ CRYPT_SM2_EXCH_VERIFY_FAIL, /**< Key Negotiation Failure. */ CRYPT_SM2_DECODE_FAIL, /**< Data decoding fails, the data does not meet the decoding requirements. */ CRYPT_SM2_ID_TOO_LARGE, /**< User id to large. */ CRYPT_SM2_K_REPEAT_SET_ERROR, /**< the random k is set repeatedly*/ CRYPT_SM2_PAIRWISE_CHECK_FAIL, /**< The public and private keys are inconsistent. */ CRYPT_SM2_INVALID_PRVKEY, /**< Invalid private key. */ CRYPT_KDFTLS12_NOT_SUPPORTED = 0x01210001, /**< Unsupport the KDFTLS12 algorithm. */ CRYPT_KDFTLS12_PARAM_ERROR, /**< Incorrect input parameter. */ CRYPT_KDFTLS12_ERR_MAC_METH, /**< Mac method err. */ CRYPT_KDFTLS12_ERR_MAC_ID_NOT_SET, /**< Mac id not set. */ CRYPT_SIPHASH_OUT_BUFF_LEN_NOT_ENOUGH = 0x01220001, /**< The buffer size for storing the output result is insufficient. */ CRYPT_SIPHASH_INPUT_OVERFLOW, CRYPT_SIPHASH_ERR_UNSUPPORTED_CTRL_OPTION, /**< Unsupport the control type. */ CRYPT_CBC_MAC_ERR_CTRL_LEN = 0x01240001, CRYPT_CBC_MAC_ERR_UNSUPPORTED_CTRL_OPTION, CRYPT_CBC_MAC_PADDING_NOT_SET, CRYPT_CBC_MAC_PADDING_NOT_SUPPORT, CRYPT_CBC_MAC_OUT_BUFF_LEN_NOT_ENOUGH, CRYPT_SEED_POOL_NEW_ERROR = 0x01290001, /**< The length of the key input is incorrect when setting the key. */ CRYPT_SEED_POOL_STATE_ERROR, /**< Incorrect seed pool status. */ CRYPT_SEED_POOL_ES_LIST_FULL, /**< The number of entropy sources exceeds the upper limit. */ CRYPT_SEED_POOL_NO_SUFFICIENT_ENTROPY, /**< The seed pool cannot provide sufficient entropy. */ CRYPT_SEED_POOL_NO_ENTROPY_SOURCE, /**< The seed pool has no entropy source. */ CRYPT_SEED_POOL_NO_ENTROPY_OBTAINED, /**< No entropy data is obtained from the seed pool. */ CRYPT_SEED_POOL_NOT_MEET_REQUIREMENT, /**< The entropy data does not meet the requirements. */ CRYPT_ENTROPY_CTX_CREATE_FAILED, /**< Failed to create the handle for obtaining the entropy. */ CRYPT_MLKEM_KEYLEN_ERROR = 0x01300001, /**< Incorrect input data length. */ CRYPT_MLKEM_LEN_NOT_ENOUGH, /**<The buffer size of output is insufficient. */ CRYPT_MLKEM_KEY_NOT_SET, /**<The encaps or decaps key not set. */ CRYPT_MLKEM_KEYINFO_NOT_SET, /**<The algorithm not set. */ CRYPT_MLKEM_KEY_NOT_EQUAL, /**< The MLKEM keys are not equal. */ CRYPT_MLKEM_CTRL_NOT_SUPPORT, /**< The Ctrl type is not supported.*/ CRYPT_MLKEM_CTRL_INIT_REPEATED, /**< The CTX cannot be initialized repeatedly.*/ CRYPT_MLKEM_PAIRWISE_CHECK_FAIL, /**< The public and private keys are inconsistent. */ CRYPT_MLKEM_INVALID_PRVKEY, /**< Invalid private key. */ CRYPT_HPKE_ERR_GEN_ASYM_KEY = 0x01310001, /**< HPKE Generate asymmetric key error. */ CRYPT_HPKE_ERR_AEAD_TAG, /**< Failed to verify AEAD tag when decrypt. */ CRYPT_HPKE_ERR_CALL, /**< It is not appropriate to call this function. */ CRYPT_HPKE_FAILED_FETCH_CIPHER, /**< Failed to fetch cipher. */ CRYPT_HPKE_FAILED_FETCH_PKEY, /**< Failed to fetch pkey. */ CRYPT_HPKE_FAILED_FETCH_KDF, /**< Failed to fetch kdf. */ CRYPT_DECODE_ASN1_BUFF_NUM_NOT_ENOUGH = 0x01320001, /**< The input number of BSL_ANS1_Buffer is not enough. */ CRYPT_DECODE_UNSUPPORTED_PUBKEY_TYPE, /**< Unsupported pubkey type */ CRYPT_DECODE_UNSUPPORTED_PKCS8_TYPE, /**< Unsupported pkcs8 type */ CRYPT_DECODE_PKCS8_INVALID_ALGO_PARAM, /**< pkcs8 has no valid algorithm parameters */ CRYPT_DECODE_UNKNOWN_OID, /**< Unknown OID */ CRYPT_DECODE_ASN1_BUFF_FAILED, /**< decode asn1 buffer failed. */ CRYPT_DECODE_NO_SUPPORT_TYPE, /**< decode no support key type. */ CRYPT_DECODE_NO_SUPPORT_FORMAT, /**< decode no support key format. */ CRYPT_DECODE_PKCS8_INVALID_ITER, /**< pkcs8 invalid iter num */ CRYPT_DECODE_PKCS8_INVALID_KEYLEN, /**< pkcs8 invalid keylen */ CRYPT_DECODE_ERR_RSSPSS_GET_ANY_TAG, /**< decode rsapss param failed. */ CRYPT_DECODE_ERR_RSSPSS, /**< decode rsapss param failed. */ CRYPT_DECODE_ERR_RSSPSS_MD, /**< rsapss md is invalid. */ CRYPT_DECODE_ERR_RSSPSS_MGF1MD, /**< rsapss mgf1md is invalid. */ CRYPT_DECODE_ERR_RSSPSS_TRAILER, /**< rsapss trailer field is invalid. */ CRYPT_DECODE_PKCS7_INVALIDE_ENCRYPTDATA_TYPE, /**< Invaild pkcs7-encryptedData. */ CRYPT_DECODE_UNSUPPORTED_PKCS7_TYPE, /**< Unsupported pkcs7 type */ CRYPT_DECODE_UNSUPPORTED_ENCRYPT_TYPE, /**< Unsupported encrypt type */ CRYPT_DECODE_BUFF_NOT_ENOUGH, /**< The input buffer space is not enough */ CRYPT_DECODE_ASN1_BUFF_LEN_ZERO, /**< The decoding length of asn1 buffer is zero. */ CRYPT_DECODE_ERR_NO_DECODER, /**< No decoder found. */ CRYPT_DECODE_ERR_NO_USABLE_DECODER, /**< No decoder found. */ CRYPT_DECODE_RETRY, /**< Retry decode. */ CRYPT_DECODE_ERR_CURR_NODE_NOT_FOUND, /**< Current node not found. */ CRYPT_DECODE_ERR_NO_KEY_TYPE, /**< No key type found. */ CRYPT_DECODE_ERR_KEY_TYPE_NOT_MATCH, /**< Key type not match. */ CRYPT_ENCODE_NO_SUPPORT_TYPE = 0x01330001, /**< encode no support key type. */ CRYPT_ENCODE_NO_SUPPORT_FORMAT, /**< encode no support key format. */ CRYPT_ENCODE_ERR_RSA_PAD, /**< rsa pad err. */ CRYPT_ENCODE_BUFF_NOT_ENOUGH, /**< The input buffer space is not enough */ CRYPT_ENCODE_ERR_SIGN_LEN_OVERFLOW, /**< The r and s length is too large. */ CRYPT_ENCODE_ERR_SM2_ENCRYPT_DATA_LEN_OVERFLOW, /**< The sm2 encrypt data length is too large. */ CRYPT_DECODE_PRINT_UNSUPPORT_ALG = 0x01340001, /**< Failed to print unsupported alg. */ CRYPT_DECODE_PRINT_NO_KEY, /**< Failed to print key. */ CRYPT_DECODE_PRINT_KEYBITS, /**< Failed to print key bist. */ CRYPT_DECODE_PRINT_MODULUS, /**< Failed to print modulus. */ CRYPT_DECODE_PRINT_EXPONENT, /**< Failed to print exponent. */ CRYPT_DECODE_PRINT_RSAPSS_PARA, /**< Failed to print rsapss para. */ CRYPT_DECODE_PRINT_ECC_PUB, /**< Failed to print ecc pubkey. */ CRYPT_DECODE_PRINT_ECC_OID, /**< Failed to print ecc oid. */ CRYPT_PROVIDER_ERR_UNEXPECTED_IMPL = 0x01350001, /**< Unexpected impl */ CRYPT_PROVIDER_ERR_IMPL_NULL, CRYPT_PROVIDER_NOT_FOUND, /**< Provider not found. */ CRYPT_PROVIDER_NOT_SUPPORT, CRYPT_PROVIDER_ERR_ATTRIBUTE, CRYPT_PROVIDER_INVALID_LIB_CTX, CRYPT_MLDSA_KEYINFO_NOT_SET = 0x01360001, /**< The algorithm not set. */ CRYPT_MLDSA_CTRL_NOT_SUPPORT, /**< The Ctrl type is not supported. */ CRYPT_MLDSA_PAD_TOO_LONG, /**< The pad is too long. */ CRYPT_MLDSA_KEYLEN_ERROR, /**< Incorrect input data length. */ CRYPT_MLDSA_SIGN_DATA_ERROR, /**< Invalid signature value. */ CRYPT_MLDSA_VERIFY_FAIL, /**< Failed to verify the signature. */ CRYPT_MLDSA_KEY_NOT_SET, /**< The public key or private not set. */ CRYPT_MLDSA_LEN_NOT_ENOUGH, /**< The buffer size of output is insufficient. */ CRYPT_MLDSA_KEY_NOT_EQUAL, /**< The MLDSA keys are not equal. */ CRYPT_MLDSA_CTRL_INIT_REPEATED, /**< The CTX cannot be initialized repeatedly.*/ CRYPT_MLDSA_SET_KEY_FAILED, /**< Failed to set the key. */ CRYPT_MLDSA_PAIRWISE_CHECK_FAIL, /**< The public and private keys are inconsistent. */ CRYPT_MLDSA_INVALID_PRVKEY, /**< Invalid private key. */ CRYPT_MLDSA_INVALID_PUBKEY, /**< Invalid public key. */ CRYPT_ELGAMAL_BUFF_LEN_NOT_ENOUGH = 0x01370001, /**< The buffer length is insufficient. */ CRYPT_ELGAMAL_NO_KEY_INFO, /**< Lacks valid key information. */ CRYPT_ELGAMAL_ERR_KEY_BITS, /**< Incorrect key length. */ CRYPT_ELGAMAL_ERR_ENC_BITS, /**< Incorrect length of the encrypted plaintext of the public key. */ CRYPT_ELGAMAL_ERR_DEC_BITS, /**< Incorrect length of the decrypted ciphertext of the private key. */ CRYPT_ELGAMAL_ERR_KEY_KBITS, /**< Incorrect key length. */ CRYPT_ELGAMAL_ERR_KEY_BITS_KBITS, /**< Incorrect key length. */ CRYPT_ELGAMAL_ERR_ENC_KBITS, /**< Incorrect length of the encrypted plaintext of the public key. */ CRYPT_ELGAMAL_ERR_DEC_KBITS, /**< Incorrect length of the decrypted ciphertext of the private key. */ CRYPT_ELGAMAL_ERR_INPUT_VALUE, /**< Some special values, which are used as input errors. */ CRYPT_ELGAMAL_CTRL_NOT_SUPPORT_ERROR, /**< The Ctrl type is not supported When elgamal is used for Ctrl. */ CRYPT_SLHDSA_ERR_INVALID_ALGID = 0x01380001, /**< The algorithm id is invalid. */ CRYPT_SLHDSA_ERR_INVALID_SIG_LEN, /**< The signature length is invalid. */ CRYPT_SLHDSA_ERR_INVALID_KEYLEN, /**< The key length is invalid. */ CRYPT_SLHDSA_ERR_SIG_LEN_NOT_ENOUGH, /**< The signature length is not enough. */ CRYPT_SLHDSA_ERR_HYPERTREE_VERIFY_FAIL, /**< Hypertree verify failed. */ CRYPT_SLHDSA_ERR_PREHASH_ID_NOT_SUPPORTED, /**< Prehash id is not supported. */ CRYPT_SLHDSA_ERR_CONTEXT_LEN_OVERFLOW, /**< Context length is overflow. */ CRYPT_SLHDSA_PAIRWISE_CHECK_FAIL, /**< The public and private keys are inconsistent. */ CRYPT_SLHDSA_ERR_NO_PUBKEY, /**< No public key. */ CRYPT_SLHDSA_ERR_NO_PRVKEY, /**< No private key. */ CRYPT_PAILLIER_BUFF_LEN_NOT_ENOUGH = 0x01390001, /**< The buffer length is insufficient. */ CRYPT_PAILLIER_NO_KEY_INFO, /**< Lacks valid key information. */ CRYPT_PAILLIER_ERR_KEY_BITS, /**< Incorrect key length. */ CRYPT_PAILLIER_ERR_ENC_BITS, /**< Incorrect length of the encrypted plaintext of the public key. */ CRYPT_PAILLIER_ERR_DEC_BITS, /**< Incorrect length of the decrypted ciphertext of the private key. */ CRYPT_PAILLIER_ERR_INPUT_VALUE, /**< Some special values, which are used as input errors. */ CRYPT_PAILLIER_CTRL_NOT_SUPPORT_ERROR, /**< The Ctrl type is not supported When paillier is used for Ctrl. */ CRYPT_XMSS_ERR_INVALID_ALGID = 0x013A0001, /**< The algorithm id is invalid. */ CRYPT_XMSS_ERR_INVALID_SIG_LEN, /**< The signature length is invalid. */ CRYPT_XMSS_ERR_INVALID_KEYLEN, /**< The key length is invalid. */ CRYPT_XMSS_ERR_KEY_EXPIRED, /**< The key has expired. */ CRYPT_CMVP_COMMON_ERR = 0x013B0001, /**< Common error in CMVP selftest. */ CRYPT_CMVP_ERR_INTEGRITY, /**< Integrity error in CMVP selftest. */ CRYPT_CMVP_RANDOMNESS_ERR, /**< Randomness error in CMVP selftest. */ CRYPT_CMVP_ERR_ALGO_SELFTEST, /**< Algorithm selftest error in CMVP selftest. */ CRYPT_CMVP_ERR_PAIRWISETEST, /**< Pairwise test error in CMVP selftest. */ CRYPT_CMVP_ERR_PARAM_CHECK, /**< Parameter check error in CMVP selftest. */ }; #ifdef __cplusplus } #endif #endif // CRYPT_ERRNO_H /home/wsk/Desktop/openhitls/testcode/demo/RSA-2048.c: In function ‘main’: /home/wsk/Desktop/openhitls/testcode/demo/RSA-2048.c:46:35: error: ‘CRYPT_CTRL_SET_RSA_MODULUS_BITS’ undeclared (first use in this function); did you mean ‘CRYPT_CTRL_GET_ECC_ORDER_BITS’? 46 | ret = CRYPT_EAL_PkeyCtrl(ctx, CRYPT_CTRL_SET_RSA_MODULUS_BITS, NULL, 2048); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | CRYPT_CTRL_GET_ECC_ORDER_BITS /home/wsk/Desktop/openhitls/testcode/demo/RSA-2048.c:46:35: note: each undeclared identifier is reported only once for each function it appears in [ 80%] Built target sm2sign [ 88%] Built target ecdh make[2]: *** [CMakeFiles/RSA-2048.dir/build.make:82: CMakeFiles/RSA-2048.dir/RSA-2048.c.o] Error 1 make[1]: *** [CMakeFiles/Makefile2:227: CMakeFiles/RSA-2048.dir/all] Error 2 make[1]: *** Waiting for unfinished jobs.... [ 96%] Built target sm2enc make: *** [Makefile:103: all] Error 2
09-07
/* ESP HTTP Client Example This example code is in the Public Domain (or CC0 licensed, at your option.) Unless required by applicable law or agreed to in writing, this software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */ #include <string.h> #include <sys/param.h> #include <stdlib.h> #include <ctype.h> #include "esp_log.h" #include "nvs_flash.h" #include "esp_event.h" #include "esp_netif.h" #include "protocol_examples_common.h" #include "protocol_examples_utils.h" #include "esp_tls.h" #if CONFIG_MBEDTLS_CERTIFICATE_BUNDLE #include "esp_crt_bundle.h" #endif #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "esp_system.h" #include "esp_http_client.h" #define MAX_HTTP_RECV_BUFFER 512 #define MAX_HTTP_OUTPUT_BUFFER 2048 #define DEVICE_ID "esp32_s3_device" // 设备唯一标识 #define PC_IP_ADDRESS "192.168.43.72" // PC局域网IP地址 static const char *TAG = "HTTP_CLIENT"; float ph_value=0,temperature_value=0, salinity_value=0, do_value=0, chlorine_value=0, nitrogen_value=0; /* Root cert for howsmyssl.com, taken from howsmyssl_com_root_cert.pem The PEM file was extracted from the output of this command: openssl s_client -showcerts -connect www.howsmyssl.com:443 </dev/null The CA root cert is the last cert given in the chain of certs. To embed it in the app binary, the PEM file is named in the component.mk COMPONENT_EMBED_TXTFILES variable. */ extern const char howsmyssl_com_root_cert_pem_start[] asm("_binary_howsmyssl_com_root_cert_pem_start"); extern const char howsmyssl_com_root_cert_pem_end[] asm("_binary_howsmyssl_com_root_cert_pem_end"); esp_err_t _http_event_handler(esp_http_client_event_t *evt) { static char *output_buffer; // Buffer to store response of http request from event handler static int output_len; // Stores number of bytes read switch(evt->event_id) { case HTTP_EVENT_ERROR: ESP_LOGD(TAG, "HTTP_EVENT_ERROR"); break; case HTTP_EVENT_ON_CONNECTED: ESP_LOGD(TAG, "HTTP_EVENT_ON_CONNECTED"); break; case HTTP_EVENT_HEADER_SENT: ESP_LOGD(TAG, "HTTP_EVENT_HEADER_SENT"); break; case HTTP_EVENT_ON_HEADER: ESP_LOGD(TAG, "HTTP_EVENT_ON_HEADER, key=%s, value=%s", evt->header_key, evt->header_value); break; case HTTP_EVENT_ON_DATA: ESP_LOGD(TAG, "HTTP_EVENT_ON_DATA, len=%d", evt->data_len); // Clean the buffer in case of a new request if (output_len == 0 && evt->user_data) { // we are just starting to copy the output data into the use memset(evt->user_data, 0, MAX_HTTP_OUTPUT_BUFFER); } /* * Check for chunked encoding is added as the URL for chunked encoding used in this example returns binary data. * However, event handler can also be used in case chunked encoding is used. */ if (!esp_http_client_is_chunked_response(evt->client)) { // If user_data buffer is configured, copy the response into the buffer int copy_len = 0; if (evt->user_data) { // The last byte in evt->user_data is kept for the NULL character in case of out-of-bound access. copy_len = MIN(evt->data_len, (MAX_HTTP_OUTPUT_BUFFER - output_len)); if (copy_len) { memcpy(evt->user_data + output_len, evt->data, copy_len); } } else { int content_len = esp_http_client_get_content_length(evt->client); if (output_buffer == NULL) { // We initialize output_buffer with 0 because it is used by strlen() and similar functions therefore should be null terminated. output_buffer = (char *) calloc(content_len + 1, sizeof(char)); output_len = 0; if (output_buffer == NULL) { ESP_LOGE(TAG, "Failed to allocate memory for output buffer"); return ESP_FAIL; } } copy_len = MIN(evt->data_len, (content_len - output_len)); if (copy_len) { memcpy(output_buffer + output_len, evt->data, copy_len); } } output_len += copy_len; } break; case HTTP_EVENT_ON_FINISH: ESP_LOGD(TAG, "HTTP_EVENT_ON_FINISH"); if (output_buffer != NULL) { #if CONFIG_EXAMPLE_ENABLE_RESPONSE_BUFFER_DUMP ESP_LOG_BUFFER_HEX(TAG, output_buffer, output_len); #endif free(output_buffer); output_buffer = NULL; } output_len = 0; break; case HTTP_EVENT_DISCONNECTED: ESP_LOGI(TAG, "HTTP_EVENT_DISCONNECTED"); int mbedtls_err = 0; esp_err_t err = esp_tls_get_and_clear_last_error((esp_tls_error_handle_t)evt->data, &mbedtls_err, NULL); if (err != 0) { ESP_LOGI(TAG, "Last esp error code: 0x%x", err); ESP_LOGI(TAG, "Last mbedtls failure: 0x%x", mbedtls_err); } if (output_buffer != NULL) { free(output_buffer); output_buffer = NULL; } output_len = 0; break; case HTTP_EVENT_REDIRECT: ESP_LOGD(TAG, "HTTP_EVENT_REDIRECT"); esp_http_client_set_header(evt->client, "From", "user@example.com"); esp_http_client_set_header(evt->client, "Accept", "text/html"); esp_http_client_set_redirection(evt->client); break; } return ESP_OK; } static void http_rest_with_url(void) { // Declare local_response_buffer with size (MAX_HTTP_OUTPUT_BUFFER + 1) to prevent out of bound access when // it is used by functions like strlen(). The buffer should only be used upto size MAX_HTTP_OUTPUT_BUFFER char local_response_buffer[MAX_HTTP_OUTPUT_BUFFER + 1] = {0}; /** * NOTE: All the configuration parameters for http_client must be specified either in URL or as host and path parameters. * If host and path parameters are not set, query parameter will be ignored. In such cases, * query parameter should be specified in URL. * * If URL as well as host and path parameters are specified, values of host and path will be considered. */ esp_http_client_config_t config = { .url = "http://192.168.43.72/api/telemetry", .method = HTTP_METHOD_POST, .timeout_ms = 5000, .event_handler = _http_event_handler, .buffer_size = 2048, .buffer_size_tx = 2048 }; ESP_LOGI(TAG, "HTTP request with url =>"); esp_http_client_handle_t client = esp_http_client_init(&config); // GET esp_err_t err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTP GET Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "HTTP GET request failed: %s", esp_err_to_name(err)); } ESP_LOG_BUFFER_HEX(TAG, local_response_buffer, strlen(local_response_buffer)); // POST char post_data[512]; // 更大的缓冲区 sprintf(post_data, "{\"deviceId\":\"%s\",\"data\":{\"ph\":%.2f,\"temperature\":%.2f,\"salinity\":%.2f,\"do\":%.2f,\"chemicals\":{\"chlorine\":%.2f,\"nitrogen\":%.2f}}}", DEVICE_ID, ph_value, temperature_value, salinity_value, do_value, chlorine_value, nitrogen_value); esp_http_client_set_url(client, "http://192.168.43.72/api/telemetry"); esp_http_client_set_method(client, HTTP_METHOD_POST); esp_http_client_set_header(client, "Content-Type", "application/json"); esp_http_client_set_post_field(client, post_data, strlen(post_data)); err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTP POST Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "HTTP POST request failed: %s", esp_err_to_name(err)); } //PUT esp_http_client_set_url(client, "http://"CONFIG_EXAMPLE_HTTP_ENDPOINT"/put"); esp_http_client_set_method(client, HTTP_METHOD_PUT); err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTP PUT Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "HTTP PUT request failed: %s", esp_err_to_name(err)); } //PATCH esp_http_client_set_url(client, "http://"CONFIG_EXAMPLE_HTTP_ENDPOINT"/patch"); esp_http_client_set_method(client, HTTP_METHOD_PATCH); esp_http_client_set_post_field(client, NULL, 0); err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTP PATCH Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "HTTP PATCH request failed: %s", esp_err_to_name(err)); } //DELETE esp_http_client_set_url(client, "http://"CONFIG_EXAMPLE_HTTP_ENDPOINT"/delete"); esp_http_client_set_method(client, HTTP_METHOD_DELETE); err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTP DELETE Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "HTTP DELETE request failed: %s", esp_err_to_name(err)); } //HEAD esp_http_client_set_url(client, "http://"CONFIG_EXAMPLE_HTTP_ENDPOINT"/get"); esp_http_client_set_method(client, HTTP_METHOD_HEAD); err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTP HEAD Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "HTTP HEAD request failed: %s", esp_err_to_name(err)); } esp_http_client_cleanup(client); } static void http_rest_with_hostname_path(void) { esp_http_client_config_t config = { .host = CONFIG_EXAMPLE_HTTP_ENDPOINT, .path = "/get", .transport_type = HTTP_TRANSPORT_OVER_TCP, .event_handler = _http_event_handler, }; ESP_LOGI(TAG, "HTTP request with hostname and path =>"); esp_http_client_handle_t client = esp_http_client_init(&config); // GET esp_err_t err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTP GET Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "HTTP GET request failed: %s", esp_err_to_name(err)); } // POST char post_data[512]; // 更大的缓冲区 sprintf(post_data, "{\"deviceId\":\"%s\",\"data\":{\"ph\":%.2f,\"temperature\":%.2f,\"salinity\":%.2f,\"do\":%.2f,\"chemicals\":{\"chlorine\":%.2f,\"nitrogen\":%.2f}}}", DEVICE_ID, ph_value, temperature_value, salinity_value, do_value, chlorine_value, nitrogen_value); esp_http_client_set_url(client, "http://"PC_IP_ADDRESS":3000/api/telemetry"); esp_http_client_set_method(client, HTTP_METHOD_POST); esp_http_client_set_post_field(client, post_data, strlen(post_data)); err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTP POST Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "HTTP POST request failed: %s", esp_err_to_name(err)); } //PUT esp_http_client_set_url(client, "/put"); esp_http_client_set_method(client, HTTP_METHOD_PUT); err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTP PUT Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "HTTP PUT request failed: %s", esp_err_to_name(err)); } //PATCH esp_http_client_set_url(client, "/patch"); esp_http_client_set_method(client, HTTP_METHOD_PATCH); esp_http_client_set_post_field(client, NULL, 0); err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTP PATCH Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "HTTP PATCH request failed: %s", esp_err_to_name(err)); } //DELETE esp_http_client_set_url(client, "/delete"); esp_http_client_set_method(client, HTTP_METHOD_DELETE); err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTP DELETE Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "HTTP DELETE request failed: %s", esp_err_to_name(err)); } //HEAD esp_http_client_set_url(client, "/get"); esp_http_client_set_method(client, HTTP_METHOD_HEAD); err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTP HEAD Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "HTTP HEAD request failed: %s", esp_err_to_name(err)); } esp_http_client_cleanup(client); } #if CONFIG_ESP_HTTP_CLIENT_ENABLE_BASIC_AUTH static void http_auth_basic(void) { /** * Note: `max_authorization_retries` in esp_http_client_config_t * can be used to configure number of retry attempts to be performed * in case unauthorized status code is received. * * To disable authorization retries, set max_authorization_retries to -1. */ esp_http_client_config_t config = { .url = "http://user:passwd@"CONFIG_EXAMPLE_HTTP_ENDPOINT"/basic-auth/user/passwd", .event_handler = _http_event_handler, .auth_type = HTTP_AUTH_TYPE_BASIC, .max_authorization_retries = -1, }; ESP_LOGI(TAG, "HTTP Basic Auth request =>"); esp_http_client_handle_t client = esp_http_client_init(&config); esp_err_t err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTP Basic Auth Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "Error perform http request %s", esp_err_to_name(err)); } esp_http_client_cleanup(client); } static void http_auth_basic_redirect(void) { esp_http_client_config_t config = { .url = "http://user:passwd@"CONFIG_EXAMPLE_HTTP_ENDPOINT"/basic-auth/user/passwd", .event_handler = _http_event_handler, }; ESP_LOGI(TAG, "HTTP Basic Auth redirect request =>"); esp_http_client_handle_t client = esp_http_client_init(&config); esp_err_t err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTP Basic Auth redirect Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "Error perform http request %s", esp_err_to_name(err)); } esp_http_client_cleanup(client); } #endif #if CONFIG_ESP_HTTP_CLIENT_ENABLE_DIGEST_AUTH static void http_auth_digest_md5(void) { esp_http_client_config_t config = { .url = "http://user:passwd@"CONFIG_EXAMPLE_HTTP_ENDPOINT"/digest-auth/auth/user/passwd/MD5/never", .event_handler = _http_event_handler, }; ESP_LOGI(TAG, "HTTP MD5 Digest Auth request =>"); esp_http_client_handle_t client = esp_http_client_init(&config); esp_err_t err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTP MD5 Digest Auth Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "Error performing http request %s", esp_err_to_name(err)); } esp_http_client_cleanup(client); } static void http_auth_digest_sha256(void) { esp_http_client_config_t config = { .url = "http://user:passwd@"CONFIG_EXAMPLE_HTTP_ENDPOINT"/digest-auth/auth/user/passwd/SHA-256/never", .event_handler = _http_event_handler, .buffer_size_tx = 1024, // Increase buffer size as header size will increase as it contains SHA-256. }; ESP_LOGI(TAG, "HTTP SHA256 Digest Auth request =>"); esp_http_client_handle_t client = esp_http_client_init(&config); esp_err_t err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTP SHA256 Digest Auth Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "Error performing http request %s", esp_err_to_name(err)); } esp_http_client_cleanup(client); } #endif #if CONFIG_MBEDTLS_CERTIFICATE_BUNDLE static void https_with_url(void) { esp_http_client_config_t config = { .url = "https://www.howsmyssl.com", .event_handler = _http_event_handler, .crt_bundle_attach = esp_crt_bundle_attach, }; ESP_LOGI(TAG, "HTTPS request with url =>"); esp_http_client_handle_t client = esp_http_client_init(&config); esp_err_t err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTPS Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "Error perform http request %s", esp_err_to_name(err)); } esp_http_client_cleanup(client); } #endif // CONFIG_MBEDTLS_CERTIFICATE_BUNDLE static void https_with_hostname_path(void) { esp_http_client_config_t config = { .host = "www.howsmyssl.com", .path = "/", .transport_type = HTTP_TRANSPORT_OVER_SSL, .event_handler = _http_event_handler, .cert_pem = howsmyssl_com_root_cert_pem_start, }; ESP_LOGI(TAG, "HTTPS request with hostname and path =>"); esp_http_client_handle_t client = esp_http_client_init(&config); esp_err_t err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTPS Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "Error perform http request %s", esp_err_to_name(err)); } esp_http_client_cleanup(client); } static void http_encoded_query(void) { esp_http_client_config_t config = { .host = CONFIG_EXAMPLE_HTTP_ENDPOINT, .path = "/get", .event_handler = _http_event_handler, }; ESP_LOGI(TAG, "HTTP GET request with encoded query =>"); static const char query_val[] = "ABC xyz!012@#%&"; char query_val_enc[64] = {0}; uint32_t enc_len = example_uri_encode(query_val_enc, query_val, strlen(query_val)); if (enc_len > 0) { ESP_LOG_BUFFER_HEXDUMP(TAG, query_val_enc, enc_len, ESP_LOG_DEBUG); config.query = query_val_enc; } esp_http_client_handle_t client = esp_http_client_init(&config); esp_err_t err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTP GET Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "HTTP GET request failed: %s", esp_err_to_name(err)); } } static void http_relative_redirect(void) { esp_http_client_config_t config = { .url = "http://"CONFIG_EXAMPLE_HTTP_ENDPOINT"/relative-redirect/3", .event_handler = _http_event_handler, }; ESP_LOGI(TAG, "HTTP Relative path redirect request =>"); esp_http_client_handle_t client = esp_http_client_init(&config); esp_err_t err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTP Relative path redirect Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "Error perform http request %s", esp_err_to_name(err)); } esp_http_client_cleanup(client); } static void http_absolute_redirect(void) { esp_http_client_config_t config = { .url = "http://"CONFIG_EXAMPLE_HTTP_ENDPOINT"/absolute-redirect/3", .event_handler = _http_event_handler, }; ESP_LOGI(TAG, "HTTP Absolute path redirect request =>"); esp_http_client_handle_t client = esp_http_client_init(&config); esp_err_t err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTP Absolute path redirect Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "Error perform http request %s", esp_err_to_name(err)); } esp_http_client_cleanup(client); } static void http_absolute_redirect_manual(void) { esp_http_client_config_t config = { .url = "http://"CONFIG_EXAMPLE_HTTP_ENDPOINT"/absolute-redirect/3", .event_handler = _http_event_handler, .disable_auto_redirect = true, }; ESP_LOGI(TAG, "HTTP Absolute path redirect (manual) request =>"); esp_http_client_handle_t client = esp_http_client_init(&config); esp_err_t err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTP Absolute path redirect (manual) Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "Error perform http request %s", esp_err_to_name(err)); } esp_http_client_cleanup(client); } static void http_redirect_to_https(void) { esp_http_client_config_t config = { .url = "http://"CONFIG_EXAMPLE_HTTP_ENDPOINT"/redirect-to?url=https://www.howsmyssl.com", .event_handler = _http_event_handler, .cert_pem = howsmyssl_com_root_cert_pem_start, }; ESP_LOGI(TAG, "HTTP redirect to HTTPS request =>"); esp_http_client_handle_t client = esp_http_client_init(&config); esp_err_t err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTP redirect to HTTPS Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "Error perform http request %s", esp_err_to_name(err)); } esp_http_client_cleanup(client); } static void http_download_chunk(void) { esp_http_client_config_t config = { .url = "http://"CONFIG_EXAMPLE_HTTP_ENDPOINT"/stream-bytes/8912", .event_handler = _http_event_handler, }; ESP_LOGI(TAG, "HTTP chunk encoding request =>"); esp_http_client_handle_t client = esp_http_client_init(&config); esp_err_t err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTP chunk encoding Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "Error perform http request %s", esp_err_to_name(err)); } esp_http_client_cleanup(client); } static void http_perform_as_stream_reader(void) { char *buffer = malloc(MAX_HTTP_RECV_BUFFER + 1); if (buffer == NULL) { ESP_LOGE(TAG, "Cannot malloc http receive buffer"); return; } esp_http_client_config_t config = { .url = "http://"CONFIG_EXAMPLE_HTTP_ENDPOINT"/get", }; ESP_LOGI(TAG, "HTTP Stream reader request =>"); esp_http_client_handle_t client = esp_http_client_init(&config); esp_err_t err; if ((err = esp_http_client_open(client, 0)) != ESP_OK) { ESP_LOGE(TAG, "Failed to open HTTP connection: %s", esp_err_to_name(err)); free(buffer); return; } int content_length = esp_http_client_fetch_headers(client); int total_read_len = 0, read_len; if (total_read_len < content_length && content_length <= MAX_HTTP_RECV_BUFFER) { read_len = esp_http_client_read(client, buffer, content_length); if (read_len <= 0) { ESP_LOGE(TAG, "Error read data"); } buffer[read_len] = 0; ESP_LOGD(TAG, "read_len = %d", read_len); } ESP_LOGI(TAG, "HTTP Stream reader Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); esp_http_client_close(client); esp_http_client_cleanup(client); free(buffer); } static void https_async(void) { esp_http_client_config_t config = { .url = "https://postman-echo.com/post", .event_handler = _http_event_handler, .crt_bundle_attach = esp_crt_bundle_attach, .is_async = true, .timeout_ms = 5000, }; ESP_LOGI(TAG, "HTTPS async requests =>"); esp_http_client_handle_t client = esp_http_client_init(&config); esp_err_t err; const char *post_data = "Using a Palantír requires a person with great strength of will and wisdom. The Palantíri were meant to " "be used by the Dúnedain to communicate throughout the Realms in Exile. During the War of the Ring, " "the Palantíri were used by many individuals. Sauron used the Ithil-stone to take advantage of the users " "of the other two stones, the Orthanc-stone and Anor-stone, but was also susceptible to deception himself."; esp_http_client_set_method(client, HTTP_METHOD_POST); esp_http_client_set_post_field(client, post_data, strlen(post_data)); while (1) { err = esp_http_client_perform(client); if (err != ESP_ERR_HTTP_EAGAIN) { break; } } if (err == ESP_OK) { ESP_LOGI(TAG, "HTTPS Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "Error perform http request %s", esp_err_to_name(err)); } esp_http_client_cleanup(client); // Test HTTP_METHOD_HEAD with is_async enabled config.url = "https://"CONFIG_EXAMPLE_HTTP_ENDPOINT"/get"; config.event_handler = _http_event_handler; config.crt_bundle_attach = esp_crt_bundle_attach; config.is_async = true; config.timeout_ms = 5000; client = esp_http_client_init(&config); esp_http_client_set_method(client, HTTP_METHOD_HEAD); while (1) { err = esp_http_client_perform(client); if (err != ESP_ERR_HTTP_EAGAIN) { break; } } if (err == ESP_OK) { ESP_LOGI(TAG, "HTTPS Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "Error perform http request %s", esp_err_to_name(err)); } esp_http_client_cleanup(client); } static void https_with_invalid_url(void) { esp_http_client_config_t config = { .url = "https://not.existent.url", .event_handler = _http_event_handler, }; ESP_LOGI(TAG, "HTTPS request with invalid url =>"); esp_http_client_handle_t client = esp_http_client_init(&config); esp_err_t err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTPS Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "Error perform http request %s", esp_err_to_name(err)); } esp_http_client_cleanup(client); } /* * http_native_request() demonstrates use of low level APIs to connect to a server, * make a http request and read response. Event handler is not used in this case. * Note: This approach should only be used in case use of low level APIs is required. * The easiest way is to use esp_http_perform() */ static void http_native_request(void) { // Declare local_response_buffer with size (MAX_HTTP_OUTPUT_BUFFER + 1) to prevent out of bound access when // it is used by functions like strlen(). The buffer should only be used upto size MAX_HTTP_OUTPUT_BUFFER char output_buffer[MAX_HTTP_OUTPUT_BUFFER + 1] = {0}; // Buffer to store response of http request int content_length = 0; esp_http_client_config_t config = { .url = "http://"CONFIG_EXAMPLE_HTTP_ENDPOINT"/get", }; ESP_LOGI(TAG, "HTTP native request =>"); esp_http_client_handle_t client = esp_http_client_init(&config); // GET Request esp_http_client_set_method(client, HTTP_METHOD_GET); esp_err_t err = esp_http_client_open(client, 0); if (err != ESP_OK) { ESP_LOGE(TAG, "Failed to open HTTP connection: %s", esp_err_to_name(err)); } else { content_length = esp_http_client_fetch_headers(client); if (content_length < 0) { ESP_LOGE(TAG, "HTTP client fetch headers failed"); } else { int data_read = esp_http_client_read_response(client, output_buffer, MAX_HTTP_OUTPUT_BUFFER); if (data_read >= 0) { ESP_LOGI(TAG, "HTTP GET Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); ESP_LOG_BUFFER_HEX(TAG, output_buffer, data_read); } else { ESP_LOGE(TAG, "Failed to read response"); } } } esp_http_client_close(client); // POST Request const char *post_data = "{\"field1\":\"value1\"}"; esp_http_client_set_url(client, "http://"CONFIG_EXAMPLE_HTTP_ENDPOINT"/post"); esp_http_client_set_method(client, HTTP_METHOD_POST); esp_http_client_set_header(client, "Content-Type", "application/json"); err = esp_http_client_open(client, strlen(post_data)); if (err != ESP_OK) { ESP_LOGE(TAG, "Failed to open HTTP connection: %s", esp_err_to_name(err)); } else { int wlen = esp_http_client_write(client, post_data, strlen(post_data)); if (wlen < 0) { ESP_LOGE(TAG, "Write failed"); } content_length = esp_http_client_fetch_headers(client); if (content_length < 0) { ESP_LOGE(TAG, "HTTP client fetch headers failed"); } else { int data_read = esp_http_client_read_response(client, output_buffer, MAX_HTTP_OUTPUT_BUFFER); if (data_read >= 0) { ESP_LOGI(TAG, "HTTP POST Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); ESP_LOG_BUFFER_HEX(TAG, output_buffer, strlen(output_buffer)); } else { ESP_LOGE(TAG, "Failed to read response"); } } } esp_http_client_cleanup(client); } #if CONFIG_MBEDTLS_CERTIFICATE_BUNDLE static void http_partial_download(void) { esp_http_client_config_t config = { .url = "https://dl.espressif.com/dl/esp-idf/ci/esp_http_client_demo.txt", .event_handler = _http_event_handler, .crt_bundle_attach = esp_crt_bundle_attach, }; ESP_LOGI(TAG, "HTTP partial download =>"); esp_http_client_handle_t client = esp_http_client_init(&config); // Download a file excluding first 10 bytes esp_http_client_set_header(client, "Range", "bytes=10-"); esp_err_t err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTP Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "HTTP request failed: %s", esp_err_to_name(err)); } // Download last 10 bytes of a file esp_http_client_set_header(client, "Range", "bytes=-10"); err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTP Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "HTTP request failed: %s", esp_err_to_name(err)); } // Download 10 bytes from 11 to 20 esp_http_client_set_header(client, "Range", "bytes=11-20"); err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTP Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "HTTP request failed: %s", esp_err_to_name(err)); } esp_http_client_cleanup(client); } #endif // CONFIG_MBEDTLS_CERTIFICATE_BUNDLE static void http_test_task(void *pvParameters) { http_rest_with_url(); http_rest_with_hostname_path(); #if CONFIG_ESP_HTTP_CLIENT_ENABLE_BASIC_AUTH http_auth_basic(); http_auth_basic_redirect(); #endif #if CONFIG_ESP_HTTP_CLIENT_ENABLE_DIGEST_AUTH http_auth_digest_md5(); http_auth_digest_sha256(); #endif http_encoded_query(); http_relative_redirect(); http_absolute_redirect(); http_absolute_redirect_manual(); #if CONFIG_MBEDTLS_CERTIFICATE_BUNDLE https_with_url(); #endif https_with_hostname_path(); http_redirect_to_https(); http_download_chunk(); http_perform_as_stream_reader(); https_async(); https_with_invalid_url(); http_native_request(); #if CONFIG_MBEDTLS_CERTIFICATE_BUNDLE http_partial_download(); #endif ESP_LOGI(TAG, "Finish http example"); #if !CONFIG_IDF_TARGET_LINUX vTaskDelete(NULL); #endif } void app_main(void) { esp_err_t ret = nvs_flash_init(); if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { ESP_ERROR_CHECK(nvs_flash_erase()); ret = nvs_flash_init(); } ESP_ERROR_CHECK(ret); ESP_ERROR_CHECK(esp_netif_init()); ESP_ERROR_CHECK(esp_event_loop_create_default()); /* This helper function configures Wi-Fi or Ethernet, as selected in menuconfig. * Read "Establishing Wi-Fi or Ethernet Connection" section in * examples/protocols/README.md for more information about this function. */ ESP_ERROR_CHECK(example_connect()); ESP_LOGI(TAG, "Connected to AP, begin http example"); #if CONFIG_IDF_TARGET_LINUX http_test_task(NULL); #else xTaskCreate(&http_test_task, "http_test_task", 8192, NULL, 5, NULL); #endif } 请筛选出POST部分的代码,去除其他请求的代码
最新发布
11-04
/* ESP HTTP Client Example This example code is in the Public Domain (or CC0 licensed, at your option.) Unless required by applicable law or agreed to in writing, this software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */ #include <string.h> #include <sys/param.h> #include <stdlib.h> #include <ctype.h> #include "esp_log.h" #include "nvs_flash.h" #include "esp_event.h" #include "esp_netif.h" #include "protocol_examples_common.h" #include "protocol_examples_utils.h" #include "esp_tls.h" #if CONFIG_MBEDTLS_CERTIFICATE_BUNDLE #include "esp_crt_bundle.h" #endif #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "esp_system.h" #include "esp_http_client.h" #define MAX_HTTP_RECV_BUFFER 512 #define MAX_HTTP_OUTPUT_BUFFER 2048 static const char *TAG = "HTTP_CLIENT"; /* Root cert for howsmyssl.com, taken from howsmyssl_com_root_cert.pem The PEM file was extracted from the output of this command: openssl s_client -showcerts -connect www.howsmyssl.com:443 </dev/null The CA root cert is the last cert given in the chain of certs. To embed it in the app binary, the PEM file is named in the component.mk COMPONENT_EMBED_TXTFILES variable. */ extern const char howsmyssl_com_root_cert_pem_start[] asm("_binary_howsmyssl_com_root_cert_pem_start"); extern const char howsmyssl_com_root_cert_pem_end[] asm("_binary_howsmyssl_com_root_cert_pem_end"); esp_err_t _http_event_handler(esp_http_client_event_t *evt) { static char *output_buffer; // Buffer to store response of http request from event handler static int output_len; // Stores number of bytes read switch(evt->event_id) { case HTTP_EVENT_ERROR: ESP_LOGD(TAG, "HTTP_EVENT_ERROR"); break; case HTTP_EVENT_ON_CONNECTED: ESP_LOGD(TAG, "HTTP_EVENT_ON_CONNECTED"); break; case HTTP_EVENT_HEADER_SENT: ESP_LOGD(TAG, "HTTP_EVENT_HEADER_SENT"); break; case HTTP_EVENT_ON_HEADER: ESP_LOGD(TAG, "HTTP_EVENT_ON_HEADER, key=%s, value=%s", evt->header_key, evt->header_value); break; case HTTP_EVENT_ON_DATA: ESP_LOGD(TAG, "HTTP_EVENT_ON_DATA, len=%d", evt->data_len); // Clean the buffer in case of a new request if (output_len == 0 && evt->user_data) { // we are just starting to copy the output data into the use memset(evt->user_data, 0, MAX_HTTP_OUTPUT_BUFFER); } /* * Check for chunked encoding is added as the URL for chunked encoding used in this example returns binary data. * However, event handler can also be used in case chunked encoding is used. */ if (!esp_http_client_is_chunked_response(evt->client)) { // If user_data buffer is configured, copy the response into the buffer int copy_len = 0; if (evt->user_data) { // The last byte in evt->user_data is kept for the NULL character in case of out-of-bound access. copy_len = MIN(evt->data_len, (MAX_HTTP_OUTPUT_BUFFER - output_len)); if (copy_len) { memcpy(evt->user_data + output_len, evt->data, copy_len); } } else { int content_len = esp_http_client_get_content_length(evt->client); if (output_buffer == NULL) { // We initialize output_buffer with 0 because it is used by strlen() and similar functions therefore should be null terminated. output_buffer = (char *) calloc(content_len + 1, sizeof(char)); output_len = 0; if (output_buffer == NULL) { ESP_LOGE(TAG, "Failed to allocate memory for output buffer"); return ESP_FAIL; } } copy_len = MIN(evt->data_len, (content_len - output_len)); if (copy_len) { memcpy(output_buffer + output_len, evt->data, copy_len); } } output_len += copy_len; } break; case HTTP_EVENT_ON_FINISH: ESP_LOGD(TAG, "HTTP_EVENT_ON_FINISH"); if (output_buffer != NULL) { #if CONFIG_EXAMPLE_ENABLE_RESPONSE_BUFFER_DUMP ESP_LOG_BUFFER_HEX(TAG, output_buffer, output_len); #endif free(output_buffer); output_buffer = NULL; } output_len = 0; break; case HTTP_EVENT_DISCONNECTED: ESP_LOGI(TAG, "HTTP_EVENT_DISCONNECTED"); int mbedtls_err = 0; esp_err_t err = esp_tls_get_and_clear_last_error((esp_tls_error_handle_t)evt->data, &mbedtls_err, NULL); if (err != 0) { ESP_LOGI(TAG, "Last esp error code: 0x%x", err); ESP_LOGI(TAG, "Last mbedtls failure: 0x%x", mbedtls_err); } if (output_buffer != NULL) { free(output_buffer); output_buffer = NULL; } output_len = 0; break; case HTTP_EVENT_REDIRECT: ESP_LOGD(TAG, "HTTP_EVENT_REDIRECT"); esp_http_client_set_header(evt->client, "From", "user@example.com"); esp_http_client_set_header(evt->client, "Accept", "text/html"); esp_http_client_set_redirection(evt->client); break; } return ESP_OK; } static void http_rest_with_url(void) { // Declare local_response_buffer with size (MAX_HTTP_OUTPUT_BUFFER + 1) to prevent out of bound access when // it is used by functions like strlen(). The buffer should only be used upto size MAX_HTTP_OUTPUT_BUFFER char local_response_buffer[MAX_HTTP_OUTPUT_BUFFER + 1] = {0}; /** * NOTE: All the configuration parameters for http_client must be specified either in URL or as host and path parameters. * If host and path parameters are not set, query parameter will be ignored. In such cases, * query parameter should be specified in URL. * * If URL as well as host and path parameters are specified, values of host and path will be considered. */ esp_http_client_config_t config = { .host = CONFIG_EXAMPLE_HTTP_ENDPOINT, .path = "/get", .query = "esp", .event_handler = _http_event_handler, .user_data = local_response_buffer, // Pass address of local buffer to get response .disable_auto_redirect = true, }; ESP_LOGI(TAG, "HTTP request with url =>"); esp_http_client_handle_t client = esp_http_client_init(&config); // GET esp_err_t err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTP GET Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "HTTP GET request failed: %s", esp_err_to_name(err)); } ESP_LOG_BUFFER_HEX(TAG, local_response_buffer, strlen(local_response_buffer)); // POST const char *post_data = "{\"field1\":\"value1\"}"; esp_http_client_set_url(client, "http://"CONFIG_EXAMPLE_HTTP_ENDPOINT"/post"); esp_http_client_set_method(client, HTTP_METHOD_POST); esp_http_client_set_header(client, "Content-Type", "application/json"); esp_http_client_set_post_field(client, post_data, strlen(post_data)); err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTP POST Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "HTTP POST request failed: %s", esp_err_to_name(err)); } //PUT esp_http_client_set_url(client, "http://"CONFIG_EXAMPLE_HTTP_ENDPOINT"/put"); esp_http_client_set_method(client, HTTP_METHOD_PUT); err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTP PUT Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "HTTP PUT request failed: %s", esp_err_to_name(err)); } //PATCH esp_http_client_set_url(client, "http://"CONFIG_EXAMPLE_HTTP_ENDPOINT"/patch"); esp_http_client_set_method(client, HTTP_METHOD_PATCH); esp_http_client_set_post_field(client, NULL, 0); err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTP PATCH Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "HTTP PATCH request failed: %s", esp_err_to_name(err)); } //DELETE esp_http_client_set_url(client, "http://"CONFIG_EXAMPLE_HTTP_ENDPOINT"/delete"); esp_http_client_set_method(client, HTTP_METHOD_DELETE); err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTP DELETE Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "HTTP DELETE request failed: %s", esp_err_to_name(err)); } //HEAD esp_http_client_set_url(client, "http://"CONFIG_EXAMPLE_HTTP_ENDPOINT"/get"); esp_http_client_set_method(client, HTTP_METHOD_HEAD); err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTP HEAD Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "HTTP HEAD request failed: %s", esp_err_to_name(err)); } esp_http_client_cleanup(client); } static void http_rest_with_hostname_path(void) { esp_http_client_config_t config = { .host = CONFIG_EXAMPLE_HTTP_ENDPOINT, .path = "/get", .transport_type = HTTP_TRANSPORT_OVER_TCP, .event_handler = _http_event_handler, }; ESP_LOGI(TAG, "HTTP request with hostname and path =>"); esp_http_client_handle_t client = esp_http_client_init(&config); // GET esp_err_t err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTP GET Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "HTTP GET request failed: %s", esp_err_to_name(err)); } // POST const char *post_data = "field1=value1&field2=value2"; esp_http_client_set_url(client, "/post"); esp_http_client_set_method(client, HTTP_METHOD_POST); esp_http_client_set_post_field(client, post_data, strlen(post_data)); err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTP POST Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "HTTP POST request failed: %s", esp_err_to_name(err)); } //PUT esp_http_client_set_url(client, "/put"); esp_http_client_set_method(client, HTTP_METHOD_PUT); err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTP PUT Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "HTTP PUT request failed: %s", esp_err_to_name(err)); } //PATCH esp_http_client_set_url(client, "/patch"); esp_http_client_set_method(client, HTTP_METHOD_PATCH); esp_http_client_set_post_field(client, NULL, 0); err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTP PATCH Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "HTTP PATCH request failed: %s", esp_err_to_name(err)); } //DELETE esp_http_client_set_url(client, "/delete"); esp_http_client_set_method(client, HTTP_METHOD_DELETE); err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTP DELETE Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "HTTP DELETE request failed: %s", esp_err_to_name(err)); } //HEAD esp_http_client_set_url(client, "/get"); esp_http_client_set_method(client, HTTP_METHOD_HEAD); err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTP HEAD Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "HTTP HEAD request failed: %s", esp_err_to_name(err)); } esp_http_client_cleanup(client); } #if CONFIG_ESP_HTTP_CLIENT_ENABLE_BASIC_AUTH static void http_auth_basic(void) { /** * Note: `max_authorization_retries` in esp_http_client_config_t * can be used to configure number of retry attempts to be performed * in case unauthorized status code is received. * * To disable authorization retries, set max_authorization_retries to -1. */ esp_http_client_config_t config = { .url = "http://user:passwd@"CONFIG_EXAMPLE_HTTP_ENDPOINT"/basic-auth/user/passwd", .event_handler = _http_event_handler, .auth_type = HTTP_AUTH_TYPE_BASIC, .max_authorization_retries = -1, }; ESP_LOGI(TAG, "HTTP Basic Auth request =>"); esp_http_client_handle_t client = esp_http_client_init(&config); esp_err_t err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTP Basic Auth Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "Error perform http request %s", esp_err_to_name(err)); } esp_http_client_cleanup(client); } static void http_auth_basic_redirect(void) { esp_http_client_config_t config = { .url = "http://user:passwd@"CONFIG_EXAMPLE_HTTP_ENDPOINT"/basic-auth/user/passwd", .event_handler = _http_event_handler, }; ESP_LOGI(TAG, "HTTP Basic Auth redirect request =>"); esp_http_client_handle_t client = esp_http_client_init(&config); esp_err_t err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTP Basic Auth redirect Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "Error perform http request %s", esp_err_to_name(err)); } esp_http_client_cleanup(client); } #endif #if CONFIG_ESP_HTTP_CLIENT_ENABLE_DIGEST_AUTH static void http_auth_digest_md5(void) { esp_http_client_config_t config = { .url = "http://user:passwd@"CONFIG_EXAMPLE_HTTP_ENDPOINT"/digest-auth/auth/user/passwd/MD5/never", .event_handler = _http_event_handler, }; ESP_LOGI(TAG, "HTTP MD5 Digest Auth request =>"); esp_http_client_handle_t client = esp_http_client_init(&config); esp_err_t err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTP MD5 Digest Auth Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "Error performing http request %s", esp_err_to_name(err)); } esp_http_client_cleanup(client); } static void http_auth_digest_sha256(void) { esp_http_client_config_t config = { .url = "http://user:passwd@"CONFIG_EXAMPLE_HTTP_ENDPOINT"/digest-auth/auth/user/passwd/SHA-256/never", .event_handler = _http_event_handler, .buffer_size_tx = 1024, // Increase buffer size as header size will increase as it contains SHA-256. }; ESP_LOGI(TAG, "HTTP SHA256 Digest Auth request =>"); esp_http_client_handle_t client = esp_http_client_init(&config); esp_err_t err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTP SHA256 Digest Auth Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "Error performing http request %s", esp_err_to_name(err)); } esp_http_client_cleanup(client); } #endif #if CONFIG_MBEDTLS_CERTIFICATE_BUNDLE static void https_with_url(void) { esp_http_client_config_t config = { .url = "https://www.howsmyssl.com", .event_handler = _http_event_handler, .crt_bundle_attach = esp_crt_bundle_attach, }; ESP_LOGI(TAG, "HTTPS request with url =>"); esp_http_client_handle_t client = esp_http_client_init(&config); esp_err_t err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTPS Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "Error perform http request %s", esp_err_to_name(err)); } esp_http_client_cleanup(client); } #endif // CONFIG_MBEDTLS_CERTIFICATE_BUNDLE static void https_with_hostname_path(void) { esp_http_client_config_t config = { .host = "www.howsmyssl.com", .path = "/", .transport_type = HTTP_TRANSPORT_OVER_SSL, .event_handler = _http_event_handler, .cert_pem = howsmyssl_com_root_cert_pem_start, }; ESP_LOGI(TAG, "HTTPS request with hostname and path =>"); esp_http_client_handle_t client = esp_http_client_init(&config); esp_err_t err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTPS Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "Error perform http request %s", esp_err_to_name(err)); } esp_http_client_cleanup(client); } static void http_encoded_query(void) { esp_http_client_config_t config = { .host = CONFIG_EXAMPLE_HTTP_ENDPOINT, .path = "/get", .event_handler = _http_event_handler, }; ESP_LOGI(TAG, "HTTP GET request with encoded query =>"); static const char query_val[] = "ABC xyz!012@#%&"; char query_val_enc[64] = {0}; uint32_t enc_len = example_uri_encode(query_val_enc, query_val, strlen(query_val)); if (enc_len > 0) { ESP_LOG_BUFFER_HEXDUMP(TAG, query_val_enc, enc_len, ESP_LOG_DEBUG); config.query = query_val_enc; } esp_http_client_handle_t client = esp_http_client_init(&config); esp_err_t err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTP GET Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "HTTP GET request failed: %s", esp_err_to_name(err)); } } static void http_relative_redirect(void) { esp_http_client_config_t config = { .url = "http://"CONFIG_EXAMPLE_HTTP_ENDPOINT"/relative-redirect/3", .event_handler = _http_event_handler, }; ESP_LOGI(TAG, "HTTP Relative path redirect request =>"); esp_http_client_handle_t client = esp_http_client_init(&config); esp_err_t err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTP Relative path redirect Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "Error perform http request %s", esp_err_to_name(err)); } esp_http_client_cleanup(client); } static void http_absolute_redirect(void) { esp_http_client_config_t config = { .url = "http://"CONFIG_EXAMPLE_HTTP_ENDPOINT"/absolute-redirect/3", .event_handler = _http_event_handler, }; ESP_LOGI(TAG, "HTTP Absolute path redirect request =>"); esp_http_client_handle_t client = esp_http_client_init(&config); esp_err_t err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTP Absolute path redirect Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "Error perform http request %s", esp_err_to_name(err)); } esp_http_client_cleanup(client); } static void http_absolute_redirect_manual(void) { esp_http_client_config_t config = { .url = "http://"CONFIG_EXAMPLE_HTTP_ENDPOINT"/absolute-redirect/3", .event_handler = _http_event_handler, .disable_auto_redirect = true, }; ESP_LOGI(TAG, "HTTP Absolute path redirect (manual) request =>"); esp_http_client_handle_t client = esp_http_client_init(&config); esp_err_t err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTP Absolute path redirect (manual) Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "Error perform http request %s", esp_err_to_name(err)); } esp_http_client_cleanup(client); } static void http_redirect_to_https(void) { esp_http_client_config_t config = { .url = "http://"CONFIG_EXAMPLE_HTTP_ENDPOINT"/redirect-to?url=https://www.howsmyssl.com", .event_handler = _http_event_handler, .cert_pem = howsmyssl_com_root_cert_pem_start, }; ESP_LOGI(TAG, "HTTP redirect to HTTPS request =>"); esp_http_client_handle_t client = esp_http_client_init(&config); esp_err_t err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTP redirect to HTTPS Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "Error perform http request %s", esp_err_to_name(err)); } esp_http_client_cleanup(client); } static void http_download_chunk(void) { esp_http_client_config_t config = { .url = "http://"CONFIG_EXAMPLE_HTTP_ENDPOINT"/stream-bytes/8912", .event_handler = _http_event_handler, }; ESP_LOGI(TAG, "HTTP chunk encoding request =>"); esp_http_client_handle_t client = esp_http_client_init(&config); esp_err_t err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTP chunk encoding Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "Error perform http request %s", esp_err_to_name(err)); } esp_http_client_cleanup(client); } static void http_perform_as_stream_reader(void) { char *buffer = malloc(MAX_HTTP_RECV_BUFFER + 1); if (buffer == NULL) { ESP_LOGE(TAG, "Cannot malloc http receive buffer"); return; } esp_http_client_config_t config = { .url = "http://"CONFIG_EXAMPLE_HTTP_ENDPOINT"/get", }; ESP_LOGI(TAG, "HTTP Stream reader request =>"); esp_http_client_handle_t client = esp_http_client_init(&config); esp_err_t err; if ((err = esp_http_client_open(client, 0)) != ESP_OK) { ESP_LOGE(TAG, "Failed to open HTTP connection: %s", esp_err_to_name(err)); free(buffer); return; } int content_length = esp_http_client_fetch_headers(client); int total_read_len = 0, read_len; if (total_read_len < content_length && content_length <= MAX_HTTP_RECV_BUFFER) { read_len = esp_http_client_read(client, buffer, content_length); if (read_len <= 0) { ESP_LOGE(TAG, "Error read data"); } buffer[read_len] = 0; ESP_LOGD(TAG, "read_len = %d", read_len); } ESP_LOGI(TAG, "HTTP Stream reader Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); esp_http_client_close(client); esp_http_client_cleanup(client); free(buffer); } static void https_async(void) { esp_http_client_config_t config = { .url = "https://postman-echo.com/post", .event_handler = _http_event_handler, .crt_bundle_attach = esp_crt_bundle_attach, .is_async = true, .timeout_ms = 5000, }; ESP_LOGI(TAG, "HTTPS async requests =>"); esp_http_client_handle_t client = esp_http_client_init(&config); esp_err_t err; const char *post_data = "Using a Palantír requires a person with great strength of will and wisdom. The Palantíri were meant to " "be used by the Dúnedain to communicate throughout the Realms in Exile. During the War of the Ring, " "the Palantíri were used by many individuals. Sauron used the Ithil-stone to take advantage of the users " "of the other two stones, the Orthanc-stone and Anor-stone, but was also susceptible to deception himself."; esp_http_client_set_method(client, HTTP_METHOD_POST); esp_http_client_set_post_field(client, post_data, strlen(post_data)); while (1) { err = esp_http_client_perform(client); if (err != ESP_ERR_HTTP_EAGAIN) { break; } } if (err == ESP_OK) { ESP_LOGI(TAG, "HTTPS Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "Error perform http request %s", esp_err_to_name(err)); } esp_http_client_cleanup(client); // Test HTTP_METHOD_HEAD with is_async enabled config.url = "https://"CONFIG_EXAMPLE_HTTP_ENDPOINT"/get"; config.event_handler = _http_event_handler; config.crt_bundle_attach = esp_crt_bundle_attach; config.is_async = true; config.timeout_ms = 5000; client = esp_http_client_init(&config); esp_http_client_set_method(client, HTTP_METHOD_HEAD); while (1) { err = esp_http_client_perform(client); if (err != ESP_ERR_HTTP_EAGAIN) { break; } } if (err == ESP_OK) { ESP_LOGI(TAG, "HTTPS Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "Error perform http request %s", esp_err_to_name(err)); } esp_http_client_cleanup(client); } static void https_with_invalid_url(void) { esp_http_client_config_t config = { .url = "https://not.existent.url", .event_handler = _http_event_handler, }; ESP_LOGI(TAG, "HTTPS request with invalid url =>"); esp_http_client_handle_t client = esp_http_client_init(&config); esp_err_t err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTPS Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "Error perform http request %s", esp_err_to_name(err)); } esp_http_client_cleanup(client); } /* * http_native_request() demonstrates use of low level APIs to connect to a server, * make a http request and read response. Event handler is not used in this case. * Note: This approach should only be used in case use of low level APIs is required. * The easiest way is to use esp_http_perform() */ static void http_native_request(void) { // Declare local_response_buffer with size (MAX_HTTP_OUTPUT_BUFFER + 1) to prevent out of bound access when // it is used by functions like strlen(). The buffer should only be used upto size MAX_HTTP_OUTPUT_BUFFER char output_buffer[MAX_HTTP_OUTPUT_BUFFER + 1] = {0}; // Buffer to store response of http request int content_length = 0; esp_http_client_config_t config = { .url = "http://"CONFIG_EXAMPLE_HTTP_ENDPOINT"/get", }; ESP_LOGI(TAG, "HTTP native request =>"); esp_http_client_handle_t client = esp_http_client_init(&config); // GET Request esp_http_client_set_method(client, HTTP_METHOD_GET); esp_err_t err = esp_http_client_open(client, 0); if (err != ESP_OK) { ESP_LOGE(TAG, "Failed to open HTTP connection: %s", esp_err_to_name(err)); } else { content_length = esp_http_client_fetch_headers(client); if (content_length < 0) { ESP_LOGE(TAG, "HTTP client fetch headers failed"); } else { int data_read = esp_http_client_read_response(client, output_buffer, MAX_HTTP_OUTPUT_BUFFER); if (data_read >= 0) { ESP_LOGI(TAG, "HTTP GET Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); ESP_LOG_BUFFER_HEX(TAG, output_buffer, data_read); } else { ESP_LOGE(TAG, "Failed to read response"); } } } esp_http_client_close(client); // POST Request const char *post_data = "{\"field1\":\"value1\"}"; esp_http_client_set_url(client, "http://"CONFIG_EXAMPLE_HTTP_ENDPOINT"/post"); esp_http_client_set_method(client, HTTP_METHOD_POST); esp_http_client_set_header(client, "Content-Type", "application/json"); err = esp_http_client_open(client, strlen(post_data)); if (err != ESP_OK) { ESP_LOGE(TAG, "Failed to open HTTP connection: %s", esp_err_to_name(err)); } else { int wlen = esp_http_client_write(client, post_data, strlen(post_data)); if (wlen < 0) { ESP_LOGE(TAG, "Write failed"); } content_length = esp_http_client_fetch_headers(client); if (content_length < 0) { ESP_LOGE(TAG, "HTTP client fetch headers failed"); } else { int data_read = esp_http_client_read_response(client, output_buffer, MAX_HTTP_OUTPUT_BUFFER); if (data_read >= 0) { ESP_LOGI(TAG, "HTTP POST Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); ESP_LOG_BUFFER_HEX(TAG, output_buffer, strlen(output_buffer)); } else { ESP_LOGE(TAG, "Failed to read response"); } } } esp_http_client_cleanup(client); } #if CONFIG_MBEDTLS_CERTIFICATE_BUNDLE static void http_partial_download(void) { esp_http_client_config_t config = { .url = "https://dl.espressif.com/dl/esp-idf/ci/esp_http_client_demo.txt", .event_handler = _http_event_handler, .crt_bundle_attach = esp_crt_bundle_attach, }; ESP_LOGI(TAG, "HTTP partial download =>"); esp_http_client_handle_t client = esp_http_client_init(&config); // Download a file excluding first 10 bytes esp_http_client_set_header(client, "Range", "bytes=10-"); esp_err_t err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTP Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "HTTP request failed: %s", esp_err_to_name(err)); } // Download last 10 bytes of a file esp_http_client_set_header(client, "Range", "bytes=-10"); err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTP Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "HTTP request failed: %s", esp_err_to_name(err)); } // Download 10 bytes from 11 to 20 esp_http_client_set_header(client, "Range", "bytes=11-20"); err = esp_http_client_perform(client); if (err == ESP_OK) { ESP_LOGI(TAG, "HTTP Status = %d, content_length = %"PRId64, esp_http_client_get_status_code(client), esp_http_client_get_content_length(client)); } else { ESP_LOGE(TAG, "HTTP request failed: %s", esp_err_to_name(err)); } esp_http_client_cleanup(client); } #endif // CONFIG_MBEDTLS_CERTIFICATE_BUNDLE static void http_test_task(void *pvParameters) { http_rest_with_url(); http_rest_with_hostname_path(); #if CONFIG_ESP_HTTP_CLIENT_ENABLE_BASIC_AUTH http_auth_basic(); http_auth_basic_redirect(); #endif #if CONFIG_ESP_HTTP_CLIENT_ENABLE_DIGEST_AUTH http_auth_digest_md5(); http_auth_digest_sha256(); #endif http_encoded_query(); http_relative_redirect(); http_absolute_redirect(); http_absolute_redirect_manual(); #if CONFIG_MBEDTLS_CERTIFICATE_BUNDLE https_with_url(); #endif https_with_hostname_path(); http_redirect_to_https(); http_download_chunk(); http_perform_as_stream_reader(); https_async(); https_with_invalid_url(); http_native_request(); #if CONFIG_MBEDTLS_CERTIFICATE_BUNDLE http_partial_download(); #endif ESP_LOGI(TAG, "Finish http example"); #if !CONFIG_IDF_TARGET_LINUX vTaskDelete(NULL); #endif } void app_main(void) { esp_err_t ret = nvs_flash_init(); if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { ESP_ERROR_CHECK(nvs_flash_erase()); ret = nvs_flash_init(); } ESP_ERROR_CHECK(ret); ESP_ERROR_CHECK(esp_netif_init()); ESP_ERROR_CHECK(esp_event_loop_create_default()); /* This helper function configures Wi-Fi or Ethernet, as selected in menuconfig. * Read "Establishing Wi-Fi or Ethernet Connection" section in * examples/protocols/README.md for more information about this function. */ ESP_ERROR_CHECK(example_connect()); ESP_LOGI(TAG, "Connected to AP, begin http example"); #if CONFIG_IDF_TARGET_LINUX http_test_task(NULL); #else xTaskCreate(&http_test_task, "http_test_task", 8192, NULL, 5, NULL); #endif }解析该代码
11-01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值