comparison mercurial/wireprotoserver.py @ 35866:d747cf39cf70

wireprotoserver: make attributes private These aren't part of the protocol interface. So they should be _ prefixed. Differential Revision: https://phab.mercurial-scm.org/D1984
author Gregory Szorc <gregory.szorc@gmail.com>
date Wed, 31 Jan 2018 10:19:08 -0800
parents f084d5131f3e
children d7cce6df65bb
comparison
equal deleted inserted replaced
35865:f084d5131f3e 35866:d747cf39cf70
88 88
89 return ''.join(chunks) 89 return ''.join(chunks)
90 90
91 class webproto(abstractserverproto): 91 class webproto(abstractserverproto):
92 def __init__(self, req, ui): 92 def __init__(self, req, ui):
93 self.req = req 93 self._req = req
94 self.ui = ui 94 self._ui = ui
95 self.name = 'http' 95 self.name = 'http'
96 96
97 def getargs(self, args): 97 def getargs(self, args):
98 knownargs = self._args() 98 knownargs = self._args()
99 data = {} 99 data = {}
108 else: 108 else:
109 data[k] = knownargs[k][0] 109 data[k] = knownargs[k][0]
110 return [data[k] for k in keys] 110 return [data[k] for k in keys]
111 111
112 def _args(self): 112 def _args(self):
113 args = self.req.form.copy() 113 args = self._req.form.copy()
114 if pycompat.ispy3: 114 if pycompat.ispy3:
115 args = {k.encode('ascii'): [v.encode('ascii') for v in vs] 115 args = {k.encode('ascii'): [v.encode('ascii') for v in vs]
116 for k, vs in args.items()} 116 for k, vs in args.items()}
117 postlen = int(self.req.env.get(r'HTTP_X_HGARGS_POST', 0)) 117 postlen = int(self._req.env.get(r'HTTP_X_HGARGS_POST', 0))
118 if postlen: 118 if postlen:
119 args.update(cgi.parse_qs( 119 args.update(cgi.parse_qs(
120 self.req.read(postlen), keep_blank_values=True)) 120 self._req.read(postlen), keep_blank_values=True))
121 return args 121 return args
122 122
123 argvalue = decodevaluefromheaders(self.req, r'X-HgArg') 123 argvalue = decodevaluefromheaders(self._req, r'X-HgArg')
124 args.update(cgi.parse_qs(argvalue, keep_blank_values=True)) 124 args.update(cgi.parse_qs(argvalue, keep_blank_values=True))
125 return args 125 return args
126 126
127 def getfile(self, fp): 127 def getfile(self, fp):
128 length = int(self.req.env[r'CONTENT_LENGTH']) 128 length = int(self._req.env[r'CONTENT_LENGTH'])
129 # If httppostargs is used, we need to read Content-Length 129 # If httppostargs is used, we need to read Content-Length
130 # minus the amount that was consumed by args. 130 # minus the amount that was consumed by args.
131 length -= int(self.req.env.get(r'HTTP_X_HGARGS_POST', 0)) 131 length -= int(self._req.env.get(r'HTTP_X_HGARGS_POST', 0))
132 for s in util.filechunkiter(self.req, limit=length): 132 for s in util.filechunkiter(self._req, limit=length):
133 fp.write(s) 133 fp.write(s)
134 134
135 def redirect(self): 135 def redirect(self):
136 self.oldio = self.ui.fout, self.ui.ferr 136 self._oldio = self._ui.fout, self._ui.ferr
137 self.ui.ferr = self.ui.fout = stringio() 137 self._ui.ferr = self._ui.fout = stringio()
138 138
139 def restore(self): 139 def restore(self):
140 val = self.ui.fout.getvalue() 140 val = self._ui.fout.getvalue()
141 self.ui.ferr, self.ui.fout = self.oldio 141 self._ui.ferr, self._ui.fout = self._oldio
142 return val 142 return val
143 143
144 def _client(self): 144 def _client(self):
145 return 'remote:%s:%s:%s' % ( 145 return 'remote:%s:%s:%s' % (
146 self.req.env.get('wsgi.url_scheme') or 'http', 146 self._req.env.get('wsgi.url_scheme') or 'http',
147 urlreq.quote(self.req.env.get('REMOTE_HOST', '')), 147 urlreq.quote(self._req.env.get('REMOTE_HOST', '')),
148 urlreq.quote(self.req.env.get('REMOTE_USER', ''))) 148 urlreq.quote(self._req.env.get('REMOTE_USER', '')))
149 149
150 def responsetype(self, prefer_uncompressed): 150 def responsetype(self, prefer_uncompressed):
151 """Determine the appropriate response type and compression settings. 151 """Determine the appropriate response type and compression settings.
152 152
153 Returns a tuple of (mediatype, compengine, engineopts). 153 Returns a tuple of (mediatype, compengine, engineopts).
154 """ 154 """
155 # Determine the response media type and compression engine based 155 # Determine the response media type and compression engine based
156 # on the request parameters. 156 # on the request parameters.
157 protocaps = decodevaluefromheaders(self.req, r'X-HgProto').split(' ') 157 protocaps = decodevaluefromheaders(self._req, r'X-HgProto').split(' ')
158 158
159 if '0.2' in protocaps: 159 if '0.2' in protocaps:
160 # All clients are expected to support uncompressed data. 160 # All clients are expected to support uncompressed data.
161 if prefer_uncompressed: 161 if prefer_uncompressed:
162 return HGTYPE2, util._noopengine(), {} 162 return HGTYPE2, util._noopengine(), {}
167 if cap.startswith('comp='): 167 if cap.startswith('comp='):
168 compformats = cap[5:].split(',') 168 compformats = cap[5:].split(',')
169 break 169 break
170 170
171 # Now find an agreed upon compression format. 171 # Now find an agreed upon compression format.
172 for engine in wireproto.supportedcompengines(self.ui, self, 172 for engine in wireproto.supportedcompengines(self._ui, self,
173 util.SERVERROLE): 173 util.SERVERROLE):
174 if engine.wireprotosupport().name in compformats: 174 if engine.wireprotosupport().name in compformats:
175 opts = {} 175 opts = {}
176 level = self.ui.configint('server', 176 level = self._ui.configint('server',
177 '%slevel' % engine.name()) 177 '%slevel' % engine.name())
178 if level is not None: 178 if level is not None:
179 opts['level'] = level 179 opts['level'] = level
180 180
181 return HGTYPE2, engine, opts 181 return HGTYPE2, engine, opts
184 # legacy protocol. 184 # legacy protocol.
185 185
186 # Don't allow untrusted settings because disabling compression or 186 # Don't allow untrusted settings because disabling compression or
187 # setting a very high compression level could lead to flooding 187 # setting a very high compression level could lead to flooding
188 # the server's network or CPU. 188 # the server's network or CPU.
189 opts = {'level': self.ui.configint('server', 'zliblevel')} 189 opts = {'level': self._ui.configint('server', 'zliblevel')}
190 return HGTYPE, util.compengines['zlib'], opts 190 return HGTYPE, util.compengines['zlib'], opts
191 191
192 def iscmd(cmd): 192 def iscmd(cmd):
193 return cmd in wireproto.commands 193 return cmd in wireproto.commands
194 194