Merge branch 'main' into avm99963-monorail

Merged commit 34d8229ae2b51fb1a15bd208e6fe6185c94f6266

GitOrigin-RevId: 7ee0917f93a577e475f8e09526dd144d245593f4
diff --git a/api/monorail_servicer.py b/api/monorail_servicer.py
index 7dfdf0c..9d03091 100644
--- a/api/monorail_servicer.py
+++ b/api/monorail_servicer.py
@@ -1,16 +1,18 @@
-# Copyright 2018 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file or at
-# https://developers.google.com/open-source/licenses/bsd
+# Copyright 2018 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
 
 from __future__ import print_function
 from __future__ import division
 from __future__ import absolute_import
 
-import cgi
 import functools
-import httplib
+try:
+  import html
+except ImportError:
+  import cgi as html
 import logging
+from six.moves import http_client
 import sys
 import time
 from google.appengine.api import oauth
@@ -44,20 +46,20 @@
 
 # TODO(https://crbug.com/1346473)
 _PRPC_TO_HTTP_STATUS = {
-  codes.StatusCode.OK: httplib.OK,
-  codes.StatusCode.CANCELLED: httplib.NO_CONTENT,
-  codes.StatusCode.INVALID_ARGUMENT: httplib.BAD_REQUEST,
-  codes.StatusCode.DEADLINE_EXCEEDED: httplib.SERVICE_UNAVAILABLE,
-  codes.StatusCode.NOT_FOUND: httplib.NOT_FOUND,
-  codes.StatusCode.ALREADY_EXISTS: httplib.CONFLICT,
-  codes.StatusCode.PERMISSION_DENIED: httplib.FORBIDDEN,
-  codes.StatusCode.RESOURCE_EXHAUSTED: httplib.SERVICE_UNAVAILABLE,
-  codes.StatusCode.FAILED_PRECONDITION: httplib.PRECONDITION_FAILED,
-  codes.StatusCode.OUT_OF_RANGE: httplib.BAD_REQUEST,
-  codes.StatusCode.UNIMPLEMENTED: httplib.NOT_IMPLEMENTED,
-  codes.StatusCode.INTERNAL: httplib.INTERNAL_SERVER_ERROR,
-  codes.StatusCode.UNAVAILABLE: httplib.SERVICE_UNAVAILABLE,
-  codes.StatusCode.UNAUTHENTICATED: httplib.UNAUTHORIZED,
+  codes.StatusCode.OK: http_client.OK,
+  codes.StatusCode.CANCELLED: http_client.NO_CONTENT,
+  codes.StatusCode.INVALID_ARGUMENT: http_client.BAD_REQUEST,
+  codes.StatusCode.DEADLINE_EXCEEDED: http_client.SERVICE_UNAVAILABLE,
+  codes.StatusCode.NOT_FOUND: http_client.NOT_FOUND,
+  codes.StatusCode.ALREADY_EXISTS: http_client.CONFLICT,
+  codes.StatusCode.PERMISSION_DENIED: http_client.FORBIDDEN,
+  codes.StatusCode.RESOURCE_EXHAUSTED: http_client.SERVICE_UNAVAILABLE,
+  codes.StatusCode.FAILED_PRECONDITION: http_client.PRECONDITION_FAILED,
+  codes.StatusCode.OUT_OF_RANGE: http_client.BAD_REQUEST,
+  codes.StatusCode.UNIMPLEMENTED: http_client.NOT_IMPLEMENTED,
+  codes.StatusCode.INTERNAL: http_client.INTERNAL_SERVER_ERROR,
+  codes.StatusCode.UNAVAILABLE: http_client.SERVICE_UNAVAILABLE,
+  codes.StatusCode.UNAUTHENTICATED: http_client.UNAUTHORIZED,
 }
 
 def ConvertPRPCStatusToHTTPStatus(context):
@@ -140,7 +142,7 @@
 
     except Exception as e:
       if not self.ProcessException(e, prpc_context, mc):
-        raise e.__class__, e, sys.exc_info()[2]
+        raise
     finally:
       if mc:
         mc.CleanUp()
@@ -310,7 +312,6 @@
   def ProcessException(self, e, prpc_context, mc):
     """Return True if we convert an exception to a pRPC status code."""
     logging.exception(e)
-    logging.info(e.message)
     exc_type = type(e)
     if exc_type == exceptions.NoSuchUserException:
       prpc_context.set_code(codes.StatusCode.NOT_FOUND)
@@ -355,7 +356,7 @@
     elif exc_type == exceptions.InputException:
       prpc_context.set_code(codes.StatusCode.INVALID_ARGUMENT)
       prpc_context.set_details(
-          'Invalid arguments: %s' % cgi.escape(e.message, quote=True))
+          'Invalid arguments: %s' % html.escape(str(e), quote=True))
     elif exc_type == ratelimiter.ApiRateLimitExceeded:
       prpc_context.set_code(codes.StatusCode.PERMISSION_DENIED)
       prpc_context.set_details('The requester has exceeded API quotas limit.')
@@ -364,7 +365,7 @@
       prpc_context.set_details(
           'The oauth token was not valid or must be refreshed.')
     elif exc_type == xsrf.TokenIncorrect:
-      logging.info('Bad XSRF token: %r', e.message)
+      logging.info('Bad XSRF token: %r', str(e))
       prpc_context.set_code(codes.StatusCode.INVALID_ARGUMENT)
       prpc_context.set_details('Bad XSRF token.')
     else: