Git Product home page Git Product logo

Comments (9)

dhubler avatar dhubler commented on July 28, 2024

from restconf.

dhubler avatar dhubler commented on July 28, 2024

from restconf.

dhubler avatar dhubler commented on July 28, 2024

from restconf.

sebastien-guay avatar sebastien-guay commented on July 28, 2024

I tried your example and it works as expected. I debugged your example and compared the call stack with mine and here is what I see.

With your example we execute the line err = outputSel.LastErr in the else.

In my case we enter in if a.Input() != nil but not the next if input, err = readInput(r, a); err != nil .
Then we execute this last block where sendOutput calls fmt.Fprintf at line 198. This is calling WriteHeader eventually and set the 200 code. Then the handleErr is called but setting the error code is not allowed.

if outputSel := sel.Action(input); !outputSel.IsNil() && a.Output() != nil {
	w.Header().Set("Content-Type", mime.TypeByExtension(".json"))
	if err = sendOutput(w, outputSel, a); err != nil {
		handleErr(err, r, w)
		return
	}
case "POST":
			if meta.IsAction(sel.Meta()) {
				// RPC
				a := sel.Meta().(*meta.Rpc)
				var input node.Node
				if a.Input() != nil {
					if input, err = readInput(r, a); err != nil {
						handleErr(err, r, w)
						return
					}
				}
				if outputSel := sel.Action(input); !outputSel.IsNil() && a.Output() != nil {
					w.Header().Set("Content-Type", mime.TypeByExtension(".json"))
					if err = sendOutput(w, outputSel, a); err != nil {
						handleErr(err, r, w)
						return
					}
				} else {
					err = outputSel.LastErr
				}
			} else {
				// CRUD - Insert
				payload = nodeutil.ReadJSONIO(r.Body)
				err = sel.InsertFrom(payload).LastErr
			}

Now I'm trying to understand why we don't have the same call stack.

from restconf.

sebastien-guay avatar sebastien-guay commented on July 28, 2024

The difference with my request to the server is that my curl command has data specified with the "-d" option. That is why we have a different call stack and it seems we have an issue in that case.

I'm looking at the code and I think this block should be in the if a.Input() != nil:

if outputSel := sel.Action(input); !outputSel.IsNil() && a.Output() != nil {
	w.Header().Set("Content-Type", mime.TypeByExtension(".json"))
	if err = sendOutput(w, outputSel, a); err != nil {
		handleErr(err, r, w)
		return
	}

sel.Action(input) uses input which is retrieved above by if input, err = readInput(r, a); err != ni

Currenytly if outputSel := sel.Action(input); !outputSel.IsNil() && a.Output() != nil and if a.Input() != nil are at the same level and they should not.

from restconf.

dhubler avatar dhubler commented on July 28, 2024

If i'm reading you correctly, we need to check outputSel.LastErr before going into that block where we potentially starting writing data in response body. I'll have to verify this later this evening but it's a good theory.

BTW: Even before this, I wanted get rid of LastErr and just return selection and err like normal go code. the poor decision to use LastErr thing dates back before I knew better.

from restconf.

sebastien-guay avatar sebastien-guay commented on July 28, 2024

Just calling handleErr(outputSel.LastErr, r, w) is sending 401 and the response body correctly. sendoutput does not seem to be required.

from restconf.

dhubler avatar dhubler commented on July 28, 2024

from restconf.

sebastien-guay avatar sebastien-guay commented on July 28, 2024

just pushed the fix to master. I was able to verified origin error and then verify it disappears w/the fix. thanks for reporting!

On Thu, Mar 23, 2023 at 12:49 PM sguay @.> wrote: Just calling handleErr(outputSel.LastErr, r, w) is sending 401 and the response body correctly. sendoutput does not seem to be required. — Reply to this email directly, view it on GitHub <#27 (comment)>, or unsubscribe https://github.com/notifications/unsubscribe-auth/AAACA7XDXI3OVHQOJ3OD7ODW5R5H7ANCNFSM6AAAAAAWEGTD3U . You are receiving this because you commented.Message ID: @.>

Thanks a lot!

from restconf.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.