forked from GNUsocial/gnu-social
		
	
		
			
				
	
	
		
			137 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			137 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| declare(strict_types=1);
 | |
| 
 | |
| namespace Enqueue\Stomp;
 | |
| 
 | |
| class StompHeadersEncoder
 | |
| {
 | |
|     const PROPERTY_PREFIX = '_property_';
 | |
|     const TYPE_PREFIX = '_type_';
 | |
|     const TYPE_STRING = 's';
 | |
|     const TYPE_INT = 'i';
 | |
|     const TYPE_FLOAT = 'f';
 | |
|     const TYPE_BOOL = 'b';
 | |
|     const TYPE_NULL = 'n';
 | |
| 
 | |
|     public static function encode(array $headers = [], array $properties = []): array
 | |
|     {
 | |
|         $encodedHeaders = self::doEncode($headers);
 | |
| 
 | |
|         foreach (self::doEncode($properties) as $key => $value) {
 | |
|             $encodedHeaders[self::PROPERTY_PREFIX.$key] = $value;
 | |
|         }
 | |
| 
 | |
|         return $encodedHeaders;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Returns array [[headers], [properties]].
 | |
|      */
 | |
|     public static function decode(array $headers = []): array
 | |
|     {
 | |
|         $encodedHeaders = [];
 | |
|         $encodedProperties = [];
 | |
|         $prefixLength = strlen(self::PROPERTY_PREFIX);
 | |
| 
 | |
|         // separate headers/properties
 | |
|         foreach ($headers as $key => $value) {
 | |
|             if (0 === strpos($key, self::PROPERTY_PREFIX)) {
 | |
|                 $encodedProperties[substr($key, $prefixLength)] = $value;
 | |
|             } else {
 | |
|                 $encodedHeaders[$key] = $value;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         $decodedHeaders = self::doDecode($encodedHeaders);
 | |
|         $decodedProperties = self::doDecode($encodedProperties);
 | |
| 
 | |
|         return [$decodedHeaders, $decodedProperties];
 | |
|     }
 | |
| 
 | |
|     private static function doEncode(array $headers = []): array
 | |
|     {
 | |
|         $encoded = [];
 | |
| 
 | |
|         foreach ($headers as $key => $value) {
 | |
|             switch ($type = gettype($value)) {
 | |
|                 case 'string':
 | |
|                     $encoded[$key] = (string) $value;
 | |
|                     $encoded[self::TYPE_PREFIX.$key] = self::TYPE_STRING;
 | |
| 
 | |
|                     break;
 | |
|                 case 'integer':
 | |
|                     $encoded[$key] = (string) $value;
 | |
|                     $encoded[self::TYPE_PREFIX.$key] = self::TYPE_INT;
 | |
| 
 | |
|                     break;
 | |
|                 case 'double':
 | |
|                     $encoded[$key] = (string) $value;
 | |
|                     $encoded[self::TYPE_PREFIX.$key] = self::TYPE_FLOAT;
 | |
| 
 | |
|                     break;
 | |
|                 case 'NULL':
 | |
|                     $encoded[$key] = '';
 | |
|                     $encoded[self::TYPE_PREFIX.$key] = self::TYPE_NULL;
 | |
| 
 | |
|                     break;
 | |
|                 case 'boolean':
 | |
|                     $encoded[$key] = $value ? 'true' : 'false';
 | |
|                     $encoded[self::TYPE_PREFIX.$key] = self::TYPE_BOOL;
 | |
| 
 | |
|                     break;
 | |
|                 default:
 | |
|                     throw new \LogicException(sprintf('Value type is not valid: "%s"', $type));
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         return $encoded;
 | |
|     }
 | |
| 
 | |
|     private static function doDecode(array $headers = []): array
 | |
|     {
 | |
|         $decoded = [];
 | |
| 
 | |
|         foreach ($headers as $key => $value) {
 | |
|             // skip type header
 | |
|             if (0 === strpos($key, self::TYPE_PREFIX)) {
 | |
|                 continue;
 | |
|             }
 | |
| 
 | |
|             // copy value as is if here is no type header
 | |
|             if (false == array_key_exists(self::TYPE_PREFIX.$key, $headers)) {
 | |
|                 $decoded[$key] = $value;
 | |
| 
 | |
|                 continue;
 | |
|             }
 | |
| 
 | |
|             switch ($headers[self::TYPE_PREFIX.$key]) {
 | |
|                 case self::TYPE_STRING:
 | |
|                     $decoded[$key] = (string) $value;
 | |
| 
 | |
|                     break;
 | |
|                 case self::TYPE_INT:
 | |
|                     $decoded[$key] = (int) $value;
 | |
| 
 | |
|                     break;
 | |
|                 case self::TYPE_FLOAT:
 | |
|                     $decoded[$key] = (float) $value;
 | |
| 
 | |
|                     break;
 | |
|                 case self::TYPE_NULL:
 | |
|                     $decoded[$key] = null;
 | |
| 
 | |
|                     break;
 | |
|                 case self::TYPE_BOOL:
 | |
|                     $decoded[$key] = 'true' === $value;
 | |
| 
 | |
|                     break;
 | |
|                 default:
 | |
|                     throw new \LogicException(sprintf('Type is invalid: "%s"', $value));
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         return $decoded;
 | |
|     }
 | |
| }
 |