Show More
@@ -187,6 +187,19 b' exchange takes place. This provides a be' | |||
|
187 | 187 | Requests to unknown commands or URLS result in an HTTP 404. |
|
188 | 188 | TODO formally define response type, how error is communicated, etc. |
|
189 | 189 | |
|
190 | HTTP request and response bodies use the *TBD Protocol* for media exchange. | |
|
191 | ||
|
192 | Clients and servers MUST advertise the ``TBD`` media type via the | |
|
193 | ``Content-Type`` request and response headers. In addition, clients MUST | |
|
194 | advertise this media type value in their ``Accept`` request header in all | |
|
195 | requests. | |
|
196 | ||
|
197 | Servers receiving requests without an ``Accept`` header SHOULD respond with | |
|
198 | an HTTP 406. | |
|
199 | ||
|
200 | Servers receiving requests with an invalid ``Content-Type`` header SHOULD | |
|
201 | respond with an HTTP 415. | |
|
202 | ||
|
190 | 203 | SSH Protocol |
|
191 | 204 | ============ |
|
192 | 205 |
@@ -32,6 +32,7 b' HTTP_OK = 200' | |||
|
32 | 32 | HGTYPE = 'application/mercurial-0.1' |
|
33 | 33 | HGTYPE2 = 'application/mercurial-0.2' |
|
34 | 34 | HGERRTYPE = 'application/hg-error' |
|
35 | HTTPV2TYPE = 'application/mercurial-tbd' | |
|
35 | 36 | |
|
36 | 37 | HTTPV2 = wireprototypes.HTTPV2 |
|
37 | 38 | SSHV1 = wireprototypes.SSHV1 |
@@ -335,6 +336,23 b' def _handlehttpv2request(rctx, req, res,' | |||
|
335 | 336 | res.setbodybytes(_('invalid wire protocol command: %s') % command) |
|
336 | 337 | return |
|
337 | 338 | |
|
339 | if req.headers.get(b'Accept') != HTTPV2TYPE: | |
|
340 | res.status = b'406 Not Acceptable' | |
|
341 | res.headers[b'Content-Type'] = b'text/plain' | |
|
342 | res.setbodybytes(_('client MUST specify Accept header with value: %s\n') | |
|
343 | % HTTPV2TYPE) | |
|
344 | return | |
|
345 | ||
|
346 | if (b'Content-Type' in req.headers | |
|
347 | and req.headers[b'Content-Type'] != HTTPV2TYPE): | |
|
348 | res.status = b'415 Unsupported Media Type' | |
|
349 | # TODO we should send a response with appropriate media type, | |
|
350 | # since client does Accept it. | |
|
351 | res.headers[b'Content-Type'] = b'text/plain' | |
|
352 | res.setbodybytes(_('client MUST send Content-Type header with ' | |
|
353 | 'value: %s\n') % HTTPV2TYPE) | |
|
354 | return | |
|
355 | ||
|
338 | 356 | # We don't do anything meaningful yet. |
|
339 | 357 | res.status = b'200 OK' |
|
340 | 358 | res.headers[b'Content-Type'] = b'text/plain' |
@@ -1,4 +1,5 b'' | |||
|
1 | 1 | $ HTTPV2=exp-http-v2-0001 |
|
2 | $ MEDIATYPE=application/mercurial-tbd | |
|
2 | 3 | |
|
3 | 4 | $ send() { |
|
4 | 5 | > hg --verbose debugwireproto --peer raw http://$LOCALIP:$HGPORT/ |
@@ -60,27 +61,6 b' Restart server with support for HTTP v2 ' | |||
|
60 | 61 | $ hg -R server serve -p $HGPORT -d --pid-file hg.pid |
|
61 | 62 | $ cat hg.pid > $DAEMON_PIDS |
|
62 | 63 | |
|
63 | Request to read-only command works out of the box | |
|
64 | ||
|
65 | $ send << EOF | |
|
66 | > httprequest POST api/$HTTPV2/ro/customreadonly | |
|
67 | > user-agent: test | |
|
68 | > EOF | |
|
69 | using raw connection to peer | |
|
70 | s> POST /api/exp-http-v2-0001/ro/customreadonly HTTP/1.1\r\n | |
|
71 | s> Accept-Encoding: identity\r\n | |
|
72 | s> user-agent: test\r\n | |
|
73 | s> host: $LOCALIP:$HGPORT\r\n (glob) | |
|
74 | s> \r\n | |
|
75 | s> makefile('rb', None) | |
|
76 | s> HTTP/1.1 200 OK\r\n | |
|
77 | s> Server: testing stub value\r\n | |
|
78 | s> Date: $HTTP_DATE$\r\n | |
|
79 | s> Content-Type: text/plain\r\n | |
|
80 | s> Content-Length: 18\r\n | |
|
81 | s> \r\n | |
|
82 | s> ro/customreadonly\n | |
|
83 | ||
|
84 | 64 | Request to unknown command yields 404 |
|
85 | 65 | |
|
86 | 66 | $ send << EOF |
@@ -123,6 +103,100 b' GET to read-only command yields a 405' | |||
|
123 | 103 | s> \r\n |
|
124 | 104 | s> commands require POST requests |
|
125 | 105 | |
|
106 | Missing Accept header results in 406 | |
|
107 | ||
|
108 | $ send << EOF | |
|
109 | > httprequest POST api/$HTTPV2/ro/customreadonly | |
|
110 | > user-agent: test | |
|
111 | > EOF | |
|
112 | using raw connection to peer | |
|
113 | s> POST /api/exp-http-v2-0001/ro/customreadonly HTTP/1.1\r\n | |
|
114 | s> Accept-Encoding: identity\r\n | |
|
115 | s> user-agent: test\r\n | |
|
116 | s> host: $LOCALIP:$HGPORT\r\n (glob) | |
|
117 | s> \r\n | |
|
118 | s> makefile('rb', None) | |
|
119 | s> HTTP/1.1 406 Not Acceptable\r\n | |
|
120 | s> Server: testing stub value\r\n | |
|
121 | s> Date: $HTTP_DATE$\r\n | |
|
122 | s> Content-Type: text/plain\r\n | |
|
123 | s> Content-Length: 72\r\n | |
|
124 | s> \r\n | |
|
125 | s> client MUST specify Accept header with value: application/mercurial-tbd\n | |
|
126 | ||
|
127 | Bad Accept header results in 406 | |
|
128 | ||
|
129 | $ send << EOF | |
|
130 | > httprequest POST api/$HTTPV2/ro/customreadonly | |
|
131 | > accept: invalid | |
|
132 | > user-agent: test | |
|
133 | > EOF | |
|
134 | using raw connection to peer | |
|
135 | s> POST /api/exp-http-v2-0001/ro/customreadonly HTTP/1.1\r\n | |
|
136 | s> Accept-Encoding: identity\r\n | |
|
137 | s> accept: invalid\r\n | |
|
138 | s> user-agent: test\r\n | |
|
139 | s> host: $LOCALIP:$HGPORT\r\n (glob) | |
|
140 | s> \r\n | |
|
141 | s> makefile('rb', None) | |
|
142 | s> HTTP/1.1 406 Not Acceptable\r\n | |
|
143 | s> Server: testing stub value\r\n | |
|
144 | s> Date: $HTTP_DATE$\r\n | |
|
145 | s> Content-Type: text/plain\r\n | |
|
146 | s> Content-Length: 72\r\n | |
|
147 | s> \r\n | |
|
148 | s> client MUST specify Accept header with value: application/mercurial-tbd\n | |
|
149 | ||
|
150 | Bad Content-Type header results in 415 | |
|
151 | ||
|
152 | $ send << EOF | |
|
153 | > httprequest POST api/$HTTPV2/ro/customreadonly | |
|
154 | > accept: $MEDIATYPE | |
|
155 | > user-agent: test | |
|
156 | > content-type: badmedia | |
|
157 | > EOF | |
|
158 | using raw connection to peer | |
|
159 | s> POST /api/exp-http-v2-0001/ro/customreadonly HTTP/1.1\r\n | |
|
160 | s> Accept-Encoding: identity\r\n | |
|
161 | s> accept: application/mercurial-tbd\r\n | |
|
162 | s> content-type: badmedia\r\n | |
|
163 | s> user-agent: test\r\n | |
|
164 | s> host: $LOCALIP:$HGPORT\r\n (glob) | |
|
165 | s> \r\n | |
|
166 | s> makefile('rb', None) | |
|
167 | s> HTTP/1.1 415 Unsupported Media Type\r\n | |
|
168 | s> Server: testing stub value\r\n | |
|
169 | s> Date: $HTTP_DATE$\r\n | |
|
170 | s> Content-Type: text/plain\r\n | |
|
171 | s> Content-Length: 75\r\n | |
|
172 | s> \r\n | |
|
173 | s> client MUST send Content-Type header with value: application/mercurial-tbd\n | |
|
174 | ||
|
175 | Request to read-only command works out of the box | |
|
176 | ||
|
177 | $ send << EOF | |
|
178 | > httprequest POST api/$HTTPV2/ro/customreadonly | |
|
179 | > accept: $MEDIATYPE | |
|
180 | > content-type: $MEDIATYPE | |
|
181 | > user-agent: test | |
|
182 | > EOF | |
|
183 | using raw connection to peer | |
|
184 | s> POST /api/exp-http-v2-0001/ro/customreadonly HTTP/1.1\r\n | |
|
185 | s> Accept-Encoding: identity\r\n | |
|
186 | s> accept: application/mercurial-tbd\r\n | |
|
187 | s> content-type: application/mercurial-tbd\r\n | |
|
188 | s> user-agent: test\r\n | |
|
189 | s> host: $LOCALIP:$HGPORT\r\n (glob) | |
|
190 | s> \r\n | |
|
191 | s> makefile('rb', None) | |
|
192 | s> HTTP/1.1 200 OK\r\n | |
|
193 | s> Server: testing stub value\r\n | |
|
194 | s> Date: $HTTP_DATE$\r\n | |
|
195 | s> Content-Type: text/plain\r\n | |
|
196 | s> Content-Length: 18\r\n | |
|
197 | s> \r\n | |
|
198 | s> ro/customreadonly\n | |
|
199 | ||
|
126 | 200 | Request to read-write command fails because server is read-only by default |
|
127 | 201 | |
|
128 | 202 | GET to read-write request yields 405 |
@@ -207,10 +281,14 b' Authorized request for valid read-write ' | |||
|
207 | 281 | $ send << EOF |
|
208 | 282 | > httprequest POST api/$HTTPV2/rw/customreadonly |
|
209 | 283 | > user-agent: test |
|
284 | > accept: $MEDIATYPE | |
|
285 | > content-type: $MEDIATYPE | |
|
210 | 286 | > EOF |
|
211 | 287 | using raw connection to peer |
|
212 | 288 | s> POST /api/exp-http-v2-0001/rw/customreadonly HTTP/1.1\r\n |
|
213 | 289 | s> Accept-Encoding: identity\r\n |
|
290 | s> accept: application/mercurial-tbd\r\n | |
|
291 | s> content-type: application/mercurial-tbd\r\n | |
|
214 | 292 | s> user-agent: test\r\n |
|
215 | 293 | s> host: $LOCALIP:$HGPORT\r\n (glob) |
|
216 | 294 | s> \r\n |
@@ -228,10 +306,12 b' Authorized request for unknown command i' | |||
|
228 | 306 | $ send << EOF |
|
229 | 307 | > httprequest POST api/$HTTPV2/rw/badcommand |
|
230 | 308 | > user-agent: test |
|
309 | > accept: $MEDIATYPE | |
|
231 | 310 | > EOF |
|
232 | 311 | using raw connection to peer |
|
233 | 312 | s> POST /api/exp-http-v2-0001/rw/badcommand HTTP/1.1\r\n |
|
234 | 313 | s> Accept-Encoding: identity\r\n |
|
314 | s> accept: application/mercurial-tbd\r\n | |
|
235 | 315 | s> user-agent: test\r\n |
|
236 | 316 | s> host: $LOCALIP:$HGPORT\r\n (glob) |
|
237 | 317 | s> \r\n |
General Comments 0
You need to be logged in to leave comments.
Login now