forked from core-api/python-client
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path__init__.py
More file actions
101 lines (80 loc) · 3.03 KB
/
Copy path__init__.py
File metadata and controls
101 lines (80 loc) · 3.03 KB
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# coding: utf-8
from coreapi.codecs.base import BaseCodec
from coreapi.codecs.corehtml import CoreHTMLCodec
from coreapi.codecs.corejson import CoreJSONCodec
from coreapi.codecs.coretext import CoreTextCodec
from coreapi.codecs.hal import HALCodec
from coreapi.codecs.hyperschema import HyperschemaCodec
from coreapi.codecs.jsondata import JSONCodec
from coreapi.codecs.plaintext import PlainTextCodec
from coreapi.codecs.python import PythonCodec
from coreapi.exceptions import NotAcceptable, UnsupportedContentType
import itypes
__all__ = [
'BaseCodec', 'CoreHTMLCodec', 'CoreJSONCodec', 'CoreTextCodec', 'HALCodec',
'HyperschemaCodec', 'JSONCodec', 'PlainTextCodec', 'PythonCodec',
]
# Default set of decoders for clients to accept.
default_decoders = itypes.List([
CoreJSONCodec(), HALCodec(), HyperschemaCodec(), # Document decoders.
JSONCodec(), PlainTextCodec() # Data decoders.
])
# Default set of encoders for servers to respond with.
default_encoders = itypes.List([
CoreJSONCodec(), HALCodec(), CoreHTMLCodec()
])
def negotiate_decoder(content_type=None, decoders=None):
"""
Given the value of a 'Content-Type' header, return the appropriate
codec registered to decode the request content.
"""
if decoders is None:
decoders = default_decoders
if content_type is None:
return decoders[0]
content_type = content_type.split(';')[0].strip().lower()
for codec in decoders:
if codec.media_type == content_type:
break
else:
msg = "Unsupported media in Content-Type header '%s'" % content_type
raise UnsupportedContentType(msg)
return codec
def negotiate_encoder(accept=None, encoders=None):
"""
Given the value of a 'Accept' header, return a two tuple of the appropriate
content type and codec registered to encode the response content.
"""
if encoders is None:
encoders = default_encoders
if accept is None:
return encoders[0]
acceptable = set([
item.split(';')[0].strip().lower()
for item in accept.split(',')
])
for codec in encoders:
if codec.media_type in acceptable:
return codec
for codec in encoders:
if codec.media_type.split('/')[0] + '/*' in acceptable:
return codec
if '*/*' in acceptable:
return encoders[0]
msg = "Unsupported media in Accept header '%s'" % accept
raise NotAcceptable(msg)
def load(bytestring, content_type=None, base_url=None, decoders=None):
"""
Given a bytestring and an optional content_type, return the
parsed Document.
"""
codec = negotiate_decoder(content_type, decoders=decoders)
return codec.load(bytestring, base_url=base_url)
def dump(document, accept=None, encoders=None, **kwargs):
"""
Given a document, and an optional accept header, return a two-tuple of
the selected media type and encoded bytestring.
"""
codec = negotiate_encoder(accept, encoders=encoders)
content = codec.dump(document, **kwargs)
return (codec.media_type, content)