[PATCH 5 of 5] lfs: update the HTTP status codes in error cases

Matt Harbison mharbison72 at gmail.com
Fri Apr 13 18:04:37 EDT 2018


# HG changeset patch
# User Matt Harbison <matt_harbison at yahoo.com>
# Date 1523651553 14400
#      Fri Apr 13 16:32:33 2018 -0400
# Node ID f7f3443324c9ebcb065bebedfd54d4167eb673d4
# Parent  b795b3f8eca0aa917b10612dc95d46dee8ee7972
lfs: update the HTTP status codes in error cases

I'm not bothering with validating PUT requests (for now), because the spec
doesn't explicitly call out a Content-Type (though the example transcript does
use the sensible 'application/octet-stream').

diff --git a/hgext/lfs/wireprotolfsserver.py b/hgext/lfs/wireprotolfsserver.py
--- a/hgext/lfs/wireprotolfsserver.py
+++ b/hgext/lfs/wireprotolfsserver.py
@@ -26,6 +26,9 @@ HTTP_OK = hgwebcommon.HTTP_OK
 HTTP_CREATED = hgwebcommon.HTTP_CREATED
 HTTP_BAD_REQUEST = hgwebcommon.HTTP_BAD_REQUEST
 HTTP_NOT_FOUND = hgwebcommon.HTTP_NOT_FOUND
+HTTP_METHOD_NOT_ALLOWED = hgwebcommon.HTTP_METHOD_NOT_ALLOWED
+HTTP_NOT_ACCEPTABLE = hgwebcommon.HTTP_NOT_ACCEPTABLE
+HTTP_UNSUPPORTED_MEDIA_TYPE = hgwebcommon.HTTP_UNSUPPORTED_MEDIA_TYPE
 
 def handlewsgirequest(orig, rctx, req, res, checkperm):
     """Wrap wireprotoserver.handlewsgirequest() to possibly process an LFS
@@ -109,12 +112,16 @@ def _processbatchrequest(repo, req, res)
     #     "operation": "upload"
     #  }
 
-    if (req.method != b'POST'
-        or req.headers[b'Content-Type'] != b'application/vnd.git-lfs+json'
-        or req.headers[b'Accept'] != b'application/vnd.git-lfs+json'):
-        # TODO: figure out what the proper handling for a bad request to the
-        #       Batch API is.
-        _sethttperror(res, HTTP_BAD_REQUEST, b'Invalid Batch API request')
+    if req.method != b'POST':
+        _sethttperror(res, HTTP_METHOD_NOT_ALLOWED)
+        return True
+
+    if req.headers[b'Content-Type'] != b'application/vnd.git-lfs+json':
+        _sethttperror(res, HTTP_UNSUPPORTED_MEDIA_TYPE)
+        return True
+
+    if req.headers[b'Accept'] != b'application/vnd.git-lfs+json':
+        _sethttperror(res, HTTP_NOT_ACCEPTABLE)
         return True
 
     # XXX: specify an encoding?
@@ -319,6 +326,6 @@ def _processbasictransfer(repo, req, res
 
         return True
     else:
-        _sethttperror(res, HTTP_BAD_REQUEST,
+        _sethttperror(res, HTTP_METHOD_NOT_ALLOWED,
                       message=b'Unsupported LFS transfer method: %s' % method)
         return True
diff --git a/mercurial/hgweb/common.py b/mercurial/hgweb/common.py
--- a/mercurial/hgweb/common.py
+++ b/mercurial/hgweb/common.py
@@ -30,6 +30,8 @@ HTTP_UNAUTHORIZED = 401
 HTTP_FORBIDDEN = 403
 HTTP_NOT_FOUND = 404
 HTTP_METHOD_NOT_ALLOWED = 405
+HTTP_NOT_ACCEPTABLE = 406
+HTTP_UNSUPPORTED_MEDIA_TYPE = 415
 HTTP_SERVER_ERROR = 500
 
 


More information about the Mercurial-devel mailing list