Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    120

    Aiuto con regular expression multiline

    Ciao a tutti, devo parsare una risposta di google OAuth2, il formato del testo che ricevo è simile a questo:
    codice:
    HTTP/1.1 200 OK
    Cache-Control: no-cache, no-store, max-age=0, must-revalidate
    Pragma: no-cache
    Expires: Fri, 01 Jan 1990 00:00:00 GMT
    Date: Sat, 14 Sep 2013 09:56:20 GMT
    Content-Type: application/json
    X-Content-Type-Options: nosniff
    X-Frame-Options: SAMEORIGIN
    X-XSS-Protection: 1; mode=block
    Server: GSE
    Alternate-Protocol: 443:quic
    Transfer-Encoding: chunked
    
    c4
    {
    "access_token" : "ya29.AHES6ZSLbAFmae89RRvWJCiFhXbuNkaKwvxTWyOCuQgeZ2k",
    "token_type" : "Bearer",
    "expires_in" : 3600,
    "refresh_token" : "1/DI34dieiTUTKLdstMFDwfeywklpg-_KrhgCWK0v0xFI"
    }
    Devo estrarre solo il body scritto in json ovvero:
    codice:
    {
    "access_token" : "ya29.AHES6ZSLbAFmae89RRvWJCiFhXbuNkaKwvxTWyOCuQgeZ4k",
    "token_type" : "Bearer",
    "expires_in" : 3600,
    "refresh_token" : "1/DI34diaeTUTKLdstMFDwfeywklpg-_KrhgCWK0v0xFI"
    }
    Stavo pensando di utilizzare un lookaround come (?<=) sulla break line, la parte che separa gli headers dal body del messaggio, e poi da li fare qualcosa tipo /({(\"{1}[A-Z_]+"{1}[ :]{1,3}"{1}[A-Z0-9.]+"{1},?)+)/im

    il problema è che non so come gestire il testo multiline, c'è qualcuno che ha la pazienza di aiutarmi, magari aiutandomi a costruire una regex decente?

    Per fare delle prove online consiglio http://www.gskinner.com/RegExr/

    Tanto per la precisione sto usando C# ma non credo conti molto per il mio problema

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    120
    per ora sono riuscito a farla cosi:

    /^[\{\s]+("?[A-Z0-9_\.\/\-]{3,}"?[ :,]{0,3})+/gim

    non è il massimo della vita.. se c'è qualcuno che può migliorarla lo ringrazio

  3. #3
    Uhm... ma perché vuoi usare le regex? La separazione tra header e body è semplicemente due a-capi di fila (che puoi facilmente individuare con String.Find o String.Split).
    Il corpo della richiesta dovrebbe essere già di suo in JSON, per cui dovrai necessariamente girarlo ad un parser JSON, che provvederà da sé a segnalare se il contenuto è malformato (quindi non ha molto senso che lo stia a validare sommariamente il tuo codice con una regex).

    ... l'unica cosa che non mi torna è quel "c4", che non mi pare sia JSON valido (né credo sia previsto dalle specifiche OAuth2). È un errore di copiatura o il response è effettivamente così?
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    120
    Ciao MItaly grazie per la risposta
    purtroppo quel "c4" (che tra l'altro è variabile) non è un errore di battitura, per questo pensavo di usare una regex che mi estrae direttamente quello che mi serve, senza pasticciare con i substring e indexOf, diciamo che ci sono riuscito con la regex di prima, è un pò grezza ma fa il suo lavoro

  5. #5
    Originariamente inviato da Rank-1
    purtroppo quel "c4" (che tra l'altro è variabile) non è un errore di battitura
    Uhm, però se il response deve contenere JSON, quel c4 non è corretto... Tra l'altro, dando un'occhiata al volo, sembra essere la lunghezza del resto della richiesta (c4=196 in esadecimale, ovvero la lunghezza della roba che segue se si considerano i line-ending "alla HTTP" con \r\n), e non vedo un header Content-Length; non è che è un artefatto della libreria con cui recuperi il testo della richiesta? Esattamente come ottieni il testo da processare?
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2004
    Messaggi
    120
    Guarda mi hai fatto insospettire ed effettivamente quel c4 non dovrebbe esserci, sono tornato ad HttpWebRequest che avevo inizialmente abbandonato perchè quando c'era un errore restituiva un generico "400 bad request", questo è il procedimento con cui usciva l'artefatto:

    codice:
                    var client = new TcpClient("accounts.google.com", 443);
    
                    Stream netStream = client.GetStream();
                    SslStream sslStream = new SslStream(netStream);
                    sslStream.AuthenticateAsClient("accounts.google.com");
    
                    string
                        content = "client_id=" + UserInfo["ClientID"];
                        content += "&client_secret=" + UserInfo["ClientSecret"];
                        content += "&refresh_token=" + UserInfo["RefreshToken"];
                        content += "&grant_type=refresh_token";
    
                    byte[] contentAsBytes = Encoding.ASCII.GetBytes(content);
    
                    StringBuilder msg = new StringBuilder();
                    msg.AppendLine("POST /o/oauth2/token HTTP/1.1");
                    msg.AppendLine("Host: accounts.google.com");
                    msg.AppendLine("Content-Type: application/x-www-form-urlencoded");
                    msg.AppendLine("Content-Length: " + contentAsBytes.Length.ToString());
                    msg.AppendLine("");
    
                    byte[] headerAsBytes = Encoding.ASCII.GetBytes(msg.ToString());
                    sslStream.Write(headerAsBytes);
                    sslStream.Write(contentAsBytes);
    
                    byte[] buffer = new byte[2048];
                    int bytes = sslStream.Read(buffer, 0, buffer.Length);
                    string response = Encoding.ASCII.GetString(buffer, 0, bytes);
    
                    sslStream.Close();
                    netStream.Close();
                    client.Close();

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.