Blame view

sources/3rdparty/guzzle/parser/Guzzle/Parser/Message/MessageParser.php 3.25 KB
6d9380f96   Cédric Dupont   Update sources OC...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
  <?php
  
  namespace Guzzle\Parser\Message;
  
  /**
   * Default request and response parser used by Guzzle. Optimized for speed.
   */
  class MessageParser extends AbstractMessageParser
  {
      public function parseRequest($message)
      {
          if (!$message) {
              return false;
          }
  
          $parts = $this->parseMessage($message);
  
          // Parse the protocol and protocol version
          if (isset($parts['start_line'][2])) {
              $startParts = explode('/', $parts['start_line'][2]);
              $protocol = strtoupper($startParts[0]);
              $version = isset($startParts[1]) ? $startParts[1] : '1.1';
          } else {
              $protocol = 'HTTP';
              $version = '1.1';
          }
  
          $parsed = array(
              'method'   => strtoupper($parts['start_line'][0]),
              'protocol' => $protocol,
              'version'  => $version,
              'headers'  => $parts['headers'],
              'body'     => $parts['body']
          );
  
          $parsed['request_url'] = $this->getUrlPartsFromMessage($parts['start_line'][1], $parsed);
  
          return $parsed;
      }
  
      public function parseResponse($message)
      {
          if (!$message) {
              return false;
          }
  
          $parts = $this->parseMessage($message);
          list($protocol, $version) = explode('/', trim($parts['start_line'][0]));
  
          return array(
              'protocol'      => $protocol,
              'version'       => $version,
              'code'          => $parts['start_line'][1],
              'reason_phrase' => isset($parts['start_line'][2]) ? $parts['start_line'][2] : '',
              'headers'       => $parts['headers'],
              'body'          => $parts['body']
          );
      }
  
      /**
       * Parse a message into parts
       *
       * @param string $message Message to parse
       *
       * @return array
       */
      protected function parseMessage($message)
      {
          $startLine = null;
          $headers = array();
          $body = '';
  
          // Iterate over each line in the message, accounting for line endings
          $lines = preg_split('/(\\r?\
  )/', $message, -1, PREG_SPLIT_DELIM_CAPTURE);
          for ($i = 0, $totalLines = count($lines); $i < $totalLines; $i += 2) {
  
              $line = $lines[$i];
  
              // If two line breaks were encountered, then this is the end of body
              if (empty($line)) {
                  if ($i < $totalLines - 1) {
                      $body = implode('', array_slice($lines, $i + 2));
                  }
                  break;
              }
  
              // Parse message headers
              if (!$startLine) {
                  $startLine = explode(' ', $line, 3);
              } elseif (strpos($line, ':')) {
                  $parts = explode(':', $line, 2);
                  $key = trim($parts[0]);
                  $value = isset($parts[1]) ? trim($parts[1]) : '';
                  if (!isset($headers[$key])) {
                      $headers[$key] = $value;
                  } elseif (!is_array($headers[$key])) {
                      $headers[$key] = array($headers[$key], $value);
                  } else {
                      $headers[$key][] = $value;
                  }
              }
          }
  
          return array(
              'start_line' => $startLine,
              'headers'    => $headers,
              'body'       => $body
          );
      }
  }