[b/67851068] fix http code for not found blob (#26)

diff --git a/api.go b/api.go
index 5f5ab0e..11f496d 100644
--- a/api.go
+++ b/api.go
@@ -183,16 +183,23 @@
 	blobId := vars["blobId"]
 	fs, err := a.dbMan.getLocalFSLocation(blobId)
 	if err != nil {
-		a.writeInternalError(w, "BlobId "+blobId+" has no mapping blob file")
+		if err == sql.ErrNoRows {
+			a.writeError(w, http.StatusNotFound, API_ERR_NOT_FOUND, "cannot find the blob")
+		} else {
+			log.Errorf("apiReturnBlobData error from db: %v", err)
+			a.writeInternalError(w, "BlobId "+blobId+" has no mapping blob file")
+		}
 		return
 	}
 	byte, err := ioutil.ReadFile(fs)
 	if err != nil {
+		log.Errorf("apiReturnBlobData error read file: %v, %v", fs, err)
 		a.writeInternalError(w, err.Error())
 		return
 	}
 	_, err = io.Copy(w, bytes.NewReader(byte))
 	if err != nil {
+		log.Errorf("apiReturnBlobData error copy file: %v, %v", fs, err)
 		a.writeInternalError(w, err.Error())
 	}
 	w.Header().Set("Content-Type", headerSteam)
diff --git a/api_test.go b/api_test.go
index 630d993..bcd177a 100644
--- a/api_test.go
+++ b/api_test.go
@@ -369,7 +369,7 @@
 	})
 
 	Context("GET /blobs", func() {
-		It("should get file bytesfrom endpoint", func() {
+		It("should get file bytes from endpoint", func() {
 			// setup http client
 			uri, err := url.Parse(apiTestUrl)
 			Expect(err).Should(Succeed())
@@ -396,6 +396,33 @@
 			Expect(err).Should(Succeed())
 			Expect(string(body)).Should(Equal(randString))
 		})
+
+		It("should get error reponse", func() {
+			// setup http client
+			uri, err := url.Parse(apiTestUrl)
+			Expect(err).Should(Succeed())
+			uri.Path = blobEndpointPath + strconv.Itoa(testCount) + "/" + util.GenerateUUID()
+
+			// set test data
+			testData := [][]interface{}{
+				{"", sql.ErrNoRows},
+				{"", fmt.Errorf("test error")},
+			}
+			expectedCode := []int{
+				http.StatusNotFound,
+				http.StatusInternalServerError,
+			}
+
+			for i, data := range testData {
+				dummyDbMan.localFSLocation = data[0].(string)
+				dummyDbMan.err = data[1].(error)
+				// http get
+				res, err := http.Get(uri.String())
+				Expect(err).Should(Succeed())
+				res.Body.Close()
+				Expect(res.StatusCode).Should(Equal(expectedCode[i]))
+			}
+		})
 	})
 
 	Context("GET /configurations/{configId}", func() {
diff --git a/data.go b/data.go
index e99cba7..558c133 100644
--- a/data.go
+++ b/data.go
@@ -381,25 +381,22 @@
 
 }
 
-func (dbc *dbManager) getLocalFSLocation(blobId string) (localFsLocation string, err error) {
+func (dbc *dbManager) getLocalFSLocation(blobId string) (string, error) {
 
 	log.Debugf("Getting the blob file for blobId {%s}", blobId)
-	rows, err := dbc.getDb().Query("SELECT local_fs_location FROM APID_BLOB_AVAILABLE WHERE id = '" + blobId + "'")
+	localFsLocation := sql.NullString{}
+	err := dbc.getDb().QueryRow("SELECT local_fs_location FROM APID_BLOB_AVAILABLE WHERE id = '" + blobId + "'").Scan(&localFsLocation)
 	if err != nil {
-		log.Errorf("SELECT local_fs_location failed %v", err)
+		if err != sql.ErrNoRows {
+			log.Errorf("SELECT local_fs_location failed %v", err)
+		}
 		return "", err
 	}
-
-	defer rows.Close()
-	for rows.Next() {
-		err = rows.Scan(&localFsLocation)
-		if err != nil {
-			log.Errorf("Scan local_fs_location failed %v", err)
-			return "", err
-		}
-		log.Debugf("Got the blob file {%s} for blobId {%s}", localFsLocation, blobId)
+	if localFsLocation.Valid {
+		return localFsLocation.String, nil
 	}
-	return
+	log.Warnf("local_fs_location for blob %s is null!", blobId)
+	return "", nil
 }
 
 func (dbc *dbManager) loadLsnFromDb() error {
diff --git a/data_test.go b/data_test.go
index 65aace8..43ca0c8 100644
--- a/data_test.go
+++ b/data_test.go
@@ -202,6 +202,9 @@
 			location, err := testDbMan.getLocalFSLocation(testBlobId)
 			Expect(err).Should(Succeed())
 			Expect(location).Should(Equal(testBlobLocalFsPrefix + testBlobId))
+			// negative test
+			location, err = testDbMan.getLocalFSLocation("non-existent")
+			Expect(err).Should(Equal(sql.ErrNoRows))
 		})
 
 		It("should get configuration by Id", func() {
diff --git a/mock_test.go b/mock_test.go
index f8f804a..fb0e06f 100644
--- a/mock_test.go
+++ b/mock_test.go
@@ -63,7 +63,7 @@
 }
 
 func (d *dummyDbManager) getLocalFSLocation(string) (string, error) {
-	return d.localFSLocation, nil
+	return d.localFSLocation, d.err
 }
 
 func (d *dummyDbManager) getConfigById(id string) (*Configuration, error) {