From 4b384e10c9f77d7c1273c0332f0d02542f747fcc Mon Sep 17 00:00:00 2001
From: Bryan Tong Minh <bryan.tongminh@gmail.com>
Date: Sun, 15 Nov 2009 20:15:25 +0000
Subject: [PATCH] Handle badtoken

---
 mwclient/RELEASE-NOTES.txt |  1 +
 mwclient/page.py           | 31 +++++++++++++++++++++++--------
 2 files changed, 24 insertions(+), 8 deletions(-)

diff --git a/mwclient/RELEASE-NOTES.txt b/mwclient/RELEASE-NOTES.txt
index ea91956..3ba95bf 100644
--- a/mwclient/RELEASE-NOTES.txt
+++ b/mwclient/RELEASE-NOTES.txt
@@ -8,6 +8,7 @@ Mwclient 0.6.4 is unreleased.
 * Added prop=duplicatefiles
 * Properly fix detection of alpha versions
 * Added support for builtin json library
+* Handle badtoken once
 
 == Changes in version 0.6.3 ==
 * Added domain parameter to login.
diff --git a/mwclient/page.py b/mwclient/page.py
index f03de2b..4398b9a 100644
--- a/mwclient/page.py
+++ b/mwclient/page.py
@@ -131,23 +131,38 @@ class Page(object):
 		
 		data.update(kwargs)
 		
-		try:
+		def do_edit():
 			result = self.site.api('edit', title = self.name, text = text, 
 					summary = summary, token = self.get_token('edit'), 
-					**data)
+					**data)		
 			if result['edit'].get('result').lower() == 'failure':
 				raise errors.EditError(self, result['edit'])
+			return result	
+		try:
+			result = do_edit()
 		except errors.APIError, e:
-			if e.code == 'editconflict':
-				raise errors.EditError(self, text, summary, e.info)
-			elif e.code in ('protectedtitle', 'cantcreate', 'cantcreate-anon', 'noimageredirect-anon', 
-				    'noimageredirect', 'noedit-anon', 'noedit'):
-				raise errors.ProtectedPageError(self, e.code, e.info)
+			if e.code == 'badtoken':
+				# Retry, but only once to avoid an infinite loop
+				self.get_token('edit', force = True)
+				try:
+					result = do_edit()
+				except errors.APIError, e:
+					self.handle_edit_error(e, summary)
 			else:
-				raise
+				self.handle_edit_error(e, summary)
+
 		if result['edit'] == 'Success':
 			self.last_rev_time = client.parse_timestamp(result['newtimestamp'])
 		return result['edit']
+	
+	def handle_edit_error(self, e,  summary):
+		if e.code == 'editconflict':
+			raise errors.EditError(self, summary, e.info)
+		elif e.code in ('protectedtitle', 'cantcreate', 'cantcreate-anon', 'noimageredirect-anon', 
+			    'noimageredirect', 'noedit-anon', 'noedit'):
+			raise errors.ProtectedPageError(self, e.code, e.info)
+		else:
+			raise		
 
 	def get_expanded(self):
 		self.site.require(1, 12)
-- 
GitLab