ventajas español ejemplos desventajas descargar definicion caracteristicas javascript android ajax google-chrome user-agent

español - javascript ventajas y desventajas



Agente de usuario de Javascript(ajax) diferente al agente de usuario enviado cuando se solicita un sitio web (2)

Noté que Chrome (64.0.3282.137) en mi teléfono (OnePlus 3, Android 8.0.0) envía agentes de usuario ligeramente diferentes cuando solicita una página web en contraste con las solicitudes a través de ajax.

Este usuario-agente se envía cuando se solicita una página web:

Mozilla/5.0 (Linux; Android 8.0.0; ONEPLUS A3003 Build/OPR6.170623.013) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.137 Mobile Safari/537.36

Este agente de usuario se envía haciendo una llamada ajax y también se devuelve cuando se llama a navigator.userAgent :

Mozilla/5.0 (Linux; Android 8.0.0; Build/OPR6.170623.013) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.137 Mobile Safari/537.36

Diferencia: ONEPLUS A3003

¿Puede decirme por qué el modelo está incluido en las llamadas nativas, pero no en las llamadas ajax?

Información adicional: con la opción "Solicitar sitio de escritorio", el agente de usuario es Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.137 Safari/537.36 en ambos casos.


Analicé el código fuente de cromo para obtener algunas ideas. Solo pude llegar a cierto nivel con mis habilidades de principiante en c ++.

El agente de usuario del cliente o la plataforma se detecta en este bloque de código (Archivo: useragent.cc).

std::string BuildUserAgentFromProduct(const std::string& product) { std::string os_info; base::StringAppendF( &os_info, "%s%s", getUserAgentPlatform().c_str(), BuildOSCpuInfo().c_str()); return BuildUserAgentFromOSAndProduct(os_info, product); }

Puede ver BuildOSCpuInfo () en el bloque de código que se encarga de agregar la información del sistema basada en plataformas que se pueden encontrar aquí.

std::string android_build_codename = base::SysInfo::GetAndroidBuildCodename(); std::string android_device_name = base::SysInfo::HardwareModelName(); // this line in particular adds the ONEPLUS A3003

Pero esta función (BuildUserAgentFromProduct ()) no se usa directamente en el módulo de red que se encarga de enviar las solicitudes http.

Cuando investigué el código para el módulo de red (http), veo que están recibiendo el agente de usuario * y procesándolo a través de una serie de manipulaciones de cadenas y funcionalidades de recorte de espacios en blanco. AddHeadersFromString () en http_request_headers.cc es la interfaz a través de la cual se agrega la cadena del agente de usuario al encabezado de la solicitud.

Nota *: Pero creo que los datos del encabezado no son de useragent.cc, porque no puedo encontrar las llamadas para esta función en ningún lugar. Pero podría estar equivocado aquí.

** Creo que este es el lugar donde se modifica el valor de OSInfo. Cualquier carácter de espacio en blanco que no se reconozca o que esté en un formato incorrecto al que se destinó originalmente puede dar este resultado.

Nota **: no pude probar la declaración anterior y probarlo, porque la Cadena que se usa en Chromium tiene una envoltura alrededor de ella en el nombre de StringPiece (* la envoltura es solo un término que estoy usando, técnicamente puede ser Llamado de una manera diferente que no sé. Y no sé cómo escribir el código en c ++ para StringPiece.

Pero a continuación se muestra un ejemplo muy simple de cómo puede salir mal.

int main() { std::string s = " ONEPLUS/rA3003/rBuild/OPR6.170623.013"; std::string delimiter = "/r/n"; //this is the delimeter used in chromium source code. std::string token = s.substr(0, s.find(delimiter,0)); std::cout << token << std::endl; return 0; }

https://www.onlinegdb.com/SkTrbFJDz

Llegando a la razón por la cual la cadena de agente de usuario inicial tiene el valor y la solicitud http subsiguiente no tiene el valor, se encuentra en la arquitectura de la aplicación Chrome en Android. Cuando la página se carga inicialmente, la aplicación chrome establece realmente los valores (una base de código Java muy grande, pero creo que el archivo principal que necesitamos ver es LoadUrlParams.java) que tiene una implementación diferente para enviar la solicitud http (aquí el agente de usuario no está recortado por el mismo módulo de red (http), sino que se encarga de la implementación de Java), esto ocurre solo durante la primera carga. Pero cualquier otra llamada posterior utiliza el módulo de red del navegador (http).

Enlaces de referencia de archivos: https://cs.chromium.org/chromium/src/content/common/user_agent.cc?sq=package:chromium&dr=CSs&l=80

https://cs.chromium.org/chromium/src/net/http/http_request_headers.cc?type=cs&q=AddHeadersFromString&l=155

https://cs.chromium.org/chromium/src/content/public/android/java/src/org/chromium/content_public/browser/LoadUrlParams.java?q=createLoadDataParamsWithBaseUrl&dr=CSs

Solo incluyo esta respuesta para explicar una de las razones por las que pudo haber ocurrido el problema. Si tengo algo más de tiempo, veré si puedo realizar una prueba de alguna manera y probar esto. One Final Note: esta respuesta no da ninguna solución para solucionar el problema. Simplemente da la razón de la causa.

[Actualizar]

Un truco muy barato es ver si navigator.useragent tiene el valor plus y establecer encabezados ajax en la solicitud y enviarlo. Esto anulará el mecanismo del navegador para agregar el encabezado del agente de usuario.

XMLHttpRequest.setRequestHeader(header, value)


En el primer userAgent, el navegador identifica el dispositivo como un dispositivo móvil modificando el userAgent antes de realizar la solicitud; De ahí el ONEPLUS A3003 . Sin embargo, en la segunda, debido a la especificación w3 (Encuéntrela aquí) , no puede modificar el agente de usuario; De ahí la omisión de ONEPLUS A3003 .

Cuando utiliza la función "Solicitar sitio de escritorio", no es necesario que el navegador modifique el agente de usuario, por lo tanto, obtiene el mismo agente de usuario.

NOTA: El agente de usuario predeterminado para ese navegador Chrome es: Mozilla/5.0 (Linux; Android 8.0.0; Build/OPR6.170623.013) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.137 Mobile Safari/537.36