@@ -327,47 +327,80 @@ async def login(self) -> None:
327327 self ._login_urls ["v6_login_cgi" ],
328328 ]
329329
330- # Prepare form-urlencoded data (simple dict for 'ct_form=True')
331- v6_urlencoded_data = {
330+ # --- Data Set 1: SIMPLE (Original, minimal fields) ---
331+ v6_simple_urlencoded_data = {
332332 "uri" : "/index.cgi" ,
333333 "username" : self .username ,
334334 "password" : self .password ,
335335 }
336-
337- # Prepare multipart/form-data (aiohttp.FormData)
338- v6_multipart_form_data = aiohttp .FormData ()
339- v6_multipart_form_data .add_field ("uri" , "/index.cgi" )
340- v6_multipart_form_data .add_field ("username" , self .username )
341- v6_multipart_form_data .add_field ("password" , self .password )
336+ v6_simple_multipart_form_data = aiohttp .FormData ()
337+ v6_simple_multipart_form_data .add_field ("uri" , "/index.cgi" )
338+ v6_simple_multipart_form_data .add_field ("username" , self .username )
339+ v6_simple_multipart_form_data .add_field ("password" , self .password )
340+
341+ # --- Data Set 2: EXTENDED (Includes fields found in curl traffic) ---
342+ v6_extended_urlencoded_data = {
343+ ** v6_simple_urlencoded_data , # Start with simple data
344+ "country" : "56" ,
345+ "ui_language" : "en_US" ,
346+ "lang_changed" : "no" ,
347+ }
348+ v6_extended_multipart_form_data = aiohttp .FormData ()
349+ v6_extended_multipart_form_data .add_field ("uri" , "/index.cgi" )
350+ v6_extended_multipart_form_data .add_field ("username" , self .username )
351+ v6_extended_multipart_form_data .add_field ("password" , self .password )
352+ v6_extended_multipart_form_data .add_field ("country" , "56" )
353+ v6_extended_multipart_form_data .add_field ("ui_language" , "en_US" )
354+ v6_extended_multipart_form_data .add_field ("lang_changed" , "no" )
342355
343356 login_headers = {
344- # Removed User-Agent as it's often optional/can be simplified
345357 "Referer" : self ._login_urls ["v6_login_cgi" ],
346358 }
347359
348360 for url_to_try in v6_urls_to_try :
349- # --- Attempt 1: application/x-www- form-urlencoded (preferred modern method ) ---
361+ # --- ATTEMPT A: Simple Payload ( form-urlencoded) ---
350362 try :
351363 _LOGGER .error (
352- "TESTv6 - Trying to authenticate V6 POST to %s with application/x-www- form-urlencoded" ,
364+ "TESTv6 - Trying V6 POST to %s with SIMPLE form-urlencoded" ,
353365 url_to_try ,
354366 )
355367 await self ._request_json (
356368 "POST" ,
357369 url_to_try ,
358370 headers = login_headers ,
359- form_data = v6_urlencoded_data ,
371+ form_data = v6_simple_urlencoded_data ,
360372 authenticated = True ,
361- ct_form = True , # Flag to tell _request_json to use form-urlencoded Content-Type
373+ ct_form = True ,
362374 )
363- except AirOSUrlNotFoundError :
375+ except ( AirOSUrlNotFoundError , AirOSConnectionSetupError ) as err :
364376 _LOGGER .warning (
365- "TESTv6 - V6 URL not found (%s) for form-urlencoded, trying multipart." ,
377+ "TESTv6 - V6 simple form-urlencoded failed (%s) on %s. Error: %s" ,
378+ type (err ).__name__ ,
379+ url_to_try ,
380+ err ,
381+ )
382+ except AirOSConnectionAuthenticationError :
383+ raise
384+ else :
385+ return # Success
386+
387+ # --- ATTEMPT B: Simple Payload (multipart/form-data) ---
388+ try :
389+ _LOGGER .error (
390+ "TESTv6 - Trying V6 POST to %s with SIMPLE multipart/form-data" ,
366391 url_to_try ,
367392 )
368- except AirOSConnectionSetupError as err :
393+ await self ._request_json (
394+ "POST" ,
395+ url_to_try ,
396+ headers = login_headers ,
397+ form_data = v6_simple_multipart_form_data ,
398+ authenticated = True ,
399+ )
400+ except (AirOSUrlNotFoundError , AirOSConnectionSetupError ) as err :
369401 _LOGGER .warning (
370- "TESTv6 - V6 connection setup failed (%s) for form-urlencoded, trying multipart. Error: %s" ,
402+ "TESTv6 - V6 simple multipart failed (%s) on %s. Error: %s" ,
403+ type (err ).__name__ ,
371404 url_to_try ,
372405 err ,
373406 )
@@ -376,29 +409,50 @@ async def login(self) -> None:
376409 else :
377410 return # Success
378411
379- # --- Attempt 2: multipart/form-data (fallback for older/different servers ) ---
412+ # --- ATTEMPT C: Extended Payload (form-urlencoded ) ---
380413 try :
381414 _LOGGER .error (
382- "TESTv6 - Trying to authenticate V6 POST to %s with multipart/ form-data " ,
415+ "TESTv6 - Trying V6 POST to %s with EXTENDED form-urlencoded " ,
383416 url_to_try ,
384417 )
385418 await self ._request_json (
386419 "POST" ,
387420 url_to_try ,
388421 headers = login_headers ,
389- form_data = v6_multipart_form_data ,
422+ form_data = v6_extended_urlencoded_data ,
390423 authenticated = True ,
424+ ct_form = True ,
391425 )
392- except AirOSUrlNotFoundError :
426+ except ( AirOSUrlNotFoundError , AirOSConnectionSetupError ) as err :
393427 _LOGGER .warning (
394- "TESTv6 - V6 URL not found (%s) for multipart, trying next URL." ,
428+ "TESTv6 - V6 extended form-urlencoded failed (%s) on %s. Error: %s" ,
429+ type (err ).__name__ ,
395430 url_to_try ,
431+ err ,
396432 )
397- except AirOSConnectionSetupError as err :
433+ except AirOSConnectionAuthenticationError :
434+ raise
435+ else :
436+ return # Success
437+
438+ # --- ATTEMPT D: Extended Payload (multipart/form-data) ---
439+ try :
440+ _LOGGER .error (
441+ "TESTv6 - Trying V6 POST to %s with EXTENDED multipart/form-data" ,
442+ url_to_try ,
443+ )
444+ await self ._request_json (
445+ "POST" ,
446+ url_to_try ,
447+ headers = login_headers ,
448+ form_data = v6_extended_multipart_form_data ,
449+ authenticated = True ,
450+ )
451+ except (AirOSUrlNotFoundError , AirOSConnectionSetupError ) as err :
398452 _LOGGER .warning (
399- "TESTv6 - V6 connection setup failed (%s) for multipart, trying next URL. Error: %s" ,
453+ "TESTv6 - V6 extended multipart failed (%s) on %s. Trying next URL." ,
454+ type (err ).__name__ ,
400455 url_to_try ,
401- err ,
402456 )
403457 except AirOSConnectionAuthenticationError :
404458 raise
0 commit comments