CloudKit1. +1
+1
+1
+1
+1 +1
+1
+1 +1 +1
+1
+1
+1
+1 +1
+1 +1
+1
+1
+1
+1 +1
+1 +1
1
4. Engine Yard Solo
“The platform for
on-demand management of your
Ruby on Rails application
in the cloud.”
19. framework = {
:orm => AR
:dispatcher => AD}.merge(
:orm => YourORM)
20. framework = {
:orm => AR
:dispatcher => AD}.merge(
:orm => YourORM)
21. framework = {
:orm => AR
:dispatcher => AD}.merge(
:orm => YourORM)
32. ESI
Caching Layer
REST
Fragment A Service
Client
REST
Fragment B
Service
60. $ curl -i http://localhost:9292/cloudkit-meta
61. $ curl -i http://localhost:9292/cloudkit-meta
HTTP/1.1 200 OK
ETag: quot;5b6f484abf2d95cec3ea8867d1754418quot;
Cache-Control: proxy-revalidate
Content-Type: application/json
Content-Length: 33
{quot;urisquot;:[quot;/todosquot;,quot;/profilesquot;]}
62. $ curl -i -XOPTIONS http://localhost:9292/todos
63. $ curl -i -XOPTIONS http://localhost:9292/todos
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 0
Allow: GET, HEAD, POST, OPTIONS
65. $ curl -i http://localhost:9292/todos
HTTP/1.1 200 OK
ETag: quot;df392c5664e6ecd64b83210fb925f6c8quot;
Link: <http://localhost:9292/todos/_resolved>;
rel=quot;http://joncrosby.me/cloudkit/1.0/rel/resolvedquot;
Cache-Control: proxy-revalidate
Content-Type: application/json
Content-Length: 32
{quot;urisquot;:[],quot;totalquot;:0,quot;offsetquot;:0}
66. $ curl -i http://localhost:9292/todos
HTTP/1.1 200 OK
ETag: quot;df392c5664e6ecd64b83210fb925f6c8quot;
Link: <http://localhost:9292/todos/_resolved>;
rel=quot;http://joncrosby.me/cloudkit/1.0/rel/resolvedquot;
Cache-Control: proxy-revalidate
Content-Type: application/json
Content-Length: 32
{quot;urisquot;:[],quot;totalquot;:0,quot;offsetquot;:0}
67. $ curl -i http://localhost:9292/todos
HTTP/1.1 200 OK
ETag: quot;df392c5664e6ecd64b83210fb925f6c8quot;
Link: <http://localhost:9292/todos/_resolved>;
rel=quot;http://joncrosby.me/cloudkit/1.0/rel/resolvedquot;
Cache-Control: proxy-revalidate
Content-Type: application/json
Content-Length: 32
{quot;urisquot;:[],quot;totalquot;:0,quot;offsetquot;:0}
68. $ curl -i http://localhost:9292/todos
HTTP/1.1 200 OK
ETag: quot;df392c5664e6ecd64b83210fb925f6c8quot;
Link: <http://localhost:9292/todos/_resolved>;
rel=quot;http://joncrosby.me/cloudkit/1.0/rel/resolvedquot;
Cache-Control: proxy-revalidate
Content-Type: application/json
Content-Length: 32
{quot;urisquot;:[],quot;totalquot;:0,quot;offsetquot;:0}
69. Link Relations and HTTP Header Linking
IETF Draft by Mark Nottingham
http://tools.ietf.org/html/draft-nottingham-http-link-header-04
70. Hypermedia
as the
Engine of Application State
-- Fielding
72. $ curl -i -XPOST -d'{quot;titlequot;:quot;fooquot;}'
http://localhost:9292/todos
73. $ curl -i -XPOST -d'{quot;titlequot;:quot;fooquot;}'
http://localhost:9292/todos
HTTP/1.1 201 Created
Cache-Control: no-cache
Content-Type: application/json
Content-Length: 159
{
quot;okquot;:true,
quot;uriquot;:quot;/todos/9216df80-0c7b-012c-af2e-0023dfa0a208quot;,
quot;etagquot;:quot;9216dde0-0c7b-012c-af2e-0023dfa0a208quot;,
quot;last_modifiedquot;:quot;Thu, 16 Apr 2009 06:13:04 GMTquot;
}
82. todos[“random_id”] = {
“uri” => “/todos/abc”,
“etag” => “9216dde0-0c7b-012c”,
“last_modified” => “Thu, 16 Apr 2009 06:13:04 GMT”,
“remote_user” => “http://joncrosby.me”,
“json” => “{”title”:”foo”}”,
...
}
87. $ curl -i -XPUT -d'{quot;titlequot;:quot;barquot;}'
http://localhost:9292/todos/abc
88. $ curl -i -XPUT -d'{quot;titlequot;:quot;barquot;}'
http://localhost:9292/todos/abc
HTTP/1.1 201 Created
Cache-Control: no-cache
Content-Type: application/json
Content-Length: 126
{
quot;okquot;:true,
quot;uriquot;:quot;/todos/abcquot;,
quot;etagquot;:quot;f4538ca0-0c7b-012c-af2e-0023dfa0a208quot;,
quot;last_modifiedquot;:quot;Thu, 16 Apr 2009 06:15:49 GMTquot;
}
89. $ curl -i -XOPTIONS http://localhost:9292/todos/abc
90. $ curl -i -XOPTIONS http://localhost:9292/todos/abc
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 0
Allow: GET, HEAD, PUT, DELETE, OPTIONS
91. $ curl -i http://localhost:9292/todos/abc
92. $ curl -i http://localhost:9292/todos/abc
HTTP/1.1 200 OK
Last-Modified: Thu, 16 Apr 2009 06:15:49 GMT
ETag: quot;f4538ca0-0c7b-012c-af2e-0023dfa0a208quot;
Link: <http://localhost:9292/todos/abc/versions>;
rel=quot;http://joncrosby.me/cloudkit/1.0/rel/versionsquot;
Cache-Control: proxy-revalidate
Content-Type: application/json
Content-Length: 15
{quot;titlequot;:quot;barquot;}
93. $ curl -i http://localhost:9292/todos/abc
HTTP/1.1 200 OK
Last-Modified: Thu, 16 Apr 2009 06:15:49 GMT
ETag: quot;f4538ca0-0c7b-012c-af2e-0023dfa0a208quot;
Link: <http://localhost:9292/todos/abc/versions>;
rel=quot;http://joncrosby.me/cloudkit/1.0/rel/versionsquot;
Cache-Control: proxy-revalidate
Content-Type: application/json
Content-Length: 15
{quot;titlequot;:quot;barquot;}
94. $ curl -i http://localhost:9292/todos/abc
HTTP/1.1 200 OK
Last-Modified: Thu, 16 Apr 2009 06:15:49 GMT
ETag: quot;f4538ca0-0c7b-012c-af2e-0023dfa0a208quot;
Link: <http://localhost:9292/todos/abc/versions>;
rel=quot;http://joncrosby.me/cloudkit/1.0/rel/versionsquot;
Cache-Control: proxy-revalidate
Content-Type: application/json
Content-Length: 15
{quot;titlequot;:quot;barquot;}
95. $ curl -i http://localhost:9292/todos/abc
HTTP/1.1 200 OK
Last-Modified: Thu, 16 Apr 2009 06:15:49 GMT
ETag: quot;f4538ca0-0c7b-012c-af2e-0023dfa0a208quot;
Link: <http://localhost:9292/todos/abc/versions>;
rel=quot;http://joncrosby.me/cloudkit/1.0/rel/versionsquot;
Cache-Control: proxy-revalidate
Content-Type: application/json
Content-Length: 15
{quot;titlequot;:quot;barquot;}
103. $ curl -i http://localhost:9292/todos
HTTP/1.1 200 OK
Last-Modified: Thu, 16 Apr 2009 06:15:49 GMT
ETag: quot;0aca58964aa2e15a9365d72dd4c43472quot;
Link: <http://localhost:9292/todos/_resolved>;
rel=quot;http://joncrosby.me/cloudkit/1.0/rel/resolvedquot;
Cache-Control: proxy-revalidate
Content-Type: application/json
Content-Length: 94
{
quot;urisquot;:[
quot;/todos/abcquot;,
quot;/todos/9216df80-0c7b-012c-af2e-0023dfa0a208quot;
],
quot;totalquot;:2,
quot;offsetquot;:0
}
111. $ curl -i -XPUT -d'{quot;titlequot;:quot;bazquot;}'
http://localhost:9292/todos/abc
112. $ curl -i -XPUT -d'{quot;titlequot;:quot;bazquot;}'
http://localhost:9292/todos/abc
HTTP/1.1 400 Bad Request
Cache-Control: no-cache
Content-Type: application/json
Content-Length: 25
{quot;errorquot;:quot;etag requiredquot;}
113. $ curl -i -XPUT
-H'If-Match:f4538ca0-0c7b-012c-af2e-0023dfa0a208'
-d'{quot;titlequot;:quot;bazquot;}'
http://localhost:9292/todos/abc
114. $ curl -i -XPUT
-H'If-Match:f4538ca0-0c7b-012c-af2e-0023dfa0a208'
-d'{quot;titlequot;:quot;bazquot;}'
http://localhost:9292/todos/abc
HTTP/1.1 200 OK
Cache-Control: no-cache
Content-Type: application/json
Content-Length: 126
{
quot;okquot;:true,
quot;uriquot;:quot;/todos/abcquot;,
quot;etagquot;:quot;55286040-0c7d-012c-af2e-0023dfa0a208quot;,
quot;last_modifiedquot;:quot;Thu, 16 Apr 2009 06:25:41 GMTquot;
}
115. $ curl -i -XPUT
-H'If-Match:f4538ca0-0c7b-012c-af2e-0023dfa0a208'
-d'{quot;titlequot;:quot;boxquot;}'
http://localhost:9292/todos/abc
116. $ curl -i -XPUT
-H'If-Match:f4538ca0-0c7b-012c-af2e-0023dfa0a208'
-d'{quot;titlequot;:quot;boxquot;}'
http://localhost:9292/todos/abc
HTTP/1.1 412 Precondition Failed
Cache-Control: no-cache
Content-Type: application/json
Content-Length: 31
{quot;errorquot;:quot;precondition failedquot;}
117. $ curl -i http://localhost:9292/todos/abc/versions
118. $ curl -i http://localhost:9292/todos/abc/versions
HTTP/1.1 200 OK
Last-Modified: Thu, 16 Apr 2009 06:25:41 GMT
ETag: quot;f7aae4894429a39c7c3fe0c8ea9aa00equot;
Link: <http://localhost:9292/todos/abc/versions/_resolved>;
rel=quot;http://joncrosby.me/cloudkit/1.0/rel/resolvedquot;
Cache-Control: proxy-revalidate
Content-Type: application/json
Content-Length: 109
{
quot;urisquot;:[
quot;/todos/abcquot;,
quot;/todos/abc/versions/f4538ca0-0c7b-012caf2e-0023dfa0a208quot;
],
quot;totalquot;:2,
quot;offsetquot;:0
}
119. $ curl -i http://localhost:9292/todos/abc/versions
HTTP/1.1 200 OK
Last-Modified: Thu, 16 Apr 2009 06:25:41 GMT
ETag: quot;f7aae4894429a39c7c3fe0c8ea9aa00equot;
Link: <http://localhost:9292/todos/abc/versions/_resolved>;
rel=quot;http://joncrosby.me/cloudkit/1.0/rel/resolvedquot;
Cache-Control: proxy-revalidate
Content-Type: application/json
Content-Length: 109
{
quot;urisquot;:[
quot;/todos/abcquot;,
quot;/todos/abc/versions/f4538ca0-0c7b-012caf2e-0023dfa0a208quot;
],
quot;totalquot;:2,
quot;offsetquot;:0
}
125. $ curl -i http://localhost:9292/todos/abc/versions/_resolved
126. $ curl -i http://localhost:9292/todos/abc/versions/_resolved
HTTP/1.1 200 OK
Last-Modified: Thu, 16 Apr 2009 06:25:41 GMT
ETag: quot;ea2238f8f2da37b70f3d2f09464f166equot;
Link: <http://localhost:9292/todos/abc/versions>; rel=quot;indexquot;
Cache-Control: proxy-revalidate
Content-Type: application/json
Content-Length: 384
{
quot;documentsquot;:[
{
quot;etagquot;:quot;55286040-0c7d-012c-af2e-0023dfa0a208quot;,
quot;uriquot;:quot;/todos/abcquot;,
quot;last_modifiedquot;:quot;Thu, 16 Apr 2009 06:25:41 GMTquot;,
quot;documentquot;:quot;{quot;titlequot;:quot;bazquot;}quot;
},
{
quot;etagquot;:quot;f4538ca0-0c7b-012c-af2e-0023dfa0a208quot;,
quot;uriquot;:quot;/todos/abc/versions/f4538ca0-0c7b-012c-af2e-0023dfa0a208quot;,
quot;last_modifiedquot;:quot;Thu, 16 Apr 2009 06:15:49 GMTquot;,
quot;documentquot;:quot;{quot;titlequot;:quot;barquot;}quot;
}
],
quot;totalquot;:2,
quot;offsetquot;:0
}
127. $ curl -i http://localhost:9292/todos/abc/versions/_resolved
HTTP/1.1 200 OK
Last-Modified: Thu, 16 Apr 2009 06:25:41 GMT
ETag: quot;ea2238f8f2da37b70f3d2f09464f166equot;
Link: <http://localhost:9292/todos/abc/versions>; rel=quot;indexquot;
Cache-Control: proxy-revalidate
Content-Type: application/json
Content-Length: 384
{
quot;documentsquot;:[
{
quot;etagquot;:quot;55286040-0c7d-012c-af2e-0023dfa0a208quot;,
quot;uriquot;:quot;/todos/abcquot;,
quot;last_modifiedquot;:quot;Thu, 16 Apr 2009 06:25:41 GMTquot;,
quot;documentquot;:quot;{quot;titlequot;:quot;bazquot;}quot;
},
{
quot;etagquot;:quot;f4538ca0-0c7b-012c-af2e-0023dfa0a208quot;,
quot;uriquot;:quot;/todos/abc/versions/f4538ca0-0c7b-012c-af2e-0023dfa0a208quot;,
quot;last_modifiedquot;:quot;Thu, 16 Apr 2009 06:15:49 GMTquot;,
quot;documentquot;:quot;{quot;titlequot;:quot;barquot;}quot;
}
],
quot;totalquot;:2,
quot;offsetquot;:0
}
128. $ curl -i http://localhost:9292/todos/_resolved
129. $ curl -i http://localhost:9292/todos/_resolved
HTTP/1.1 200 OK
Last-Modified: Thu, 16 Apr 2009 06:25:41 GMT
ETag: quot;59edaebe03b5fe90fa59ef6de633afcequot;
Link: <http://localhost:9292/todos>; rel=quot;indexquot;
Cache-Control: proxy-revalidate
Content-Type: application/json
Content-Length: 369
{
quot;documentsquot;:[
{
quot;etagquot;:quot;55286040-0c7d-012c-af2e-0023dfa0a208quot;,
quot;uriquot;:quot;/todos/abcquot;,
quot;last_modifiedquot;:quot;Thu, 16 Apr 2009 06:25:41 GMTquot;,
quot;documentquot;:quot;{quot;titlequot;:quot;bazquot;}quot;
},
{
quot;etagquot;:quot;9216dde0-0c7b-012c-af2e-0023dfa0a208quot;,
quot;uriquot;:quot;/todos/9216df80-0c7b-012c-af2e-0023dfa0a208quot;,
quot;last_modifiedquot;:quot;Thu, 16 Apr 2009 06:13:04 GMTquot;,
quot;documentquot;:quot;{quot;titlequot;:quot;fooquot;}quot;
}
],
quot;totalquot;:2,
quot;offsetquot;:0
}
130. $ curl -i -XDELETE
-H'If-Match:55286040-0c7d-012c-af2e-0023dfa0a208'
http://localhost:9292/todos/abc
131. $ curl -i -XDELETE
-H'If-Match:55286040-0c7d-012c-af2e-0023dfa0a208'
http://localhost:9292/todos/abc
HTTP/1.1 200 OK
Cache-Control: no-cache
Content-Type: application/json
Content-Length: 92
{
quot;okquot;:true,
quot;uriquot;:quot;/todos/abc/versions/55286040-0c7d-012c-af2e-0023dfa0a208quot;,
quot;etagquot;: quot;55286040-0c7d-012c-af2e-0023dfa0a208quot;,
quot;last_modifiedquot;:quot;Thu, 16 Apr 2009 06:33:50 GMTquot;
}
132. $ curl -i -XDELETE
-H'If-Match:55286040-0c7d-012c-af2e-0023dfa0a208'
http://localhost:9292/todos/abc
HTTP/1.1 200 OK
Cache-Control: no-cache
Content-Type: application/json
Content-Length: 92
{
quot;okquot;:true,
quot;uriquot;:quot;/todos/abc/versions/55286040-0c7d-012c-af2e-0023dfa0a208quot;,
quot;etagquot;: quot;55286040-0c7d-012c-af2e-0023dfa0a208quot;,
quot;last_modifiedquot;:quot;Thu, 16 Apr 2009 06:33:50 GMTquot;
}
133. $ curl -i http://localhost:9292/todos/abc
134. $ curl -i http://localhost:9292/todos/abc
HTTP/1.1 410 Gone
Link: <http://localhost:9292/todos/abc/versions>;
rel=quot;http://joncrosby.me/cloudkit/1.0/rel/versionsquot;
Cache-Control: no-cache
Content-Type: application/json
Content-Length: 37
{quot;errorquot;:quot;entity previously deletedquot;}
135. $ curl -i http://localhost:9292/todos/abc/versions
136. $ curl -i http://localhost:9292/todos/abc/versions
HTTP/1.1 200 OK
Last-Modified: Thu, 16 Apr 2009 06:25:41 GMT
ETag: quot;22116ccbc80e6356aec956be63c9c440quot;
Link: <http://localhost:9292/todos/abc/versions/_resolved>;
rel=quot;http://joncrosby.me/cloudkit/1.0/rel/resolvedquot;
Cache-Control: proxy-revalidate
Content-Type: application/json
Content-Length: 157
{
quot;urisquot;:[
quot;/todos/abc/versions/55286040-0c7d-012c-af2e-0023dfa0a208quot;,
quot;/todos/abc/versions/f4538ca0-0c7b-012c-af2e-0023dfa0a208quot;
],
quot;totalquot;:2,
quot;offsetquot;:0
}
149. JSONQuery
Kris Zyp
http://www.sitepen.com/blog/2008/07/16/jsonquery-data-querying-beyond-jsonpath/
162. var store = $.cloudkit;
store.boot({
success: function() {
// do something
},
error: function(status) {
// fail gracefully
}
});
163. var store = $.cloudkit;
store.boot({
success: function() {
// do something
},
error: function(status) {
// fail gracefully
}
});
164. var store = $.cloudkit;
store.boot({
success: function() {
// do something
},
error: function(status) {
// fail gracefully
}
});
168. var store = $.cloudkit;
store.boot({
success: function() {
// do something
},
error: function(status) {
// fail gracefully
}
});
169. var store = $.cloudkit;
store.boot({
success: function() {
// do something
},
error: function(status) {
// fail gracefully
}
});
170. // insert a 'todo'
store.collection('todos').create({name:quot;fooquot;}, {
success: function(todo) {
// do something with the todo
alert(todo.json().name);
}
});
171. // insert a 'todo'
store.collection('todos').create({name:quot;fooquot;}, {
success: function(todo) {
// do something with the todo
alert(todo.json().name);
}
});
172. // insert a 'todo'
store.collection('todos').create({name:quot;fooquot;}, {
success: function(todo) {
// do something with the todo
alert(todo.json().name);
}
});
173. // insert a 'todo'
store.collection('todos').create({name:quot;fooquot;}, {
success: function(todo) {
// do something with the todo
alert(todo.json().name);
}
});
174. // insert a 'todo'
store.collection('todos').create({name:quot;fooquot;}, {
success: function(todo) {
// do something with the todo
alert(todo.json().name);
}
});
175. // update the 'todo'
todo.update({name:quot;barquot;} {
success: function() {
// updated remotely, ready for use
alert(todo.json().name); // now “bar”
},
error: function(status) {
// fail gracefully or recover
}
});
176. // update the 'todo'
todo.update({name:quot;barquot;} {
success: function() {
// updated remotely, ready for use
alert(todo.json().name); // now “bar”
},
error: function(status) {
// fail gracefully or recover
}
});
177. // update the 'todo'
todo.update({name:quot;barquot;} {
success: function() {
// updated remotely, ready for use
alert(todo.json().name); // now “bar”
},
error: function(status) {
// fail gracefully or recover
}
});
178. // update the 'todo'
todo.update({name:quot;barquot;} {
success: function() {
// updated remotely, ready for use
alert(todo.json().name); // now “bar”
},
error: function(status) {
// fail gracefully or recover
}
});
179. // update the 'todo'
todo.update({name:quot;barquot;} {
success: function() {
// updated remotely, ready for use
alert(todo.json().name); // now “bar”
},
error: function(status) {
// fail gracefully or recover
}
});
183. // delete the 'todo'
todo.destroy({
success: function() {
// the 'todo' has now been deleted
}
});
184. // delete the 'todo'
todo.destroy({
success: function() {
// the 'todo' has now been deleted
}
});
185. // delete the 'todo'
todo.destroy({
success: function() {
// the 'todo' has now been deleted
}
});
186. // delete the 'todo'
todo.destroy({
success: function() {
// the 'todo' has now been deleted
}
});
189. Johnson
Ruby/JavaScript Bridge
http://github.com/jbarnette/johnson
191. JSONSchema
/:collection/_schema
http://www.json.com/json-schema-proposal/
192. {
quot;descriptionquot;:quot;A personquot;,
quot;typequot;:quot;objectquot;,
quot;propertiesquot;: {
quot;namequot;: {
quot;typequot;:quot;stringquot;
},
quot;agequot;: {
quot;typequot;:quot;integerquot;,
quot;maximumquot;:125
}
}
}
197. OpenID
+
OAuth
+
OAuth/Discovery
200. Browser
{...}
OAuth OpenID Service
212. curl -i http://localhost:9292/todos
HTTP/1.1 401 Unauthorized
Connection: close
Date: Thu, 15 Jan 2009 22:24:23 GMT
WWW-Authenticate: OAuth realm=quot;http://localhost:9292quot;
Link: <http://localhost:9292/oauth/meta>;
rel=quot;http://oauth.net/discovery/1.0/rel/providerquot;
Content-Type: text/html
Set-Cookie: rack.session=d6b1c6aa6d463a478eb9af0e921eb997;
path=/; HttpOnly
Content-Length: 1280
<!DOCTYPE html PUBLIC quot;-//W3C//DTD XHTML 1.0 Transitional//ENquot;
quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtdquot;>
<html xmlns=quot;http://www.w3.org/1999/xhtmlquot; xml:lang=quot;enquot; lang=quot;enquot;>
... etc ...
213. $ curl -i http://localhost:9292/oauth/meta
214. $ curl -i http://localhost:9292/oauth/meta
<?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?>
<XRD>
<Type>http://oauth.net/discovery/1.0</Type>
<Service>
<Type>http://oauth.net/discovery/1.0/rel/provider</Type>
<URI>http://localhost:9292/oauth</URI>
</Service>
</XRD>
217. <?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?>
<XRDS xmlns=quot;xri://$xrdsquot;>
<XRD xml:id=quot;oauthquot; xmlns:simple=quot;http://xrds-simple.net/core/1.0quot; xmlns=quot;xri://$XRD*($v*2.0)quot; version=quot;2.0quot;>
<Type>xri://$xrds*simple</Type>
<Expires>2009-02-14T22:27:50Z</Expires>
<Service priority=quot;10quot;>
<Type>http://oauth.net/core/1.0/endpoint/request</Type>
<Type>http://oauth.net/core/1.0/parameters/auth-header</Type>
<Type>http://oauth.net/core/1.0/parameters/uri-query</Type>
<Type>http://oauth.net/core/1.0/signature/PLAINTEXT</Type>
<URI>http://localhost:9292/oauth/request_tokens</URI>
</Service>
<Service priority=quot;10quot;>
<Type>http://oauth.net/core/1.0/endpoint/authorize</Type>
<Type>http://oauth.net/core/1.0/parameters/uri-query</Type>
<URI>http://localhost:9292/oauth/authorization</URI>
</Service>
<Service priority=quot;10quot;>
<Type>http://oauth.net/core/1.0/endpoint/access</Type>
<Type>http://oauth.net/core/1.0/parameters/auth-header</Type>
<Type>http://oauth.net/core/1.0/parameters/uri-query</Type>
<Type>http://oauth.net/core/1.0/signature/PLAINTEXT</Type>
<URI>http://localhost:9292/oauth/access_tokens</URI>
</Service>
<Service priority=quot;10quot;>
<Type>http://oauth.net/core/1.0/endpoint/resource</Type>
<Type>http://oauth.net/core/1.0/parameters/auth-header</Type>
<Type>http://oauth.net/core/1.0/parameters/uri-query</Type>
<Type>http://oauth.net/core/1.0/signature/HMAC-SHA1</Type>
</Service>
<Service priority=quot;10quot;>
<Type>http://oauth.net/discovery/1.0/consumer-identity/static</Type>
<LocalID>cloudkitconsumer</LocalID>
</Service>
</XRD>
<XRD xmlns=quot;xri://$XRD*($v*2.0)quot; version=quot;2.0quot;>
<Type>xri://$xrds*simple</Type>
<Service priority=quot;10quot;>
<Type>http://oauth.net/discovery/1.0</Type>
<URI>#oauth</URI>
</Service>
</XRD>
</XRDS>