File: responses.py

package info (click to toggle)
python-moto 5.1.18-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 116,520 kB
  • sloc: python: 636,725; javascript: 181; makefile: 39; sh: 3
file content (66 lines) | stat: -rw-r--r-- 2,548 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import json
from typing import Any
from urllib.parse import unquote

from moto.core.responses import BaseResponse

from .models import IoTDataPlaneBackend, iotdata_backends


class IoTDataPlaneResponse(BaseResponse):
    def __init__(self) -> None:
        super().__init__(service_name="iot-data")

    def setup_class(
        self, request: Any, full_url: str, headers: Any, use_raw_body: bool = False
    ) -> None:
        super().setup_class(request, full_url, headers, use_raw_body=True)

    def _get_action(self) -> str:
        if self.path and self.path.startswith("/topics/"):
            # Special usecase - there is no way identify this action, besides the URL
            return "publish"
        return super()._get_action()

    @property
    def iotdata_backend(self) -> IoTDataPlaneBackend:
        return iotdata_backends[self.current_account][self.region]

    def update_thing_shadow(self) -> str:
        thing_name = self._get_param("thingName")
        shadow_name = self.querystring.get("name", [None])[0]
        payload = self.iotdata_backend.update_thing_shadow(
            thing_name=thing_name,
            payload=self.body,
            shadow_name=shadow_name,
        )
        return json.dumps(payload.to_response_dict())

    def get_thing_shadow(self) -> str:
        thing_name = self._get_param("thingName")
        shadow_name = self.querystring.get("name", [None])[0]
        payload = self.iotdata_backend.get_thing_shadow(
            thing_name=thing_name, shadow_name=shadow_name
        )
        return json.dumps(payload.to_dict())

    def delete_thing_shadow(self) -> str:
        thing_name = self._get_param("thingName")
        shadow_name = self.querystring.get("name", [None])[0]
        payload = self.iotdata_backend.delete_thing_shadow(
            thing_name=thing_name, shadow_name=shadow_name
        )
        return json.dumps(payload.to_dict())

    def publish(self) -> str:
        topic = self.path.split("/topics/")[-1]
        # a uri parameter containing forward slashes is not correctly url encoded when we're running in server mode.
        # https://github.com/pallets/flask/issues/900
        topic = unquote(topic) if "%" in topic else topic
        self.iotdata_backend.publish(topic=topic, payload=self.body)
        return json.dumps({})

    def list_named_shadows_for_thing(self) -> str:
        thing_name = self._get_param("thingName")
        shadows = self.iotdata_backend.list_named_shadows_for_thing(thing_name)
        return json.dumps({"results": shadows})