Buenas gente, estoy con un problema que necesito a ver si alguien puede iluminarme y ayudarme a solucionarlo...
Estoy desarrollando una aplicación Windows que encripta archivos con OpenGP y luego los envía a una página .PHP que está en un servidor HTTPS.
El problema salta porque no solamente mando archivos, tengo que mandar un total de 15 parámetros: 7 archivos y 8 cadenas de texto.
Lamentablemente no tengo acceso a la aplicación .php y tengo que estar llamando constantemente a cada rato a la empresa que la administra para que me digan qué respondió o que devolvió, y en todos los casos me dicen que la información llega bien... menos los archivos...
Es decir, que los 8 parámetros correspondientes a las diferentes cadenas de texto sí llegan, pero los otros 7 parámetros en donde se supone que tienen que llegar los archivos *.gpg pues no llegan
En definitiva, mi problema son dos:
1) Conocen algún sniffer o programa que me permita ver la respuesta del servidor HTTPS para no andar llamando a cada rato a la empresa? (ya los tengo fastidiados seguramente)
2) Alguien puede darme un ejemplo de cómo postear los parámetros para que, los archivos vayan como archivos y las cadenas de texto vayan como cadenas de texto? imagino que tengo que manipular el "contentType" y esas cosas...
Para quienes puedan ayudarme, les adjunto el código y lo explico un poco:
Código:
private void button2_Click(object sender, System.EventArgs e)
{
//1) Implemento una interfaz sobreescrita de CertificatePolicy para no tener
// problemas con rechazos de certificados del SSL
System.Net.ServicePointManager.CertificatePolicy = new MyPolicy();
//2) Obtengo el directorio de donde voy a sacar los archivos
DirectoryInfo di = new DirectoryInfo(@"c:\convolgpg");
FileInfo[] rgFiles = di.GetFiles("*.gpg");
//3) Defino la dirección a donde voy a postearstring gatewayUrl = "https://sitio.com/paginita.php";
//4) Creo una instancia del objeto HttpWebResponseHttpWebResponse resp = null;
try
{
//5) Instancio una variable de cadena en donde voy a ir guardando los
// resultados que voy a terminar posteando
string postData = "&clave=8f247c34e9"; //Le asigno el primer parametro
//6) Me fijo en todos los archivos dentro de la carpeta
// que instancié más arriba
foreach(FileInfo fi in rgFiles)
{
//7) Los parámetros que me piden son:
// Por cada archivo que envío, debo mandar un parámetro adicional
// que es el checksum del archivo utilizando SHA1
// Los parametros que me piden son los siguientes:
// alarmadispensario ===> es uno de los archivos que tengo que mandar
// alarmadispensario_checksum ===> el resultado del SHA1
// lo mismo para los otros archivos. Aqui en el código solo pongo tres de los
// 7 archivos porque sino se me hace enorme el código
string identificador = fi.Name.Substring(16,3); //Para identificar qué archivo
switch(identificador)
{
case "ADI":
string alarmadispensario;
using (StreamReader lector = new StreamReader(@"c:\convolgpg\" + fi.Name))
{
alarmadispensario = lector.ReadToEnd();
}
FileStream f = new FileStream(@"c:\convolgpg\" + fi.Name,FileMode.Open,FileAccess.Read,FileShare.Read, 8192);
SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider();
StringBuilder sb = new StringBuilder();
foreach(byte b in sha1.ComputeHash(f))
{
sb.Append(b.ToString("x2").ToLower());
}
string alarmadispensarioCS = "&alarmadispensario_checksum=" + sb.ToString();
//8) Al string postData le agrego los dos nuevos parámetrospostData += "&alarmadispensario=" + alarmadispensario;
postData += alarmadispensarioCS;
break;
case "ATQ":
string alarmatanque;
using (StreamReader lector = new StreamReader(@"c:\convolgpg\" + fi.Name))
{
alarmatanque = lector.ReadToEnd();
}
f = new FileStream(@"c:\convolgpg\" + fi.Name,FileMode.Open,FileAccess.Read,FileShare.Read, 8192);
sha1 = new SHA1CryptoServiceProvider();
sb = new StringBuilder();
foreach(byte b in sha1.ComputeHash(f))
{
sb.Append(b.ToString("x2").ToLower());
}
string alarmatanqueCS = "&alarmatanque_checksum=" + sb.ToString();
//9) Y le agrego los otros dos nuevos parámetros...postData += "&alarmatanque=" + alarmatanque;
postData += alarmatanqueCS;
break;
case "VTA":
string ventas;
using (StreamReader lector = new StreamReader(@"c:\convolgpg\" + fi.Name))
{
ventas = lector.ReadToEnd();
}
f = new FileStream(@"c:\convolgpg\" + fi.Name,FileMode.Open,FileAccess.Read,FileShare.Read, 8192);
sha1 = new SHA1CryptoServiceProvider();
sb = new StringBuilder();
foreach(byte b in sha1.ComputeHash(f))
{
sb.Append(b.ToString("x2").ToLower());
}
string ventasCS = "&ventas_checksum=" + sb.ToString();
//10) Y por último los últimos dos
// (en total se supone que tengo 7 parámetros)
postData += "&ventas=" + ventas;
postData += ventasCS;
break;
}
}
//11) Genero una nueva instancia para presentar mis credenciales al sitioCredentialCache myCred = new CredentialCache();
myCred.Add(new Uri("https://sitio.com"),"BASIC",new NetworkCredential("usuario","password"));
//12) Genero una nueva instancia del objeto HttpWebRequestHttpWebRequest request = (HttpWebRequest)WebRequest.Create(gatewayUrl);
//13) Le asigno las credenciales que hicerequest.Credentials = myCred;
//14) Le indico el User Agentrequest.UserAgent ="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)";
//15) En un arreglo de bytes byte[] postDataBytes = Encoding.UTF8.GetBytes(postData);
//16) El resto supongo que no hace falta que lo explique:request.Method = "POST";
request.ContentType = "automatic/name";
request.ContentLength = postDataBytes.Length;
Stream requestStream = request.GetRequestStream();
requestStream.Write(postDataBytes, 0 ,postDataBytes.Length);
resp = (HttpWebResponse)request.GetResponse();
StreamReader responseReader = new StreamReader(resp.GetResponseStream(), Encoding.UTF8);
resp.Close();
requestStream.Close();
}
catch()
{
}
finally
{
if ( resp != null )
{
resp.Close();
}
}
}
Que estoy haciendo mal??????
Que me falta por ordenar / arreglar / quitar?????
Por favor ayúdenme