From 08b124dd47e5be365ac843031ed3ea73d1fbc151 Mon Sep 17 00:00:00 2001
From: Lauris BH <lauris@nix.lv>
Date: Sat, 4 Nov 2017 01:23:59 +0200
Subject: [PATCH] Fix API raw requests for commits and tags (#2841)

---
 integrations/api_repo_raw_test.go | 28 ++++++++++++++++++++++++++++
 modules/context/repo.go           |  5 ++++-
 routers/api/v1/api.go             |  2 +-
 3 files changed, 33 insertions(+), 2 deletions(-)
 create mode 100644 integrations/api_repo_raw_test.go

diff --git a/integrations/api_repo_raw_test.go b/integrations/api_repo_raw_test.go
new file mode 100644
index 0000000000..045e812210
--- /dev/null
+++ b/integrations/api_repo_raw_test.go
@@ -0,0 +1,28 @@
+// Copyright 2017 The Gitea Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package integrations
+
+import (
+	"net/http"
+	"testing"
+
+	"code.gitea.io/gitea/models"
+)
+
+func TestAPIReposRaw(t *testing.T) {
+	prepareTestEnv(t)
+	user := models.AssertExistsAndLoadBean(t, &models.User{ID: 2}).(*models.User)
+	// Login as User2.
+	session := loginUser(t, user.Name)
+
+	for _, ref := range [...]string{
+		"master", // Branch
+		"v1.1",   // Tag
+		"65f1bf27bc3bf70f64657658635e66094edbcb4d", // Commit
+	} {
+		req := NewRequestf(t, "GET", "/api/v1/repos/%s/repo1/raw/%s/README.md", user.Name, ref)
+		session.MakeRequest(t, req, http.StatusOK)
+	}
+}
diff --git a/modules/context/repo.go b/modules/context/repo.go
index 8e0c584c82..850b127e59 100644
--- a/modules/context/repo.go
+++ b/modules/context/repo.go
@@ -466,6 +466,9 @@ const (
 	// RepoRefLegacy unknown type, make educated guess and redirect.
 	// for backward compatibility with previous URL scheme
 	RepoRefLegacy RepoRefType = iota
+	// RepoRefAny is for usage where educated guess is needed
+	// but redirect can not be made
+	RepoRefAny
 	// RepoRefBranch branch
 	RepoRefBranch
 	// RepoRefTag tag
@@ -497,7 +500,7 @@ func getRefNameFromPath(ctx *Context, path string, isExist func(string) bool) st
 func getRefName(ctx *Context, pathType RepoRefType) string {
 	path := ctx.Params("*")
 	switch pathType {
-	case RepoRefLegacy:
+	case RepoRefLegacy, RepoRefAny:
 		if refName := getRefName(ctx, RepoRefBranch); len(refName) > 0 {
 			return refName
 		}
diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go
index 79ae5799e3..4331929614 100644
--- a/routers/api/v1/api.go
+++ b/routers/api/v1/api.go
@@ -385,7 +385,7 @@ func RegisterRoutes(m *macaron.Macaron) {
 						Put(bind(api.AddCollaboratorOption{}), repo.AddCollaborator).
 						Delete(repo.DeleteCollaborator)
 				}, reqToken())
-				m.Get("/raw/*", context.RepoRef(), repo.GetRawFile)
+				m.Get("/raw/*", context.RepoRefByType(context.RepoRefAny), repo.GetRawFile)
 				m.Get("/archive/*", repo.GetArchive)
 				m.Combo("/forks").Get(repo.ListForks).
 					Post(reqToken(), bind(api.CreateForkOption{}), repo.CreateFork)