Coverage for src / bluetooth_sig / gatt / characteristics / http_status_code.py: 100%

25 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-04-03 16:41 +0000

1"""HTTP Status Code characteristic (0x2AB8).""" 

2 

3from __future__ import annotations 

4 

5from enum import IntFlag 

6 

7import msgspec 

8 

9from ..context import CharacteristicContext 

10from .base import BaseCharacteristic 

11from .utils import DataParser 

12 

13 

14class HTTPDataStatus(IntFlag): 

15 """HTTP data status flags.""" 

16 

17 HEADERS_RECEIVED = 0x01 

18 HEADERS_TRUNCATED = 0x02 

19 BODY_RECEIVED = 0x04 

20 BODY_TRUNCATED = 0x08 

21 

22 

23class HTTPStatusCodeData(msgspec.Struct, frozen=True, kw_only=True): 

24 """Parsed data from HTTP Status Code characteristic.""" 

25 

26 status_code: int 

27 data_status: HTTPDataStatus 

28 

29 

30class HTTPStatusCodeCharacteristic(BaseCharacteristic[HTTPStatusCodeData]): 

31 """HTTP Status Code characteristic (0x2AB8). 

32 

33 org.bluetooth.characteristic.http_status_code 

34 

35 Reports the HTTP status code and data status of the last HTTP operation. 

36 """ 

37 

38 expected_length: int = 3 

39 

40 def _decode_value( 

41 self, data: bytearray, ctx: CharacteristicContext | None = None, *, validate: bool = True 

42 ) -> HTTPStatusCodeData: 

43 status_code = DataParser.parse_int16(data, 0, signed=False) 

44 data_status = HTTPDataStatus(DataParser.parse_int8(data, 2, signed=False)) 

45 

46 return HTTPStatusCodeData( 

47 status_code=status_code, 

48 data_status=data_status, 

49 ) 

50 

51 def _encode_value(self, data: HTTPStatusCodeData) -> bytearray: 

52 result = bytearray() 

53 result.extend(DataParser.encode_int16(data.status_code, signed=False)) 

54 result.extend(DataParser.encode_int8(int(data.data_status), signed=False)) 

55 return result