PureBasic

Forums PureBasic
Nous sommes le Mar 21/Mai/2013 22:01

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 3 messages ] 
Auteur Message
 Sujet du message: Requête POST (Avec les Sockets)
MessagePosté: Mer 02/Mai/2012 17:06 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 21/Déc/2008 18:39
Messages: 76
Salut à tous !

J'ai galéré de mon côté pour faire une fonction 'POST' en utilisant les Sockets, étant donnée le temps que j'y ai passé (à cause d'une faute dans ma requête !), je partage, histoire qu'on soit pas plusieurs à se taper l'implantation d'une telle fonction, qui peut être sacrément utile pour mettre en place une communication application <=> site web.

Je précise que variables doit prendre des valeurs sous cette forme ;
nom_variable1=valeur_1&variable2=valeur2&variable3=valeur3

Code:
;-*****************************************************************************
;-*                                 Requête POST                              *
;-*                                                                           *
;-*                            Auteur : stombretrooper                        *
;-*                                Libre de droits.                           *
;-*****************************************************************************


CompilerIf #PB_Compiler_OS = #PB_OS_Windows
  If WSAStartup_($101, @wsaData)<>#NO_ERROR
    End
  EndIf
CompilerEndIf



;Taille du buffer de reception :
#ReceptionDataBuffer = 50*1024

Procedure.s Post(url.s, variables.s)
  ;Décomposition de l'url :
  hote.s = GetURLPart(url.s, #PB_URL_Site)
  fichier.s = GetURLPart(url, #PB_URL_Path) + GetURLPart(url.s, #PB_URL_Parameters)
 
  ;Récupération de l'IP en fonction du nom de domaine :
  *host.HOSTENT = gethostbyname_(hote)
  Dim ip.a(4)
  *pointeur_ip = PeekI(*host\h_addr_list)
  CopyMemory(*pointeur_ip, @ip(), 4)
  ip.s = Str(ip(0))+"."+Str(ip(1))+"."+Str(ip(2))+"."+Str(ip(3))
 
  ;Génération de la requête :
  requete.s = "POST /"+fichier+" HTTP/1.1" + #CRLF$
  requete + "Host: "+hote + #CRLF$
  requete + "User-Agent:Mozilla/4.0" +#CRLF$
  requete + "Connection: Close" + #CRLF$
  requete + "Accept-Encoding: chunked" + #CRLF$
  requete + "Content-type: application/x-www-form-urlencoded" + #CRLF$
  requete + "Content-Length: "+ Str(Len(variables)) + #CRLF$ + #CRLF$
  requete + variables
 
  ;Buffer de reception :
  *reception = AllocateMemory(#ReceptionDataBuffer)
  receptionlen = #ReceptionDataBuffer - 1
 
  ;Création du socket & connection :
  socket = SOCKET_(#AF_INET, #SOCK_STREAM, #IPPROTO_TCP)
  If socket = #INVALID_SOCKET
    ProcedureReturn "error_socket"
  EndIf
  service.sockaddr_in
  service\sin_addr = inet_addr_(ip)
  service\sin_family = #AF_INET
  service\sin_port = htons_(80)
  *ptr = @service
  If connect_(socket, *ptr, SizeOf(sockaddr_in)) = #SOCKET_ERROR
    ProcedureReturn "error_connection"
  EndIf
 
  ;Envoie de la requête :
  send_(socket, @requete, Len(requete), 0)
 
  ;Récupération des données :
  *size = 0
  Repeat
    recv_(socket, *reception + *size, 1, 0)
    *size + 1
  Until PeekS(*reception + *size - 1, 2) = "0" + #CRLF$ Or *size >= receptionlen
 
  ;Renvoie du résultat :
  retour.s = PeekS(*reception)
  FreeMemory(*reception)
  ProcedureReturn retour
EndProcedure

Debug Post("http://www.google.fr","")


CompilerIf #PB_Compiler_OS = #PB_OS_Windows
  WSACleanup_()
CompilerEndIf


Je suis pas très satisfait de ma manière de récupérer le résultat de la requête. Mais vue que recv_ est bloquant, j'ai pas eue trop d'idée. Pour le moment je m'arrête de "lire" quand on a complètement remplis le buffer OU que le caractère 0 + #CRLF est reçu (sur le système d'envoie par morceau en HTTP, le dernier morceau contient ça pour dire qu'il a finis de transférer les morceaux).


Haut
 Profil  
 
 Sujet du message: Re: Requête POST (Avec les Sockets)
MessagePosté: Ven 04/Mai/2012 15:52 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 21/Déc/2008 18:39
Messages: 76
Petite correction, le script contenait un bug au niveau du code qui permettait de récupérer une IP à partir d'un nom de domaine.


Haut
 Profil  
 
 Sujet du message: Re: Requête POST (Avec les Sockets)
MessagePosté: Ven 04/Mai/2012 21:00 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 23/Sep/2006 18:32
Messages: 4440
Localisation: Isere
Merci 8)

_________________
ImageLe bonheur est une route...
Pas une destination


Haut
 Profil  
 
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 3 messages ] 

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  
cron

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye