diff --git a/scrapyd/utils.py b/scrapyd/utils.py index aaa6219f..385769c0 100644 --- a/scrapyd/utils.py +++ b/scrapyd/utils.py @@ -1,4 +1,3 @@ -import json import os import sys from subprocess import PIPE, Popen @@ -6,30 +5,12 @@ from urllib.parse import urlsplit from scrapy.utils.misc import load_object -from twisted.web import resource from scrapyd.config import Config from scrapyd.exceptions import RunnerError from scrapyd.sqlite import JsonSqliteDict -class JsonResource(resource.Resource): - json_encoder = json.JSONEncoder() - - def render(self, txrequest): - r = resource.Resource.render(self, txrequest) - return self.encode_object(r, txrequest) - - def encode_object(self, obj, txrequest): - r = "" if obj is None else self.json_encoder.encode(obj) + "\n" - txrequest.setHeader("Content-Type", "application/json") - txrequest.setHeader("Access-Control-Allow-Origin", "*") - txrequest.setHeader("Access-Control-Allow-Methods", "GET, POST, PATCH, PUT, DELETE") - txrequest.setHeader("Access-Control-Allow-Headers", " X-Requested-With") - txrequest.setHeader("Content-Length", str(len(r))) - return r - - class UtilsCache: # array of project name that need to be invalided invalid_cached_projects: ClassVar = [] diff --git a/scrapyd/webservice.py b/scrapyd/webservice.py index 8d695fa9..1ae850e1 100644 --- a/scrapyd/webservice.py +++ b/scrapyd/webservice.py @@ -1,6 +1,7 @@ from __future__ import annotations import functools +import json import sys import traceback import uuid @@ -9,11 +10,11 @@ from io import BytesIO from twisted.python import log -from twisted.web import error, http +from twisted.web import error, http, resource from scrapyd.exceptions import EggNotFoundError, ProjectNotFoundError from scrapyd.jobstorage import job_items_url, job_log_url -from scrapyd.utils import JsonResource, UtilsCache, get_spider_list, native_stringify_dict +from scrapyd.utils import UtilsCache, get_spider_list, native_stringify_dict def param( @@ -52,6 +53,23 @@ def wrapper(self, txrequest, *args, **kwargs): return decorator +class JsonResource(resource.Resource): + json_encoder = json.JSONEncoder() + + def render(self, txrequest): + r = resource.Resource.render(self, txrequest) + return self.encode_object(r, txrequest) + + def encode_object(self, obj, txrequest): + r = "" if obj is None else self.json_encoder.encode(obj) + "\n" + txrequest.setHeader("Content-Type", "application/json") + txrequest.setHeader("Access-Control-Allow-Origin", "*") + txrequest.setHeader("Access-Control-Allow-Methods", "GET, POST, PATCH, PUT, DELETE") + txrequest.setHeader("Access-Control-Allow-Headers", " X-Requested-With") + txrequest.setHeader("Content-Length", str(len(r))) + return r + + class WsResource(JsonResource): def __init__(self, root): JsonResource.__init__(self)