2010-02-12 36 views
10

Estoy trabajando en una aplicación web PHP que acepta grandes cargas de archivos POSTed de clientes específicos y me gustaría aceptar o rechazar estas cargas (basadas en varios encabezados y otros factores, no solo el tamaño) antes de la el archivo se carga utilizando HTTP/1.1 100 Continuar.Compatible con HTTP 100 Continuar con PHP

Algunos antecedentes rápida de HTTP/1.1 spec 8.2.3:

El propósito de la 100 (Continuación) estado (véase la sección 10.1.1) es permitir a un cliente que está enviando un mensaje de solicitud con un cuerpo de solicitud para determinar si el servidor de origen está dispuesto a aceptar la solicitud (en función de los encabezados de solicitud) antes de que el cliente envíe el cuerpo de la solicitud. En algunos casos, puede ser inapropiado o altamente ineficaz para el cliente enviar el cuerpo si el servidor rechazará el mensaje sin mirar el cuerpo.

El problema es que Apache ve el Expect: 100-continue desde el cliente, devuelve un 100 Continuar y acepta la carga de archivos de todo antes de PHP comienza a procesar ... Sin embargo necesito PHP para comenzar el proceso inmediatamente después de la Espera : 100-continuar. No estoy seguro de si esto es posible, así que tengo dos preguntas:

  1. ¿Es posible hacer que PHP comience a procesarse inmediatamente después de la Espera: 100-continuar?
  2. Si no, ¿cuál es una buena alternativa?

Actualmente estoy pensando en emular 100 y sigo especificando que el cliente primero envíe una solicitud HEAD con los mismos encabezados que el POST. La aplicación web puede devolver una respuesta para continuar con el POST o un código de error. ¡Otras sugerencias son bienvenidas!

+0

Me doy cuenta de que esta es una pregunta muy antigua, pero ¿terminaste usando la solicitud HEAD seguida del POST? Si es así, ¿qué tan cómodo fue implementarlo? Actualmente me encuentro frustrado por la incapacidad de implementar correctamente la expectativa de 100-continuar en una pila de PHP/Apache. – Marvin

+0

100 continuar es imposible de controlar correctamente en PHP (al menos lo fue, pasé a mejores idiomas). Si tiene control sobre el cliente, entonces sí, enviar una CABEZA (o cualquier otro tipo de solicitud) para realizar una verificación previa de la POST principal es el camino a seguir. Si no tiene control sobre el cliente, la única opción es configurar un proxy/middleware que pueda interceptar el 100 y responder adecuadamente. –

+0

Tengo el control del cliente, por lo que es una buena alternativa.Actualmente estoy tratando de proporcionar un gancho en Apache para implementar comprobaciones previas al 100-continue en el encabezado. No estoy seguro de si te llevará a algún lugar útil. http://stackoverflow.com/questions/35456122/apache-modules-implementing-100-continue?lq=1 – Marvin

Respuesta

-5

Intentar hacer esto en el nivel HTTP parece demasiado difícil. Es importante que un desarrollador no se cuelgue de una solución específica. El problema es que desea hacer una serie de comprobaciones antes de manejar la carga. Todo lo que necesita hacer es colocar una página calificada antes de la carga. Esta página de calificación solo les mostrará el formulario de carga si pasan la serie de cheques y califican. Eso es exactamente lo que estás tratando de hacer, solo que puedes hacerlo en el código PHP. Si es posible, la cosa HTTP 100 siempre requerirá mucha configuración adicional, creando así un dolor de cabeza para soporte más adelante. Si lo hace en el código, los que vienen detrás de usted (o usted mismo en un par de años) podrán entender claramente qué está haciendo la aplicación.

+0

@ Daniel: Comentarios: sus respuestas parecen ser prematuras: sin entender lo que necesitan los OP, está sugiriendo que se dé por vencido manejando el "HTTP 100 thing" –

0

Lamentablemente, no creo que esto sea posible. Si este es un requisito real, creo que es mejor simplemente mirar otros idiomas. Creo que hoy en día los entornos heterogéneos son más comunes que cuando se escribió esta pregunta, así que ¿por qué no crear un pequeño servicio escrito en otro idioma que solo se ocupe de la carga.

Pero sí, la forma en que PHP funciona es que la secuencia de comandos solo comienza cuando el cliente envía la solicitud completa.

Cuestiones relacionadas