author | Martin von Zweigbergk <martinvonz@google.com> |
Fri, 30 Mar 2018 11:15:58 -0700 | |
changeset 37186 | 6d43b39fbaa0 |
parent 37149 | cc0a6ea95d98 |
child 37248 | dfb38c4850a9 |
permissions | -rw-r--r-- |
37147
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
1 |
# wireprotolfsserver.py - lfs protocol server side implementation |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
2 |
# |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
3 |
# Copyright 2018 Matt Harbison <matt_harbison@yahoo.com> |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
4 |
# |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
5 |
# This software may be used and distributed according to the terms of the |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
6 |
# GNU General Public License version 2 or any later version. |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
7 |
|
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
8 |
from __future__ import absolute_import |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
9 |
|
37148
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
10 |
import datetime |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
11 |
import errno |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
12 |
import json |
37149
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
13 |
import os |
37148
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
14 |
|
37147
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
15 |
from mercurial.hgweb import ( |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
16 |
common as hgwebcommon, |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
17 |
) |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
18 |
|
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
19 |
from mercurial import ( |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
20 |
pycompat, |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
21 |
) |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
22 |
|
37148
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
23 |
HTTP_OK = hgwebcommon.HTTP_OK |
37149
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
24 |
HTTP_CREATED = hgwebcommon.HTTP_CREATED |
37148
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
25 |
HTTP_BAD_REQUEST = hgwebcommon.HTTP_BAD_REQUEST |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
26 |
|
37147
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
27 |
def handlewsgirequest(orig, rctx, req, res, checkperm): |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
28 |
"""Wrap wireprotoserver.handlewsgirequest() to possibly process an LFS |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
29 |
request if it is left unprocessed by the wrapped method. |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
30 |
""" |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
31 |
if orig(rctx, req, res, checkperm): |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
32 |
return True |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
33 |
|
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
34 |
if not req.dispatchpath: |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
35 |
return False |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
36 |
|
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
37 |
try: |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
38 |
if req.dispatchpath == b'.git/info/lfs/objects/batch': |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
39 |
checkperm(rctx, req, 'pull') |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
40 |
return _processbatchrequest(rctx.repo, req, res) |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
41 |
# TODO: reserve and use a path in the proposed http wireprotocol /api/ |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
42 |
# namespace? |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
43 |
elif req.dispatchpath.startswith(b'.hg/lfs/objects'): |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
44 |
return _processbasictransfer(rctx.repo, req, res, |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
45 |
lambda perm: |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
46 |
checkperm(rctx, req, perm)) |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
47 |
return False |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
48 |
except hgwebcommon.ErrorResponse as e: |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
49 |
# XXX: copied from the handler surrounding wireprotoserver._callhttp() |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
50 |
# in the wrapped function. Should this be moved back to hgweb to |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
51 |
# be a common handler? |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
52 |
for k, v in e.headers: |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
53 |
res.headers[k] = v |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
54 |
res.status = hgwebcommon.statusmessage(e.code, pycompat.bytestr(e)) |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
55 |
res.setbodybytes(b'0\n%s\n' % pycompat.bytestr(e)) |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
56 |
return True |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
57 |
|
37148
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
58 |
def _sethttperror(res, code, message=None): |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
59 |
res.status = hgwebcommon.statusmessage(code, message=message) |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
60 |
res.headers[b'Content-Type'] = b'text/plain; charset=utf-8' |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
61 |
res.setbodybytes(b'') |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
62 |
|
37147
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
63 |
def _processbatchrequest(repo, req, res): |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
64 |
"""Handle a request for the Batch API, which is the gateway to granting file |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
65 |
access. |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
66 |
|
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
67 |
https://github.com/git-lfs/git-lfs/blob/master/docs/api/batch.md |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
68 |
""" |
37148
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
69 |
|
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
70 |
# Mercurial client request: |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
71 |
# |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
72 |
# HOST: localhost:$HGPORT |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
73 |
# ACCEPT: application/vnd.git-lfs+json |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
74 |
# ACCEPT-ENCODING: identity |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
75 |
# USER-AGENT: git-lfs/2.3.4 (Mercurial 4.5.2+1114-f48b9754f04c+20180316) |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
76 |
# Content-Length: 125 |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
77 |
# Content-Type: application/vnd.git-lfs+json |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
78 |
# |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
79 |
# { |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
80 |
# "objects": [ |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
81 |
# { |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
82 |
# "oid": "31cf...8e5b" |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
83 |
# "size": 12 |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
84 |
# } |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
85 |
# ] |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
86 |
# "operation": "upload" |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
87 |
# } |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
88 |
|
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
89 |
if (req.method != b'POST' |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
90 |
or req.headers[b'Content-Type'] != b'application/vnd.git-lfs+json' |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
91 |
or req.headers[b'Accept'] != b'application/vnd.git-lfs+json'): |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
92 |
# TODO: figure out what the proper handling for a bad request to the |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
93 |
# Batch API is. |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
94 |
_sethttperror(res, HTTP_BAD_REQUEST, b'Invalid Batch API request') |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
95 |
return True |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
96 |
|
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
97 |
# XXX: specify an encoding? |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
98 |
lfsreq = json.loads(req.bodyfh.read()) |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
99 |
|
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
100 |
# If no transfer handlers are explicitly requested, 'basic' is assumed. |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
101 |
if 'basic' not in lfsreq.get('transfers', ['basic']): |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
102 |
_sethttperror(res, HTTP_BAD_REQUEST, |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
103 |
b'Only the basic LFS transfer handler is supported') |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
104 |
return True |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
105 |
|
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
106 |
operation = lfsreq.get('operation') |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
107 |
if operation not in ('upload', 'download'): |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
108 |
_sethttperror(res, HTTP_BAD_REQUEST, |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
109 |
b'Unsupported LFS transfer operation: %s' % operation) |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
110 |
return True |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
111 |
|
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
112 |
localstore = repo.svfs.lfslocalblobstore |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
113 |
|
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
114 |
objects = [p for p in _batchresponseobjects(req, lfsreq.get('objects', []), |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
115 |
operation, localstore)] |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
116 |
|
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
117 |
rsp = { |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
118 |
'transfer': 'basic', |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
119 |
'objects': objects, |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
120 |
} |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
121 |
|
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
122 |
res.status = hgwebcommon.statusmessage(HTTP_OK) |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
123 |
res.headers[b'Content-Type'] = b'application/vnd.git-lfs+json' |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
124 |
res.setbodybytes(pycompat.bytestr(json.dumps(rsp))) |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
125 |
|
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
126 |
return True |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
127 |
|
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
128 |
def _batchresponseobjects(req, objects, action, store): |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
129 |
"""Yield one dictionary of attributes for the Batch API response for each |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
130 |
object in the list. |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
131 |
|
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
132 |
req: The parsedrequest for the Batch API request |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
133 |
objects: The list of objects in the Batch API object request list |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
134 |
action: 'upload' or 'download' |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
135 |
store: The local blob store for servicing requests""" |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
136 |
|
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
137 |
# Successful lfs-test-server response to solict an upload: |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
138 |
# { |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
139 |
# u'objects': [{ |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
140 |
# u'size': 12, |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
141 |
# u'oid': u'31cf...8e5b', |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
142 |
# u'actions': { |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
143 |
# u'upload': { |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
144 |
# u'href': u'http://localhost:$HGPORT/objects/31cf...8e5b', |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
145 |
# u'expires_at': u'0001-01-01T00:00:00Z', |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
146 |
# u'header': { |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
147 |
# u'Accept': u'application/vnd.git-lfs' |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
148 |
# } |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
149 |
# } |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
150 |
# } |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
151 |
# }] |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
152 |
# } |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
153 |
|
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
154 |
# TODO: Sort out the expires_at/expires_in/authenticated keys. |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
155 |
|
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
156 |
for obj in objects: |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
157 |
# Convert unicode to ASCII to create a filesystem path |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
158 |
oid = obj.get('oid').encode('ascii') |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
159 |
rsp = { |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
160 |
'oid': oid, |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
161 |
'size': obj.get('size'), # XXX: should this check the local size? |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
162 |
#'authenticated': True, |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
163 |
} |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
164 |
|
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
165 |
exists = True |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
166 |
verifies = False |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
167 |
|
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
168 |
# Verify an existing file on the upload request, so that the client is |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
169 |
# solicited to re-upload if it corrupt locally. Download requests are |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
170 |
# also verified, so the error can be flagged in the Batch API response. |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
171 |
# (Maybe we can use this to short circuit the download for `hg verify`, |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
172 |
# IFF the client can assert that the remote end is an hg server.) |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
173 |
# Otherwise, it's potentially overkill on download, since it is also |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
174 |
# verified as the file is streamed to the caller. |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
175 |
try: |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
176 |
verifies = store.verify(oid) |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
177 |
except IOError as inst: |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
178 |
if inst.errno != errno.ENOENT: |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
179 |
rsp['error'] = { |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
180 |
'code': 500, |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
181 |
'message': inst.strerror or 'Internal Server Server' |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
182 |
} |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
183 |
yield rsp |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
184 |
continue |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
185 |
|
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
186 |
exists = False |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
187 |
|
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
188 |
# Items are always listed for downloads. They are dropped for uploads |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
189 |
# IFF they already exist locally. |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
190 |
if action == 'download': |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
191 |
if not exists: |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
192 |
rsp['error'] = { |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
193 |
'code': 404, |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
194 |
'message': "The object does not exist" |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
195 |
} |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
196 |
yield rsp |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
197 |
continue |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
198 |
|
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
199 |
elif not verifies: |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
200 |
rsp['error'] = { |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
201 |
'code': 422, # XXX: is this the right code? |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
202 |
'message': "The object is corrupt" |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
203 |
} |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
204 |
yield rsp |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
205 |
continue |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
206 |
|
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
207 |
elif verifies: |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
208 |
yield rsp # Skip 'actions': already uploaded |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
209 |
continue |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
210 |
|
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
211 |
expiresat = datetime.datetime.now() + datetime.timedelta(minutes=10) |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
212 |
|
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
213 |
rsp['actions'] = { |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
214 |
'%s' % action: { |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
215 |
# TODO: Account for the --prefix, if any. |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
216 |
'href': '%s/.hg/lfs/objects/%s' % (req.baseurl, oid), |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
217 |
# datetime.isoformat() doesn't include the 'Z' suffix |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
218 |
"expires_at": expiresat.strftime('%Y-%m-%dT%H:%M:%SZ'), |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
219 |
'header': { |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
220 |
# The spec doesn't mention the Accept header here, but avoid |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
221 |
# a gratuitous deviation from lfs-test-server in the test |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
222 |
# output. |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
223 |
'Accept': 'application/vnd.git-lfs' |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
224 |
} |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
225 |
} |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
226 |
} |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
227 |
|
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
228 |
yield rsp |
37147
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
229 |
|
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
230 |
def _processbasictransfer(repo, req, res, checkperm): |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
231 |
"""Handle a single file upload (PUT) or download (GET) action for the Basic |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
232 |
Transfer Adapter. |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
233 |
|
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
234 |
After determining if the request is for an upload or download, the access |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
235 |
must be checked by calling ``checkperm()`` with either 'pull' or 'upload' |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
236 |
before accessing the files. |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
237 |
|
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
238 |
https://github.com/git-lfs/git-lfs/blob/master/docs/api/basic-transfers.md |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
239 |
""" |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
240 |
|
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
241 |
method = req.method |
37149
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
242 |
oid = os.path.basename(req.dispatchpath) |
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
243 |
localstore = repo.svfs.lfslocalblobstore |
37147
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
244 |
|
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
245 |
if method == b'PUT': |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
246 |
checkperm('upload') |
37149
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
247 |
|
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
248 |
# TODO: verify Content-Type? |
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
249 |
|
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
250 |
existed = localstore.has(oid) |
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
251 |
|
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
252 |
# TODO: how to handle timeouts? The body proxy handles limiting to |
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
253 |
# Content-Length, but what happens if a client sends less than it |
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
254 |
# says it will? |
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
255 |
|
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
256 |
# TODO: download() will abort if the checksum fails. It should raise |
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
257 |
# something checksum specific that can be caught here, and turned |
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
258 |
# into an http code. |
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
259 |
localstore.download(oid, req.bodyfh) |
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
260 |
|
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
261 |
statusmessage = hgwebcommon.statusmessage |
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
262 |
res.status = statusmessage(HTTP_OK if existed else HTTP_CREATED) |
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
263 |
|
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
264 |
# There's no payload here, but this is the header that lfs-test-server |
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
265 |
# sends back. This eliminates some gratuitous test output conditionals. |
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
266 |
res.headers[b'Content-Type'] = b'text/plain; charset=utf-8' |
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
267 |
res.setbodybytes(b'') |
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
268 |
|
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
269 |
return True |
37147
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
270 |
elif method == b'GET': |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
271 |
checkperm('pull') |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
272 |
|
37149
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
273 |
res.status = hgwebcommon.statusmessage(HTTP_OK) |
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
274 |
res.headers[b'Content-Type'] = b'application/octet-stream' |
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
275 |
|
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
276 |
# TODO: figure out how to send back the file in chunks, instead of |
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
277 |
# reading the whole thing. |
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
278 |
res.setbodybytes(localstore.read(oid)) |
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
279 |
|
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
280 |
return True |
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
281 |
else: |
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
282 |
_sethttperror(res, HTTP_BAD_REQUEST, |
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
283 |
message=b'Unsupported LFS transfer method: %s' % method) |
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
284 |
return True |