GUACAMOLE-422: Break handshake out into separate function; NULL out timezone when not received.
diff --git a/src/libguac/user-handlers.c b/src/libguac/user-handlers.c
index f1d937e..cef6c14 100644
--- a/src/libguac/user-handlers.c
+++ b/src/libguac/user-handlers.c
@@ -662,6 +662,9 @@
     if (argc > 0 && strcmp(argv[0], ""))
         user->info.timezone = (const char*) strdup(argv[0]);
     
+    else
+        user->info.timezone = NULL;
+    
     return 0;
     
 }
diff --git a/src/libguac/user-handshake.c b/src/libguac/user-handshake.c
index 26b42a7..31f9d9f 100644
--- a/src/libguac/user-handshake.c
+++ b/src/libguac/user-handshake.c
@@ -230,6 +230,62 @@
 
 }
 
+/**
+ * This function loops through the received instructions during the handshake
+ * with the client attempting to join the connection, and runs the handlers
+ * for each of the opcodes, ending when the connect instruction is received.
+ * Returns zero if the handshake completes successfully with the connect opcode,
+ * or a non-zero value if an error occurs.
+ * 
+ * @param user
+ *     The guac_user attempting to join the connection.
+ * 
+ * @param parser
+ *     The parser used to examine the received data.
+ * 
+ * @param usec_timeout
+ *     The timeout, in microseconds, for reading the instructions.
+ * 
+ * @return
+ *     Zero if the handshake completes successfully with the connect opcode,
+ *     or non-zero if an error occurs.
+ */
+static int __guac_user_handshake(guac_user* user, guac_parser* parser,
+        int usec_timeout) {
+    
+    guac_socket* socket = user->socket;
+    
+    /* Handle each of the opcodes. */
+    while (guac_parser_read(parser, socket, usec_timeout) == 0) {
+        
+        /* If we receive the connect opcode, we're done. */
+        if (strcmp(parser->opcode, "connect") == 0)
+            return 0;
+        
+        guac_user_log(user, GUAC_LOG_DEBUG, "Processing instruction: %s",
+                parser->opcode);
+        
+        /* Run instruction handler for opcode with arguments. */
+        if (__guac_user_call_opcode_handler(__guac_handshake_handler_map, user,
+                parser->opcode, parser->argc, parser->argv)) {
+            
+            guac_user_log_handshake_failure(user);
+            guac_user_log_guac_error(user, GUAC_LOG_DEBUG,
+                    "Error handling handling opcode during handshake.");
+            guac_user_log(user, GUAC_LOG_DEBUG, "Failed opcode: %s",
+                    parser->opcode);
+
+            guac_parser_free(parser);
+            return 1;
+            
+        }
+        
+    }
+    
+    /* If we get here something has gone wrong. */
+    return 1;
+}
+
 int guac_user_handle_connection(guac_user* user, int usec_timeout) {
 
     guac_socket* socket = user->socket;
@@ -254,38 +310,12 @@
 
     guac_parser* parser = guac_parser_alloc();
 
-    /* Handle each of the opcodes. */
-    while (1) {
-        if (guac_parser_read(parser, socket, usec_timeout)) {
-            guac_user_log_handshake_failure(user);
-            guac_user_log_guac_error(user, GUAC_LOG_DEBUG,
-                    "Error while reading opcode instruction.");
-            guac_parser_free(parser);
-            return 1;
-        }
-        
-        /* If we receive the connect opcode, we're done. */
-        if (strcmp(parser->opcode, "connect") == 0)
-            break;
-        
-        guac_user_log(user, GUAC_LOG_DEBUG, "Processing instruction: %s",
-                parser->opcode);
-        
-        /* Run instruction handler for opcode with arguments. */
-        if (__guac_user_call_opcode_handler(__guac_handshake_handler_map, user,
-                parser->opcode, parser->argc, parser->argv)) {
-            
-            guac_user_log_handshake_failure(user);
-            guac_user_log_guac_error(user, GUAC_LOG_DEBUG,
-                    "Error handling handling opcode during handshake.");
-            guac_user_log(user, GUAC_LOG_DEBUG, "Failed opcode: %s",
-                    parser->opcode);
-
-            guac_parser_free(parser);
-            return 1;
-            
-        }
-        
+    /* Perform the handshake with the client. */
+    if (__guac_user_handshake(user, parser, usec_timeout)) {
+        guac_user_log_handshake_failure(user);
+        guac_user_log_guac_error(user, GUAC_LOG_DEBUG,
+                "Error while reading opcode instruction.");
+        guac_parser_free(parser);
     }
 
     /* Acknowledge connection availability */