Mercurial > hg
annotate hgext/lfs/wireprotolfsserver.py @ 51834:454feddab720 default tip
brancing: merge stable into default
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Fri, 06 Sep 2024 02:12:19 +0200 |
parents | d718eddf01d9 |
children |
rev | line source |
---|---|
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 |
37148
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
9 import datetime |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
10 import errno |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
11 import json |
37690
726c4102db9e
lfs: log information about Internal Server Errors reported in the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37617
diff
changeset
|
12 import traceback |
37148
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
13 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
14 from mercurial.hgweb import common as hgwebcommon |
37147
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
15 |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
16 from mercurial import ( |
41048
84d61fdcefa5
lfs: convert to using exthelper to wrap functions
Matt Harbison <matt_harbison@yahoo.com>
parents:
39457
diff
changeset
|
17 exthelper, |
37147
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
18 pycompat, |
41048
84d61fdcefa5
lfs: convert to using exthelper to wrap functions
Matt Harbison <matt_harbison@yahoo.com>
parents:
39457
diff
changeset
|
19 wireprotoserver, |
37147
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
20 ) |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
21 |
37692
10e5bb9678f4
lfs: gracefully handle aborts on the server when corrupt blobs are detected
Matt Harbison <matt_harbison@yahoo.com>
parents:
37690
diff
changeset
|
22 from . import blobstore |
10e5bb9678f4
lfs: gracefully handle aborts on the server when corrupt blobs are detected
Matt Harbison <matt_harbison@yahoo.com>
parents:
37690
diff
changeset
|
23 |
37148
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
24 HTTP_OK = hgwebcommon.HTTP_OK |
37149
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
25 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
|
26 HTTP_BAD_REQUEST = hgwebcommon.HTTP_BAD_REQUEST |
37250
9640ccf44ac0
lfs: ensure the transfer request is for a known URI
Matt Harbison <matt_harbison@yahoo.com>
parents:
37249
diff
changeset
|
27 HTTP_NOT_FOUND = hgwebcommon.HTTP_NOT_FOUND |
37693
31a0d47d69b3
lfs: update the HTTP status codes in error cases
Matt Harbison <matt_harbison@yahoo.com>
parents:
37692
diff
changeset
|
28 HTTP_METHOD_NOT_ALLOWED = hgwebcommon.HTTP_METHOD_NOT_ALLOWED |
31a0d47d69b3
lfs: update the HTTP status codes in error cases
Matt Harbison <matt_harbison@yahoo.com>
parents:
37692
diff
changeset
|
29 HTTP_NOT_ACCEPTABLE = hgwebcommon.HTTP_NOT_ACCEPTABLE |
31a0d47d69b3
lfs: update the HTTP status codes in error cases
Matt Harbison <matt_harbison@yahoo.com>
parents:
37692
diff
changeset
|
30 HTTP_UNSUPPORTED_MEDIA_TYPE = hgwebcommon.HTTP_UNSUPPORTED_MEDIA_TYPE |
37148
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
31 |
41048
84d61fdcefa5
lfs: convert to using exthelper to wrap functions
Matt Harbison <matt_harbison@yahoo.com>
parents:
39457
diff
changeset
|
32 eh = exthelper.exthelper() |
84d61fdcefa5
lfs: convert to using exthelper to wrap functions
Matt Harbison <matt_harbison@yahoo.com>
parents:
39457
diff
changeset
|
33 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
34 |
50786
dde4b55a0785
wrapfunction: use sysstr instead of bytes as argument in "lfs"
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
48875
diff
changeset
|
35 @eh.wrapfunction(wireprotoserver, 'handlewsgirequest') |
37147
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
36 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
|
37 """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
|
38 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
|
39 """ |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
40 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
|
41 return True |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
42 |
41424
7a11e4e55d5f
py3: add b'' prefixes to the LFS server module
Matt Harbison <matt_harbison@yahoo.com>
parents:
41048
diff
changeset
|
43 if not rctx.repo.ui.configbool(b'experimental', b'lfs.serve'): |
37248
dfb38c4850a9
lfs: add an experimental knob to disable blob serving
Matt Harbison <matt_harbison@yahoo.com>
parents:
37149
diff
changeset
|
44 return False |
dfb38c4850a9
lfs: add an experimental knob to disable blob serving
Matt Harbison <matt_harbison@yahoo.com>
parents:
37149
diff
changeset
|
45 |
50928
d718eddf01d9
safehasattr: drop usage in favor of hasattr
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
50786
diff
changeset
|
46 if not hasattr(rctx.repo.svfs, 'lfslocalblobstore'): |
38178
3790efb388ca
lfs: bypass wrapped functions when reposetup() hasn't been called (issue5902)
Matt Harbison <matt_harbison@yahoo.com>
parents:
37766
diff
changeset
|
47 return False |
3790efb388ca
lfs: bypass wrapped functions when reposetup() hasn't been called (issue5902)
Matt Harbison <matt_harbison@yahoo.com>
parents:
37766
diff
changeset
|
48 |
37147
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
49 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
|
50 return False |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
51 |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
52 try: |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
53 if req.dispatchpath == b'.git/info/lfs/objects/batch': |
41424
7a11e4e55d5f
py3: add b'' prefixes to the LFS server module
Matt Harbison <matt_harbison@yahoo.com>
parents:
41048
diff
changeset
|
54 checkperm(rctx, req, b'pull') |
37147
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
55 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
|
56 # 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
|
57 # namespace? |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
58 elif req.dispatchpath.startswith(b'.hg/lfs/objects'): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
59 return _processbasictransfer( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
60 rctx.repo, req, res, lambda perm: checkperm(rctx, req, perm) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
61 ) |
37147
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
62 return False |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
63 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
|
64 # 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
|
65 # 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
|
66 # 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
|
67 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
|
68 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
|
69 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
|
70 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
|
71 return True |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
72 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
73 |
37148
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
74 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
|
75 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
|
76 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
|
77 res.setbodybytes(b'') |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
78 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
79 |
37690
726c4102db9e
lfs: log information about Internal Server Errors reported in the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37617
diff
changeset
|
80 def _logexception(req): |
726c4102db9e
lfs: log information about Internal Server Errors reported in the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37617
diff
changeset
|
81 """Write information about the current exception to wsgi.errors.""" |
726c4102db9e
lfs: log information about Internal Server Errors reported in the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37617
diff
changeset
|
82 tb = pycompat.sysbytes(traceback.format_exc()) |
41424
7a11e4e55d5f
py3: add b'' prefixes to the LFS server module
Matt Harbison <matt_harbison@yahoo.com>
parents:
41048
diff
changeset
|
83 errorlog = req.rawenv[b'wsgi.errors'] |
37690
726c4102db9e
lfs: log information about Internal Server Errors reported in the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37617
diff
changeset
|
84 |
726c4102db9e
lfs: log information about Internal Server Errors reported in the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37617
diff
changeset
|
85 uri = b'' |
726c4102db9e
lfs: log information about Internal Server Errors reported in the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37617
diff
changeset
|
86 if req.apppath: |
726c4102db9e
lfs: log information about Internal Server Errors reported in the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37617
diff
changeset
|
87 uri += req.apppath |
726c4102db9e
lfs: log information about Internal Server Errors reported in the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37617
diff
changeset
|
88 uri += b'/' + req.dispatchpath |
726c4102db9e
lfs: log information about Internal Server Errors reported in the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37617
diff
changeset
|
89 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
90 errorlog.write( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
91 b"Exception happened while processing request '%s':\n%s" % (uri, tb) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
92 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
93 |
37690
726c4102db9e
lfs: log information about Internal Server Errors reported in the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37617
diff
changeset
|
94 |
37147
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
95 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
|
96 """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
|
97 access. |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
98 |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
99 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
|
100 """ |
37148
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
101 |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
102 # Mercurial client request: |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
103 # |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
104 # HOST: localhost:$HGPORT |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
105 # 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
|
106 # ACCEPT-ENCODING: identity |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
107 # 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
|
108 # Content-Length: 125 |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
109 # 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
|
110 # |
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 # "objects": [ |
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 # "oid": "31cf...8e5b" |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
115 # "size": 12 |
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 # ] |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
118 # "operation": "upload" |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
119 # } |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
120 |
37693
31a0d47d69b3
lfs: update the HTTP status codes in error cases
Matt Harbison <matt_harbison@yahoo.com>
parents:
37692
diff
changeset
|
121 if req.method != b'POST': |
31a0d47d69b3
lfs: update the HTTP status codes in error cases
Matt Harbison <matt_harbison@yahoo.com>
parents:
37692
diff
changeset
|
122 _sethttperror(res, HTTP_METHOD_NOT_ALLOWED) |
31a0d47d69b3
lfs: update the HTTP status codes in error cases
Matt Harbison <matt_harbison@yahoo.com>
parents:
37692
diff
changeset
|
123 return True |
31a0d47d69b3
lfs: update the HTTP status codes in error cases
Matt Harbison <matt_harbison@yahoo.com>
parents:
37692
diff
changeset
|
124 |
31a0d47d69b3
lfs: update the HTTP status codes in error cases
Matt Harbison <matt_harbison@yahoo.com>
parents:
37692
diff
changeset
|
125 if req.headers[b'Content-Type'] != b'application/vnd.git-lfs+json': |
31a0d47d69b3
lfs: update the HTTP status codes in error cases
Matt Harbison <matt_harbison@yahoo.com>
parents:
37692
diff
changeset
|
126 _sethttperror(res, HTTP_UNSUPPORTED_MEDIA_TYPE) |
31a0d47d69b3
lfs: update the HTTP status codes in error cases
Matt Harbison <matt_harbison@yahoo.com>
parents:
37692
diff
changeset
|
127 return True |
31a0d47d69b3
lfs: update the HTTP status codes in error cases
Matt Harbison <matt_harbison@yahoo.com>
parents:
37692
diff
changeset
|
128 |
31a0d47d69b3
lfs: update the HTTP status codes in error cases
Matt Harbison <matt_harbison@yahoo.com>
parents:
37692
diff
changeset
|
129 if req.headers[b'Accept'] != b'application/vnd.git-lfs+json': |
31a0d47d69b3
lfs: update the HTTP status codes in error cases
Matt Harbison <matt_harbison@yahoo.com>
parents:
37692
diff
changeset
|
130 _sethttperror(res, HTTP_NOT_ACCEPTABLE) |
37148
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
131 return True |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
132 |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
133 # XXX: specify an encoding? |
43380
579672b347d2
py3: define and use json.loads polyfill
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43115
diff
changeset
|
134 lfsreq = pycompat.json_loads(req.bodyfh.read()) |
37148
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
135 |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
136 # If no transfer handlers are explicitly requested, 'basic' is assumed. |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
137 if 'basic' not in lfsreq.get('transfers', ['basic']): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
138 _sethttperror( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
139 res, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
140 HTTP_BAD_REQUEST, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
141 b'Only the basic LFS transfer handler is supported', |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
142 ) |
37148
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
143 return True |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
144 |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
145 operation = lfsreq.get('operation') |
41425
6d7f18cd81d9
py3: raw stringify various things in the LFS server module
Matt Harbison <matt_harbison@yahoo.com>
parents:
41424
diff
changeset
|
146 operation = pycompat.bytestr(operation) |
6d7f18cd81d9
py3: raw stringify various things in the LFS server module
Matt Harbison <matt_harbison@yahoo.com>
parents:
41424
diff
changeset
|
147 |
6d7f18cd81d9
py3: raw stringify various things in the LFS server module
Matt Harbison <matt_harbison@yahoo.com>
parents:
41424
diff
changeset
|
148 if operation not in (b'upload', b'download'): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
149 _sethttperror( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
150 res, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
151 HTTP_BAD_REQUEST, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
152 b'Unsupported LFS transfer operation: %s' % operation, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
153 ) |
37148
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
154 return True |
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 localstore = repo.svfs.lfslocalblobstore |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
157 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
158 objects = [ |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
159 p |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
160 for p in _batchresponseobjects( |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
161 req, lfsreq.get('objects', []), operation, localstore |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
162 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
163 ] |
37148
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 rsp = { |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
166 'transfer': 'basic', |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
167 'objects': objects, |
37148
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
168 } |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
169 |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
170 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
|
171 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
|
172 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
|
173 |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
174 return True |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
175 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
176 |
37148
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
177 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
|
178 """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
|
179 object in the list. |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
180 |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
181 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
|
182 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
|
183 action: 'upload' or 'download' |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
184 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
|
185 |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
186 # 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
|
187 # { |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
188 # u'objects': [{ |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
189 # u'size': 12, |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
190 # 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
|
191 # u'actions': { |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
192 # u'upload': { |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
193 # 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
|
194 # 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
|
195 # u'header': { |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
196 # 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
|
197 # } |
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 # } |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
200 # }] |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
201 # } |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
202 |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
203 # 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
|
204 |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
205 for obj in objects: |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
206 # Convert unicode to ASCII to create a filesystem path |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
207 soid = obj.get('oid') |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
208 oid = soid.encode('ascii') |
37148
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
209 rsp = { |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
210 'oid': soid, |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
211 'size': obj.get('size'), # XXX: should this check the local size? |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
212 # 'authenticated': True, |
37148
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
213 } |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
214 |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
215 exists = True |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
216 verifies = False |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
217 |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
218 # 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
|
219 # 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
|
220 # 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
|
221 # (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
|
222 # 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
|
223 # 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
|
224 # 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
|
225 try: |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
226 verifies = store.verify(oid) |
41424
7a11e4e55d5f
py3: add b'' prefixes to the LFS server module
Matt Harbison <matt_harbison@yahoo.com>
parents:
41048
diff
changeset
|
227 if verifies and action == b'upload': |
39457
a913d2892e17
lfs: ensure the blob is linked to the remote store on skipped uploads
Matt Harbison <matt_harbison@yahoo.com>
parents:
38178
diff
changeset
|
228 # The client will skip this upload, but make sure it remains |
a913d2892e17
lfs: ensure the blob is linked to the remote store on skipped uploads
Matt Harbison <matt_harbison@yahoo.com>
parents:
38178
diff
changeset
|
229 # available locally. |
a913d2892e17
lfs: ensure the blob is linked to the remote store on skipped uploads
Matt Harbison <matt_harbison@yahoo.com>
parents:
38178
diff
changeset
|
230 store.linkfromusercache(oid) |
37148
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
231 except IOError as inst: |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
232 if inst.errno != errno.ENOENT: |
37690
726c4102db9e
lfs: log information about Internal Server Errors reported in the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37617
diff
changeset
|
233 _logexception(req) |
726c4102db9e
lfs: log information about Internal Server Errors reported in the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37617
diff
changeset
|
234 |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
235 rsp['error'] = { |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
236 'code': 500, |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
237 'message': inst.strerror or 'Internal Server Server', |
37148
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
238 } |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
239 yield rsp |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
240 continue |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
241 |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
242 exists = False |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
243 |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
244 # 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
|
245 # IFF they already exist locally. |
41424
7a11e4e55d5f
py3: add b'' prefixes to the LFS server module
Matt Harbison <matt_harbison@yahoo.com>
parents:
41048
diff
changeset
|
246 if action == b'download': |
37148
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
247 if not exists: |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
248 rsp['error'] = { |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
249 'code': 404, |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
250 'message': "The object does not exist", |
37148
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
251 } |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
252 yield rsp |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
253 continue |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
254 |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
255 elif not verifies: |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
256 rsp['error'] = { |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
257 'code': 422, # XXX: is this the right code? |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
258 'message': "The object is corrupt", |
37148
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
259 } |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
260 yield rsp |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
261 continue |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
262 |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
263 elif verifies: |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
264 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
|
265 continue |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
266 |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
267 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
|
268 |
37766
925707ac2855
lfs: add the 'Authorization' property to the Batch API response, if present
Matt Harbison <matt_harbison@yahoo.com>
parents:
37693
diff
changeset
|
269 def _buildheader(): |
925707ac2855
lfs: add the 'Authorization' property to the Batch API response, if present
Matt Harbison <matt_harbison@yahoo.com>
parents:
37693
diff
changeset
|
270 # The spec doesn't mention the Accept header here, but avoid |
925707ac2855
lfs: add the 'Authorization' property to the Batch API response, if present
Matt Harbison <matt_harbison@yahoo.com>
parents:
37693
diff
changeset
|
271 # a gratuitous deviation from lfs-test-server in the test |
925707ac2855
lfs: add the 'Authorization' property to the Batch API response, if present
Matt Harbison <matt_harbison@yahoo.com>
parents:
37693
diff
changeset
|
272 # output. |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
273 hdr = {'Accept': 'application/vnd.git-lfs'} |
37766
925707ac2855
lfs: add the 'Authorization' property to the Batch API response, if present
Matt Harbison <matt_harbison@yahoo.com>
parents:
37693
diff
changeset
|
274 |
41424
7a11e4e55d5f
py3: add b'' prefixes to the LFS server module
Matt Harbison <matt_harbison@yahoo.com>
parents:
41048
diff
changeset
|
275 auth = req.headers.get(b'Authorization', b'') |
7a11e4e55d5f
py3: add b'' prefixes to the LFS server module
Matt Harbison <matt_harbison@yahoo.com>
parents:
41048
diff
changeset
|
276 if auth.startswith(b'Basic '): |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
277 hdr['Authorization'] = pycompat.strurl(auth) |
37766
925707ac2855
lfs: add the 'Authorization' property to the Batch API response, if present
Matt Harbison <matt_harbison@yahoo.com>
parents:
37693
diff
changeset
|
278 |
925707ac2855
lfs: add the 'Authorization' property to the Batch API response, if present
Matt Harbison <matt_harbison@yahoo.com>
parents:
37693
diff
changeset
|
279 return hdr |
925707ac2855
lfs: add the 'Authorization' property to the Batch API response, if present
Matt Harbison <matt_harbison@yahoo.com>
parents:
37693
diff
changeset
|
280 |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
281 rsp['actions'] = { |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
282 '%s' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
283 % pycompat.strurl(action): { |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
284 'href': pycompat.strurl( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
285 b'%s%s/.hg/lfs/objects/%s' % (req.baseurl, req.apppath, oid) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
286 ), |
37148
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
287 # datetime.isoformat() doesn't include the 'Z' suffix |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
288 "expires_at": expiresat.strftime('%Y-%m-%dT%H:%M:%SZ'), |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
289 'header': _buildheader(), |
37148
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
290 } |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
291 } |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
292 |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
293 yield rsp |
37147
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
294 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
295 |
37147
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
296 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
|
297 """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
|
298 Transfer Adapter. |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
299 |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
300 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
|
301 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
|
302 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
|
303 |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
304 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
|
305 """ |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
306 |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
307 method = req.method |
37249
fe061e47a2cf
lfs: avoid an improper usage of os.path.basename() to parse a URI
Matt Harbison <matt_harbison@yahoo.com>
parents:
37248
diff
changeset
|
308 oid = req.dispatchparts[-1] |
37149
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
309 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
|
310 |
37250
9640ccf44ac0
lfs: ensure the transfer request is for a known URI
Matt Harbison <matt_harbison@yahoo.com>
parents:
37249
diff
changeset
|
311 if len(req.dispatchparts) != 4: |
9640ccf44ac0
lfs: ensure the transfer request is for a known URI
Matt Harbison <matt_harbison@yahoo.com>
parents:
37249
diff
changeset
|
312 _sethttperror(res, HTTP_NOT_FOUND) |
9640ccf44ac0
lfs: ensure the transfer request is for a known URI
Matt Harbison <matt_harbison@yahoo.com>
parents:
37249
diff
changeset
|
313 return True |
9640ccf44ac0
lfs: ensure the transfer request is for a known URI
Matt Harbison <matt_harbison@yahoo.com>
parents:
37249
diff
changeset
|
314 |
37147
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
315 if method == b'PUT': |
41424
7a11e4e55d5f
py3: add b'' prefixes to the LFS server module
Matt Harbison <matt_harbison@yahoo.com>
parents:
41048
diff
changeset
|
316 checkperm(b'upload') |
37149
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
317 |
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
318 # TODO: verify Content-Type? |
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
319 |
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
320 existed = localstore.has(oid) |
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
321 |
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
322 # 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
|
323 # 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
|
324 # says it will? |
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
325 |
37692
10e5bb9678f4
lfs: gracefully handle aborts on the server when corrupt blobs are detected
Matt Harbison <matt_harbison@yahoo.com>
parents:
37690
diff
changeset
|
326 statusmessage = hgwebcommon.statusmessage |
10e5bb9678f4
lfs: gracefully handle aborts on the server when corrupt blobs are detected
Matt Harbison <matt_harbison@yahoo.com>
parents:
37690
diff
changeset
|
327 try: |
44085
0ee0a3f6a990
lfs: check content length after downloading content
Matt Harbison <matt_harbison@yahoo.com>
parents:
43506
diff
changeset
|
328 localstore.download(oid, req.bodyfh, req.headers[b'Content-Length']) |
37692
10e5bb9678f4
lfs: gracefully handle aborts on the server when corrupt blobs are detected
Matt Harbison <matt_harbison@yahoo.com>
parents:
37690
diff
changeset
|
329 res.status = statusmessage(HTTP_OK if existed else HTTP_CREATED) |
10e5bb9678f4
lfs: gracefully handle aborts on the server when corrupt blobs are detected
Matt Harbison <matt_harbison@yahoo.com>
parents:
37690
diff
changeset
|
330 except blobstore.LfsCorruptionError: |
10e5bb9678f4
lfs: gracefully handle aborts on the server when corrupt blobs are detected
Matt Harbison <matt_harbison@yahoo.com>
parents:
37690
diff
changeset
|
331 _logexception(req) |
37149
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
332 |
37692
10e5bb9678f4
lfs: gracefully handle aborts on the server when corrupt blobs are detected
Matt Harbison <matt_harbison@yahoo.com>
parents:
37690
diff
changeset
|
333 # XXX: Is this the right code? |
10e5bb9678f4
lfs: gracefully handle aborts on the server when corrupt blobs are detected
Matt Harbison <matt_harbison@yahoo.com>
parents:
37690
diff
changeset
|
334 res.status = statusmessage(422, b'corrupt blob') |
37149
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
335 |
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
336 # 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
|
337 # 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
|
338 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
|
339 res.setbodybytes(b'') |
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
340 |
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
341 return True |
37147
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
342 elif method == b'GET': |
41424
7a11e4e55d5f
py3: add b'' prefixes to the LFS server module
Matt Harbison <matt_harbison@yahoo.com>
parents:
41048
diff
changeset
|
343 checkperm(b'pull') |
37147
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
344 |
37149
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
345 res.status = hgwebcommon.statusmessage(HTTP_OK) |
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
346 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
|
347 |
37692
10e5bb9678f4
lfs: gracefully handle aborts on the server when corrupt blobs are detected
Matt Harbison <matt_harbison@yahoo.com>
parents:
37690
diff
changeset
|
348 try: |
10e5bb9678f4
lfs: gracefully handle aborts on the server when corrupt blobs are detected
Matt Harbison <matt_harbison@yahoo.com>
parents:
37690
diff
changeset
|
349 # TODO: figure out how to send back the file in chunks, instead of |
10e5bb9678f4
lfs: gracefully handle aborts on the server when corrupt blobs are detected
Matt Harbison <matt_harbison@yahoo.com>
parents:
37690
diff
changeset
|
350 # reading the whole thing. (Also figure out how to send back |
10e5bb9678f4
lfs: gracefully handle aborts on the server when corrupt blobs are detected
Matt Harbison <matt_harbison@yahoo.com>
parents:
37690
diff
changeset
|
351 # an error status if an IOError occurs after a partial write |
10e5bb9678f4
lfs: gracefully handle aborts on the server when corrupt blobs are detected
Matt Harbison <matt_harbison@yahoo.com>
parents:
37690
diff
changeset
|
352 # in that case. Here, everything is read before starting.) |
10e5bb9678f4
lfs: gracefully handle aborts on the server when corrupt blobs are detected
Matt Harbison <matt_harbison@yahoo.com>
parents:
37690
diff
changeset
|
353 res.setbodybytes(localstore.read(oid)) |
10e5bb9678f4
lfs: gracefully handle aborts on the server when corrupt blobs are detected
Matt Harbison <matt_harbison@yahoo.com>
parents:
37690
diff
changeset
|
354 except blobstore.LfsCorruptionError: |
10e5bb9678f4
lfs: gracefully handle aborts on the server when corrupt blobs are detected
Matt Harbison <matt_harbison@yahoo.com>
parents:
37690
diff
changeset
|
355 _logexception(req) |
10e5bb9678f4
lfs: gracefully handle aborts on the server when corrupt blobs are detected
Matt Harbison <matt_harbison@yahoo.com>
parents:
37690
diff
changeset
|
356 |
10e5bb9678f4
lfs: gracefully handle aborts on the server when corrupt blobs are detected
Matt Harbison <matt_harbison@yahoo.com>
parents:
37690
diff
changeset
|
357 # XXX: Is this the right code? |
10e5bb9678f4
lfs: gracefully handle aborts on the server when corrupt blobs are detected
Matt Harbison <matt_harbison@yahoo.com>
parents:
37690
diff
changeset
|
358 res.status = hgwebcommon.statusmessage(422, b'corrupt blob') |
10e5bb9678f4
lfs: gracefully handle aborts on the server when corrupt blobs are detected
Matt Harbison <matt_harbison@yahoo.com>
parents:
37690
diff
changeset
|
359 res.setbodybytes(b'') |
37149
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
360 |
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
361 return True |
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
362 else: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
363 _sethttperror( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
364 res, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
365 HTTP_METHOD_NOT_ALLOWED, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
366 message=b'Unsupported LFS transfer method: %s' % method, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
367 ) |
37149
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
368 return True |