Mercurial > hg
annotate hgext/lfs/wireprotolfsserver.py @ 50329:3dbc7b1ecaba stable
typing: correct the signature of error.CommandError
There's a place in `mercurial.dispatch._parse()` that passes None if a parse
error happens before the command can be parsed out, and casting the error to
bytes works fine because the command and message fields are apparently ignored.
Likewise, TortoiseHg similarly passes None for the same reason.
author | Matt Harbison <matt_harbison@yahoo.com> |
---|---|
date | Fri, 24 Mar 2023 02:22:12 -0400 |
parents | 6000f5b25c9b |
children | dde4b55a0785 |
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, |
38178
3790efb388ca
lfs: bypass wrapped functions when reposetup() hasn't been called (issue5902)
Matt Harbison <matt_harbison@yahoo.com>
parents:
37766
diff
changeset
|
19 util, |
41048
84d61fdcefa5
lfs: convert to using exthelper to wrap functions
Matt Harbison <matt_harbison@yahoo.com>
parents:
39457
diff
changeset
|
20 wireprotoserver, |
37147
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 |
37692
10e5bb9678f4
lfs: gracefully handle aborts on the server when corrupt blobs are detected
Matt Harbison <matt_harbison@yahoo.com>
parents:
37690
diff
changeset
|
23 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
|
24 |
37148
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
25 HTTP_OK = hgwebcommon.HTTP_OK |
37149
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
26 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
|
27 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
|
28 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
|
29 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
|
30 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
|
31 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
|
32 |
41048
84d61fdcefa5
lfs: convert to using exthelper to wrap functions
Matt Harbison <matt_harbison@yahoo.com>
parents:
39457
diff
changeset
|
33 eh = exthelper.exthelper() |
84d61fdcefa5
lfs: convert to using exthelper to wrap functions
Matt Harbison <matt_harbison@yahoo.com>
parents:
39457
diff
changeset
|
34 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
35 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
36 @eh.wrapfunction(wireprotoserver, b'handlewsgirequest') |
37147
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
37 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
|
38 """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
|
39 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
|
40 """ |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
41 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
|
42 return True |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
43 |
41424
7a11e4e55d5f
py3: add b'' prefixes to the LFS server module
Matt Harbison <matt_harbison@yahoo.com>
parents:
41048
diff
changeset
|
44 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
|
45 return False |
dfb38c4850a9
lfs: add an experimental knob to disable blob serving
Matt Harbison <matt_harbison@yahoo.com>
parents:
37149
diff
changeset
|
46 |
43115
4aa72cdf616f
py3: delete b'' prefix from safehasattr arguments
Martin von Zweigbergk <martinvonz@google.com>
parents:
43077
diff
changeset
|
47 if not util.safehasattr(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
|
48 return False |
3790efb388ca
lfs: bypass wrapped functions when reposetup() hasn't been called (issue5902)
Matt Harbison <matt_harbison@yahoo.com>
parents:
37766
diff
changeset
|
49 |
37147
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
50 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
|
51 return False |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
52 |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
53 try: |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
54 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
|
55 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
|
56 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
|
57 # 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
|
58 # namespace? |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
59 elif req.dispatchpath.startswith(b'.hg/lfs/objects'): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
60 return _processbasictransfer( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
61 rctx.repo, req, res, lambda perm: checkperm(rctx, req, perm) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
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 return False |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
64 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
|
65 # 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
|
66 # 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
|
67 # 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
|
68 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
|
69 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
|
70 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
|
71 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
|
72 return True |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
73 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
74 |
37148
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
75 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
|
76 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
|
77 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
|
78 res.setbodybytes(b'') |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
79 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
80 |
37690
726c4102db9e
lfs: log information about Internal Server Errors reported in the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37617
diff
changeset
|
81 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
|
82 """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
|
83 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
|
84 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
|
85 |
726c4102db9e
lfs: log information about Internal Server Errors reported in the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37617
diff
changeset
|
86 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
|
87 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
|
88 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
|
89 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
|
90 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
91 errorlog.write( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
92 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
|
93 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
94 |
37690
726c4102db9e
lfs: log information about Internal Server Errors reported in the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37617
diff
changeset
|
95 |
37147
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
96 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
|
97 """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
|
98 access. |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
99 |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
100 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
|
101 """ |
37148
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
102 |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
103 # Mercurial client request: |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
104 # |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
105 # HOST: localhost:$HGPORT |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
106 # 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
|
107 # ACCEPT-ENCODING: identity |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
108 # 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
|
109 # Content-Length: 125 |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
110 # 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
|
111 # |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
112 # { |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
113 # "objects": [ |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
114 # { |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
115 # "oid": "31cf...8e5b" |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
116 # "size": 12 |
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 # ] |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
119 # "operation": "upload" |
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 |
37693
31a0d47d69b3
lfs: update the HTTP status codes in error cases
Matt Harbison <matt_harbison@yahoo.com>
parents:
37692
diff
changeset
|
122 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
|
123 _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
|
124 return True |
31a0d47d69b3
lfs: update the HTTP status codes in error cases
Matt Harbison <matt_harbison@yahoo.com>
parents:
37692
diff
changeset
|
125 |
31a0d47d69b3
lfs: update the HTTP status codes in error cases
Matt Harbison <matt_harbison@yahoo.com>
parents:
37692
diff
changeset
|
126 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
|
127 _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
|
128 return True |
31a0d47d69b3
lfs: update the HTTP status codes in error cases
Matt Harbison <matt_harbison@yahoo.com>
parents:
37692
diff
changeset
|
129 |
31a0d47d69b3
lfs: update the HTTP status codes in error cases
Matt Harbison <matt_harbison@yahoo.com>
parents:
37692
diff
changeset
|
130 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
|
131 _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
|
132 return True |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
133 |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
134 # XXX: specify an encoding? |
43380
579672b347d2
py3: define and use json.loads polyfill
Gregory Szorc <gregory.szorc@gmail.com>
parents:
43115
diff
changeset
|
135 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
|
136 |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
137 # 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
|
138 if 'basic' not in lfsreq.get('transfers', ['basic']): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
139 _sethttperror( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
140 res, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
141 HTTP_BAD_REQUEST, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
142 b'Only the basic LFS transfer handler is supported', |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
143 ) |
37148
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
144 return True |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
145 |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
146 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
|
147 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
|
148 |
6d7f18cd81d9
py3: raw stringify various things in the LFS server module
Matt Harbison <matt_harbison@yahoo.com>
parents:
41424
diff
changeset
|
149 if operation not in (b'upload', b'download'): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
150 _sethttperror( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
151 res, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
152 HTTP_BAD_REQUEST, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
153 b'Unsupported LFS transfer operation: %s' % operation, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
154 ) |
37148
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
155 return True |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
156 |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
157 localstore = repo.svfs.lfslocalblobstore |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
158 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
159 objects = [ |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
160 p |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
161 for p in _batchresponseobjects( |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
162 req, lfsreq.get('objects', []), operation, localstore |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
163 ) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
164 ] |
37148
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
165 |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
166 rsp = { |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
167 'transfer': 'basic', |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
168 'objects': objects, |
37148
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 |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
171 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
|
172 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
|
173 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
|
174 |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
175 return True |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
176 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
177 |
37148
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
178 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
|
179 """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
|
180 object in the list. |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
181 |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
182 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
|
183 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
|
184 action: 'upload' or 'download' |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
185 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
|
186 |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
187 # 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
|
188 # { |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
189 # u'objects': [{ |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
190 # u'size': 12, |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
191 # 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
|
192 # u'actions': { |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
193 # u'upload': { |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
194 # 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
|
195 # 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
|
196 # u'header': { |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
197 # 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
|
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 |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
204 # 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
|
205 |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
206 for obj in objects: |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
207 # 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
|
208 soid = obj.get('oid') |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
209 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
|
210 rsp = { |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
211 'oid': soid, |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
212 '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
|
213 # 'authenticated': True, |
37148
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 |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
216 exists = True |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
217 verifies = False |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
218 |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
219 # 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
|
220 # 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
|
221 # 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
|
222 # (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
|
223 # 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
|
224 # 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
|
225 # 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
|
226 try: |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
227 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
|
228 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
|
229 # 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
|
230 # 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
|
231 store.linkfromusercache(oid) |
37148
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
232 except IOError as inst: |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
233 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
|
234 _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
|
235 |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
236 rsp['error'] = { |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
237 'code': 500, |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
238 '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
|
239 } |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
240 yield rsp |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
241 continue |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
242 |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
243 exists = False |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
244 |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
245 # 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
|
246 # 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
|
247 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
|
248 if not exists: |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
249 rsp['error'] = { |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
250 'code': 404, |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
251 '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
|
252 } |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
253 yield rsp |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
254 continue |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
255 |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
256 elif not verifies: |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
257 rsp['error'] = { |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
258 '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
|
259 '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
|
260 } |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
261 yield rsp |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
262 continue |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
263 |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
264 elif verifies: |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
265 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
|
266 continue |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
267 |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
268 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
|
269 |
37766
925707ac2855
lfs: add the 'Authorization' property to the Batch API response, if present
Matt Harbison <matt_harbison@yahoo.com>
parents:
37693
diff
changeset
|
270 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
|
271 # 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
|
272 # 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
|
273 # output. |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
274 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
|
275 |
41424
7a11e4e55d5f
py3: add b'' prefixes to the LFS server module
Matt Harbison <matt_harbison@yahoo.com>
parents:
41048
diff
changeset
|
276 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
|
277 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
|
278 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
|
279 |
925707ac2855
lfs: add the 'Authorization' property to the Batch API response, if present
Matt Harbison <matt_harbison@yahoo.com>
parents:
37693
diff
changeset
|
280 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
|
281 |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
282 rsp['actions'] = { |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
283 '%s' |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
284 % pycompat.strurl(action): { |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43503
diff
changeset
|
285 'href': pycompat.strurl( |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
286 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
|
287 ), |
37148
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
288 # 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
|
289 "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
|
290 'header': _buildheader(), |
37148
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 |
ea6fc58524d7
lfs: add server side support for the Batch API
Matt Harbison <matt_harbison@yahoo.com>
parents:
37147
diff
changeset
|
294 yield rsp |
37147
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
295 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
296 |
37147
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
297 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
|
298 """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
|
299 Transfer Adapter. |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
300 |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
301 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
|
302 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
|
303 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
|
304 |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
305 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
|
306 """ |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
307 |
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
308 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
|
309 oid = req.dispatchparts[-1] |
37149
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
310 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
|
311 |
37250
9640ccf44ac0
lfs: ensure the transfer request is for a known URI
Matt Harbison <matt_harbison@yahoo.com>
parents:
37249
diff
changeset
|
312 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
|
313 _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
|
314 return True |
9640ccf44ac0
lfs: ensure the transfer request is for a known URI
Matt Harbison <matt_harbison@yahoo.com>
parents:
37249
diff
changeset
|
315 |
37147
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
316 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
|
317 checkperm(b'upload') |
37149
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
318 |
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
319 # TODO: verify Content-Type? |
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
320 |
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
321 existed = localstore.has(oid) |
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
322 |
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
323 # 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
|
324 # 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
|
325 # says it will? |
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
326 |
37692
10e5bb9678f4
lfs: gracefully handle aborts on the server when corrupt blobs are detected
Matt Harbison <matt_harbison@yahoo.com>
parents:
37690
diff
changeset
|
327 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
|
328 try: |
44085
0ee0a3f6a990
lfs: check content length after downloading content
Matt Harbison <matt_harbison@yahoo.com>
parents:
43506
diff
changeset
|
329 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
|
330 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
|
331 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
|
332 _logexception(req) |
37149
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
333 |
37692
10e5bb9678f4
lfs: gracefully handle aborts on the server when corrupt blobs are detected
Matt Harbison <matt_harbison@yahoo.com>
parents:
37690
diff
changeset
|
334 # 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
|
335 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
|
336 |
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
337 # 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
|
338 # 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
|
339 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
|
340 res.setbodybytes(b'') |
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
341 |
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
342 return True |
37147
a2566597acb5
lfs: add basic routing for the server side wire protocol processing
Matt Harbison <matt_harbison@yahoo.com>
parents:
diff
changeset
|
343 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
|
344 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
|
345 |
37149
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
346 res.status = hgwebcommon.statusmessage(HTTP_OK) |
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
347 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
|
348 |
37692
10e5bb9678f4
lfs: gracefully handle aborts on the server when corrupt blobs are detected
Matt Harbison <matt_harbison@yahoo.com>
parents:
37690
diff
changeset
|
349 try: |
10e5bb9678f4
lfs: gracefully handle aborts on the server when corrupt blobs are detected
Matt Harbison <matt_harbison@yahoo.com>
parents:
37690
diff
changeset
|
350 # 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
|
351 # 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
|
352 # 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
|
353 # 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
|
354 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
|
355 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
|
356 _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
|
357 |
10e5bb9678f4
lfs: gracefully handle aborts on the server when corrupt blobs are detected
Matt Harbison <matt_harbison@yahoo.com>
parents:
37690
diff
changeset
|
358 # 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
|
359 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
|
360 res.setbodybytes(b'') |
37149
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
361 |
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
362 return True |
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
363 else: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
364 _sethttperror( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
365 res, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
366 HTTP_METHOD_NOT_ALLOWED, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
367 message=b'Unsupported LFS transfer method: %s' % method, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
41425
diff
changeset
|
368 ) |
37149
cc0a6ea95d98
lfs: add support for serving blob files
Matt Harbison <matt_harbison@yahoo.com>
parents:
37148
diff
changeset
|
369 return True |