]> git.ipfire.org Git - thirdparty/git.git/blobdiff - connect.c
Documentation/RelNotes: fix a typo in 2.28's relnotes
[thirdparty/git.git] / connect.c
index 66650ff2d3349213ac34a9600516d656063c97c9..e0d5b9fee05fc5db4c329d4825600020dce8910a 100644 (file)
--- a/connect.c
+++ b/connect.c
@@ -142,6 +142,7 @@ enum protocol_version discover_version(struct packet_reader *reader)
                die_initial_contact(0);
        case PACKET_READ_FLUSH:
        case PACKET_READ_DELIM:
+       case PACKET_READ_RESPONSE_END:
                version = protocol_v0;
                break;
        case PACKET_READ_NORMAL:
@@ -342,6 +343,7 @@ struct ref **get_remote_heads(struct packet_reader *reader,
                        state = EXPECTING_DONE;
                        break;
                case PACKET_READ_DELIM:
+               case PACKET_READ_RESPONSE_END:
                        die(_("invalid packet"));
                }
 
@@ -439,10 +441,21 @@ out:
        return ret;
 }
 
+void check_stateless_delimiter(int stateless_rpc,
+                             struct packet_reader *reader,
+                             const char *error)
+{
+       if (!stateless_rpc)
+               return; /* not in stateless mode, no delimiter expected */
+       if (packet_reader_read(reader) != PACKET_READ_RESPONSE_END)
+               die("%s", error);
+}
+
 struct ref **get_remote_refs(int fd_out, struct packet_reader *reader,
                             struct ref **list, int for_push,
                             const struct argv_array *ref_prefixes,
-                            const struct string_list *server_options)
+                            const struct string_list *server_options,
+                            int stateless_rpc)
 {
        int i;
        const char *hash_name;
@@ -460,6 +473,8 @@ struct ref **get_remote_refs(int fd_out, struct packet_reader *reader,
                        die(_("unknown object format '%s' specified by server"), hash_name);
                reader->hash_algo = &hash_algos[hash_algo];
                packet_write_fmt(fd_out, "object-format=%s", reader->hash_algo->name);
+       } else {
+               reader->hash_algo = &hash_algos[GIT_HASH_SHA1];
        }
 
        if (server_options && server_options->nr &&
@@ -488,6 +503,9 @@ struct ref **get_remote_refs(int fd_out, struct packet_reader *reader,
        if (reader->status != PACKET_READ_FLUSH)
                die(_("expected flush after ref listing"));
 
+       check_stateless_delimiter(stateless_rpc, reader,
+                                 _("expected response end packet after ref listing"));
+
        return list;
 }