6.3.7 Name Compression and Decompression
The server can choose any compression algorithm, as long as the compressed stream can be decompressed using the following name decompression algorithm. When the server compresses the names for the LDAP ping response, if compression fails, the response of the server is documented in "Response to Invalid filter" (section 18.104.22.168). When the server compresses the names for the mailslot ping response, if compression fails, the server does not send any response back to the client.
Name Decompression Algorithm
-- -- On Entry: InputBuffer - a buffer of compressed data, treated as -- bytes -- InputBufferSize - The number of bytes in the InputBuffer -- StringCount - number of strings needed to be -- decompressed from InputBuffer -- Current – Index into the buffer that contains the first -- byte of the compressed strings -- -- On Exit: OutputBuffers - an array of decompressed strings -- Success - Set to TRUE if decompression succeeds, set to -- FALSE if decompression fails. -- Current – Index of the byte in the message succeeding the last -- byte of the compressed string block
SET deCompressedCount = 0 SET localCurrent = 0 FOR i = 1 to StringCount SET dnsNameLen = 0 SET firstLabel = 0 allocate a buffer s[InputBufferSize] WHILE Current < InputBufferSize SET labelSize = InputBuffer[Current] IF labelSize == '\0' THEN s[dnsNameLen] = '\0' OutputBuffers[deCompressedCount] = s deCompressedCount++ Current++ BREAK ELSE IF (labelSize & 0xC0) != 0 THEN Current++ localCurrent = Current + 1 labelSize = InputBuffer[Current] IF labelSize > InputBufferSize THEN Success = FALSE RETURN END IF Current = labelSize CONTINUE ELSE IF (labelSize + Current) >= InputBufferSize THEN Success = FALSE RETURN END IF IF firstLabel == 0 THEN firstLabel = 1 ELSE s[dnsNameLen] = '.' dnsNameLen++ ENDIF
Append substring InputBuffer[Current + 1, Current + labelSize] to s dnsNameLen += labelSize IF localCurrent != 0 THEN Current = localCurrent localCurrent = 0 ELSE Current = Current + 1 + labelSize END IF END IF END WHILE If i <> deCompressedCount THEN Success = FALSE RETURN ENDIF END FOR Success = TRUE RETURN