[PATCH] D37282: clangd: Tolerate additional headers

Ben Jackson via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Sat Sep 2 10:14:54 PDT 2017


puremourning added a comment.

So I think this is ready now. Anything more you need from me?



================
Comment at: clangd/JSONRPCDispatcher.cpp:138
                                    bool &IsDone) {
+  unsigned long long ContentLength = 0;
   while (In.good()) {
----------------
puremourning wrote:
> ilya-biryukov wrote:
> > Maybe we could move that variable into loop body by splitting the loop body into multiple parts?
> > Having it outside a loop makes it harder to comprehend the parsing code.
> > Rewriting to something like this would arguably make it easier to read:
> > ```
> > while (In.good()) {
> >   // Read first line
> >   //....
> >   llvm::StringRef LineRef = /*...*/;
> >   // Skip comments
> >   if (LineRef.startsWith("#"))
> >     continue;
> >   
> >   // Read HTTP headers here, reading multiple lines right inside the loop.
> >   unsigned ContentLength = 0;
> >   // ....
> > 
> > 
> >   // Read ContentLength bytes of a message here.
> >   std::vector<char> JSON;
> >   //....
> > }
> > ```
> I'll take a look, sure. Something like...
> 
> ```
> while ( the input stream is good )
> {
>   set len to 0
>   while ( the input stream is good )
>   {
>     read a line into header
>     if the line is a comment, read another line (continue the inner loop !)
> 
>     if header is Content-Length, store the length in len
>     otherwise, if header is empty, we're no longer reading headers, break out of the inner loop
>   }
> 
>   if the input stream is not good, break out of the loop
> 
>   if len is 0, reset the outer loop
> 
>   read len bytes from the stream, 
>   if we read len bytes ok, parse JSON and dispatch to the handlers
> }
> ```
done.


================
Comment at: clangd/JSONRPCDispatcher.cpp:163
+    if (LineRef.consume_front("Content-Length: ")) {
+      llvm::getAsUnsignedInteger(LineRef.trim(), 0, ContentLength);
+      continue;
----------------
ilya-biryukov wrote:
> Maybe log an error if `Content-Length` is specified twice?
OK, though I suspect this would only happen in the tests :)


================
Comment at: clangd/JSONRPCDispatcher.cpp:167
+      // It's another header, ignore it.
       continue;
+    } else {
----------------
ilya-biryukov wrote:
> Maybe log the skipped header?
I think this would just be noise for conforming clients which send the (legitimate) Content-Type header. We could of course special case this, but I'm not sure the extra logging would be all that useful.


https://reviews.llvm.org/D37282





More information about the cfe-commits mailing list